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

sh环境下Bash ${!variable}等效实现 解决Bad substitution报错

问题根源

你遇到的Bad substitution错误是因为${!variable}、${-variable}都属于Bash专属语法,POSIX标准的sh shell不支持这类间接变量引用写法。

sh环境下${!variable}的等效写法

POSIX sh中实现间接变量引用的标准方法是使用eval命令,写法如下:

eval "value=\$$variable"

执行后$value就等于${!variable}的返回值,也就是当变量名存储在$variable中时,取出该变量对应的值。

修正后的完整脚本片段

for conffile in $(ls -1 "${KSCFGISOLINUXFILESLOCATION}"); do
  for variable in CFG_CRYPT CFG_DISK CFG_DNS CFG_DOMAIN CFG_GATEWAY CFG_HOSTNAME CFG_IFACE CFG_IP CFG_NETMASK CFG_USERKEY CFG_ACTION CFG_TITLE CFG_INITURL CFG_OSVERS CFG_ISOBASE CFG_ISOPATH CFG_ISOPATH_SIMPLE SHI_BOOT_URL DEBUG UUID LOGDIR WWWDIR OSINITDIR WKGDIR; do
    SUBSTITUTIONCOUNT=$( grep -c "%%${variable}%%" "${conffile}" | cut -f1 -d" " )
    if [ "${SUBSTITUTIONCOUNT}" -gt 0 ]; then
      # 用eval实现sh兼容的间接变量取值
      eval "var_value=\$$variable"
      echo "Modifying ${variable} in ${SUBSTITUTIONCOUNT} places" 
      echo "Updating ${variable} in ${conffile} to ${var_value}" 
      sed -i "s^%%${variable}%%^${var_value}^g" "${conffile}" 2>&1
    fi
  done
done

注意事项

  • 使用eval时需要确保遍历的variable列表是可控的固定变量名,不要传入外部不可信输入,避免出现命令注入风险
  • 修正脚本额外给所有变量加了双引号包裹,避免路径或变量值带空格时出现解析异常

内容的提问来源于stack exchange,提问作者Danilo Patrucco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:54:03