You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Solaris下KShell中字符串表达式报错求助:${DATE:4:2}替换错误

嘿,这个问题我太清楚了!你的这段代码在Solaris的KShell里跑崩,主要是两个核心问题,我给你掰扯明白:

问题原因分析

1. KShell版本不支持你用的参数扩展语法

Solaris默认自带的KShell是ksh88,而你写的${DATE:4:2}这种从变量里按偏移量截取子串的语法,是ksh93、bash这类后续更新的shell版本才支持的特性。ksh88根本不认这种写法,直接就抛出了wrong substitution的错误。

2. 命令行的变量作用域和执行顺序有坑

就算语法能支持,你把变量赋值、命令替换和echo挤在同一行的写法也有问题:当你写DATE=20180420 MONTH=expr ... echo ...时,DATE和MONTH的赋值只作用于echo命令的子环境,但命令替换里的expr是在当前shell环境执行的,这时候DATE变量还没在当前环境生效,最后expr拿到的是空值,结果也不对。

可行的解决方案

给你几个能直接用的修改方案:

  • 方案一:用ksh88支持的expr命令截取
    把代码改成ksh88能识别的写法,拆成多行更清晰:

    DATE=20180420
    MONTH=`expr substr $DATE 5 2`
    echo MONTH=$MONTH
    

    这里substr $DATE 5 2表示从第5个字符开始截取2个字符(因为expr的substr是从1开始计数的,刚好对应你原来的4偏移量需求)。

  • 方案二:切换到ksh93执行
    如果你的Solaris系统安装了ksh93(通常路径是/usr/bin/ksh93),直接用它来运行脚本,就能支持${DATE:4:2}的语法了,记得用分号分隔命令保证执行顺序:

    DATE=20180420; MONTH=${DATE:4:2}; echo MONTH=$MONTH
    
  • 方案三:用cut命令辅助截取
    也可以通过管道和cut命令实现子串截取,兼容性拉满:

    DATE=20180420
    MONTH=`echo $DATE | cut -c5-6`
    echo MONTH=$MONTH
    

    cut -c5-6表示截取第5到第6个字符,和你的需求完全匹配。

内容的提问来源于stack exchange,提问作者JLLMNCHR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:19:14