You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]#

错误原因分析

  1. 赋值方向完全颠倒:JKT分支中把数组元素写在=左侧、变量名写在右侧,Shell会将左侧字符串当作系统命令执行,直接触发"command not found"错误。
  2. 赋值语法违规:所有赋值语句的=前后添加了空格,Shell中变量赋值要求=两端不能有空格,否则会被解析为命令与参数。
  3. 分支语法错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 19:24:28