IBM i QSH中Shell脚本变量解析异常问题求助
IBM i QSH脚本变量解析失败问题解决
问题根源
你遇到的不是大括号导致的变量解析问题,核心原因是脚本文件的CCSID编码与QSH当前使用的CCSID不兼容:
报错信息里的CCSID 420 is not supported. qsh is initialized for CCSID 37明确说明,脚本采用的是CCSID 420(阿拉伯语编码),而QSH会话使用的是CCSID 37(EBCDIC美国英语编码),编码不匹配导致脚本中的特殊字符(引号、变量标识符)被解析为乱码,最终JAVA_HOME变量被错误识别为آJAVA_HOMEآ,系统找不到对应命令。
解决步骤
1. 转换脚本文件的CCSID到QSH兼容编码
如果脚本存储在IBM i物理文件中,执行以下命令修改成员的CCSID:
CHGPFM FILE(你的库名/文件名) MBR(setWebServiceProperties.sh) CCSID(37)
如果脚本在IFS目录下,用CHGATR命令修改属性:
CHGATR OBJ('/你的脚本路径/setWebServiceProperties.sh') ATR(*CCSID) VALUE(37)
2. 修正脚本换行符格式
Windows风格的CRLF换行符在QSH中可能引发解析异常,可通过QSH自带的vi编辑器重新保存脚本,或用dos2unix工具转换(若已安装):
dos2unix setWebServiceProperties.sh
3. 验证脚本内容无乱码
用cat -v命令查看脚本,确认变量引用(如${JAVA_HOME})、引号等字符无乱码或隐藏字符:
cat -v setWebServiceProperties.sh
4. 明确指定Shell解释器(可选)
在脚本第一行添加解释器声明,避免QSH使用默认的不兼容解释器:
#!/usr/bin/sh JAVA_HOME="/QOpenSys/QIBM/ProdData/JavaVM/jdk70/32bit" # 以下为原脚本剩余内容
5. 临时切换QSH会话CCSID(应急方案)
若暂时无法修改脚本编码,可启动QSH时指定兼容的CCSID:
STRQSH CCSID(420)
此方法仅对当前会话有效,长期建议优先修改脚本编码。
验证操作
完成上述修改后,重新执行脚本:
./setWebServiceProperties.sh -server WSERVICE1 -service myservice -userid *AUTHENTICATED
内容的提问来源于stack exchange,提问作者Abalode
相关产品推荐
相关产品推荐

