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
相关产品推荐
相关产品推荐

