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=$MONTHcut -c5-6表示截取第5到第6个字符,和你的需求完全匹配。
内容的提问来源于stack exchange,提问作者JLLMNCHR

