QNX4 ksh86中shell脚本case语句//*)报语法错误的原因及适配方法
报错原因
QNX4系统搭载的ksh86是非常早期的Korn Shell移植版本,保留了史前Unix shell的历史兼容逻辑:在V7 Unix之前的部分shell实现中,//是行注释的起始标记,功能和后来成为POSIX标准的#注释一致。ksh86未完全移除这一旧解析规则,当case分支的匹配模式行以//开头时,解释器会直接将整行判定为注释丢弃,导致case结构缺失对应的匹配条目,后续的;;、esac等语法标记无法与前置的case语句正确配对,最终抛出语法错误:
./fixinc.sh[90]: syntax error
原脚本中该分支是为兼容Apollo域OS的特殊双斜杠开头路径格式设计,写法在符合POSIX标准的现代shell、新版ksh/bash中均合法,仅在这类保留上古解析规则的老shell上触发问题。
修复方法
核心修改思路是避免case匹配模式直接以连续的//开头,绕开老ksh的注释解析bug,同时保证模式匹配效果和原逻辑完全一致。
将原代码中//*)分支替换为使用字符集包裹第二个斜杠的等价写法即可,修改后的完整代码片段如下:
PWDCMD=pwd case "`$PWDCMD`" in /[\/]*) # On an Apollo, discard everything before `/usr'. PWDCMD="eval pwd | sed -e 's,.*/usr/,/usr/,'" ;; esac
该写法的匹配逻辑与原//*)完全等价:第一个斜杠匹配路径首字符,[\/]匹配第二个斜杠,后续*匹配任意长度的剩余路径,所有POSIX兼容shell均能正确识别该模式,既可以在QNX4的老ksh86下正常解析运行,也不会破坏原脚本对Apollo系统的兼容逻辑。
内容的提问来源于stack exchange,提问作者Alexander G.
相关产品推荐
相关产品推荐

