Shell脚本传入两个参数时第二个参数获取为空问题排查
问题成因
Shell脚本无法读取第二个位置参数,通常由三类原因导致:
- 脚本赋值逻辑前存在干扰命令:如果
branche=$2赋值行之前存在shift、set --类操作,会直接修改位置参数列表,导致$2被置空。 - 脚本文件格式异常:如果脚本在Windows环境编辑后上传到服务器,换行符为Windows格式的
\r\n(CRLF),而非Unix标准的\n(LF),多余的回车符会干扰变量解析、输出,看起来像是变量值为空。 - 传参逻辑异常:如果是调度作业执行时出现问题,大概率是调度工具(从变量名判断为Control-M)的作业命令配置错误,比如参数间用全角空格/不可见控制字符分隔、第二个参数被多余转义符/引号包裹、参数被换行截断;手动执行时出现该问题则是命令行中两个参数的分隔符不是半角空格导致。
排查与解决步骤
按以下顺序逐步排查即可定位问题:
- 先验证脚本本身逻辑
直接在服务器命令行执行标准传参命令,排除调度配置干扰:
如果手动执行能正常输出/XDRI_RV_LOAD.KSH 20220617 rv_tiersTEST 2 : rv_tiers,直接检查调度作业的命令配置:确认脚本路径、两个参数之间用半角空格分隔,第二个参数rv_tiers没有被多余的引号、转义符包裹,也没有被换行截断。 - 排查脚本前置干扰逻辑
如果手动执行也无法拿到第二个参数,打开脚本检查date_ctrlm=$1、branche=$2两行之前的所有代码,删除多余的shift、set --类位置参数修改命令,或者把参数赋值逻辑移到这类命令之前执行。 - 修复文件格式问题
执行命令检查脚本换行符格式:
如果输出包含file /XDRI_RV_LOAD.KSHwith CRLF line terminators,说明是Windows格式文件,执行命令转换为Unix格式即可:
若服务器没有dos2unix /XDRI_RV_LOAD.KSHdos2unix工具,也可以用sed替换多余回车符:sed -i 's/\r$//' /XDRI_RV_LOAD.KSH - 开启调试日志快速定位
如果以上步骤都没解决问题,在脚本开头shebang行下方加set -x开启执行trace,重新运行脚本就能看到每一步的参数解析、变量赋值过程,直接定位根因:#!/bin/ksh set -x date_ctrlm=$1 branche=$2 echo "TEST 1 : $date_ctrlm" echo "TEST 2 : $branche"
注:echo输出时建议把变量放到引号内部,避免变量包含空格、通配符时被Shell二次解析,属于编码规范优化,不是本次故障的诱因。
内容的提问来源于stack exchange,提问作者SA2018
相关产品推荐
相关产品推荐

