错误替换 bash 等效于 sh

bad substitution bash equivalent in sh

我在 Bash 中有这个脚本:

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
      echo "Modifying ${variable} in ${SUBSTITUTIONCOUNT} places" 
      echo "Updating ${variable} in ${conffile} to ${-variable}" 
      sed -i "s^%%${variable}%%^${-variable}^g" ${conffile} 2>&1
    fi
  done
done

当我在 sh 运行 中 shell 它抛出以下错误:

/tmp/wf_script-JI1La1/rhel84isoinstall.sh: 158: /tmp/wf_script-JI1La1/rhel84isoinstall.sh: Bad substitution

问题是我试图在 sh shell

中使用 bash 命令

sh 中的 ${!variable} 相当于什么?

我试过 ${-variable} 但这是一个错误的命令。

Sh 和 Dash 不支持此功能。

通过正确查看 shebang 并避免 sh myscript(参见 Why does my bash code fail when I run it with sh?

,确保脚本始终以 bash 运行

或者,使用eval将其重写为sh,但要注意代码注入:

#!/bin/sh
name=PATH
eval "echo \"$$name\""