Shell脚本按输入选数组提取元素至变量报错,求解决方案
Shell脚本数组元素赋值报错修复方案
问题背景
需求为根据用户输入选择对应xGW数组(可选值:JKT、SBY、xGW11_YGY、xGW12_YGY),将数组元素分别赋值给变量a、b、c、d,作为后续命令的输入。
原脚本代码:
read -p "Enter xGW need to be binding = JKT|SBY|xGW11_YGY|xGW12_YGY: " xGW JKT=(saegw1.jkt.node 167.162.162.134 saegw1.jkt 167.162.162.137) SBY=(saegw1.sby.node 167.162.179.128 saegw1.sby 167.162.179.131) xGW11_YGY=(vsaegw11.ygy.node 167.162.191.59 vsaegw11.ygy 167.162.191.30) xGW12_YGY=(vsaegw12.ygy.node 167.162.188.64 vsaegw12.ygy 167.162.188.88) if [[ $xGW = "JKT" ]] then echo ${JKT[@]} ${JKT[0]} = a ${JKT[1]} = b ${JKT[2]} = c ${JKT[3]} = d echo $a elif [[ $xGW = "SBY" ]] then a = ${SBY[0]} b = ${SBY[1]} c = ${SBY[2]} d = ${SBY[3]} elif [[ $xGW = "xGW11_YGY" ]] then a = ${xGW11_YGY[0]} b = ${xGW11_YGY[1]} c = ${xGW11_YGY[2]} d = ${xGW11_YGY[3]} else [[ $xGW = "xGW12_YGY" ]] a = ${xGW12_YGY[0]} b = ${xGW12_YGY[1]} c = ${xGW12_YGY[2]} d = ${xGW12_YGY[3]} fi
输入JKT时的报错信息:
[root@cacti]# ./binding.sh Enter xGW need to be binding = JKT|SBY|xGW11_YGY|xGW12_YGY: JKT saegw1.jkt.node 167.162.162.134 saegw1.jkt 167.162.162.137 ./binding.sh: line 21: saegw1.jkt.node: command not found ./binding.sh: line 22: 167.162.162.134: command not found ./binding.sh: line 23: saegw1.jkt: command not found ./binding.sh: line 24: 167.162.162.137: command not found JKT You have new mail in /var/spool/mail/root [root@cacti]#
错误原因分析
- 赋值方向完全颠倒:JKT分支中把数组元素写在
=左侧、变量名写在右侧,Shell会将左侧字符串当作系统命令执行,直接触发"command not found"错误。 - 赋值语法违规:所有赋值语句的
=前后添加了空格,Shell中变量赋值要求=两端不能有空格,否则会被解析为命令与参数。 - 分支语法错误:
else关键字后不能跟条件判断,原脚本的else [[ $xGW = "xGW12_YGY" ]]属于语法错误。
修正后的脚本
read -p "Enter xGW need to be binding = JKT|SBY|xGW11_YGY|xGW12_YGY: " xGW JKT=(saegw1.jkt.node 167.162.162.134 saegw1.jkt 167.162.162.137) SBY=(saegw1.sby.node 167.162.179.128 saegw1.sby 167.162.179.131) xGW11_YGY=(vsaegw11.ygy.node 167.162.191.59 vsaegw11.ygy 167.162.191.30) xGW12_YGY=(vsaegw12.ygy.node 167.162.188.64 vsaegw12.ygy 167.162.188.88) if [[ $xGW = "JKT" ]] then a=${JKT[0]} b=${JKT[1]} c=${JKT[2]} d=${JKT[3]} elif [[ $xGW = "SBY" ]] then a=${SBY[0]} b=${SBY[1]} c=${SBY[2]} d=${SBY[3]} elif [[ $xGW = "xGW11_YGY" ]] then a=${xGW11_YGY[0]} b=${xGW11_YGY[1]} c=${xGW11_YGY[2]} d=${xGW11_YGY[3]} elif [[ $xGW = "xGW12_YGY" ]] then a=${xGW12_YGY[0]} b=${xGW12_YGY[1]} c=${xGW12_YGY[2]} d=${xGW12_YGY[3]} else echo "Invalid input! Please enter one of JKT|SBY|xGW11_YGY|xGW12_YGY" exit 1 fi # 可选:验证赋值结果 echo "a=$a, b=$b, c=$c, d=$d"
关键修改说明
- 修正JKT分支的赋值方向,将变量名放在
=左侧,数组元素值放在右侧。 - 移除所有赋值语句中
=两边的空格,符合Shell变量赋值语法规范。 - 将原错误的
else分支改为elif [[ $xGW = "xGW12_YGY" ]],新增独立else分支处理无效输入,提升脚本健壮性。 - 可选添加赋值结果验证输出,方便快速确认变量是否正确赋值。
内容的提问来源于stack exchange,提问作者Wolverine adamantium
相关产品推荐
相关产品推荐

