BASH使用双变量$ - 坏替换

时间:2014-01-16 07:51:36

标签: bash variables substitution

从下面的代码中,在变量'yy'上用x替换'critical_'后,如何使'zz'的值变为500

xab123=500

yy="critical_ab123"
zz=${"${yy//critical_/x}"}

echo $zz

而不是结果,有一个错误:

line 8: ${"${yy//critical_/x}"}: bad substitution

感谢 ADI

2 个答案:

答案 0 :(得分:7)

可能是这样的:

xab123=500
yy="critical_ab123"
zz="${yy//critical_/x}"
echo ${!zz}
500

答案 1 :(得分:1)

一个有趣的用法是当你调用bash函数时,你可以对传入的参数使用间接。然后,你可以使用命令替换以嵌套的方式嵌套对间接函数的调用。

deref() { echo "${!1}"; }

aa="bb"
bb="cc"
cc="hello"

echo "$(deref aa)" # bb
echo "$(deref "$(deref aa)")" # cc
echo "$(deref "$(deref "$(deref aa)")")" # hello

以下deref用于解决OP的问题:

deref() { echo "${!1}"; }

xab123="500"
yy="critical_ab123"
zz="$(deref "${yy//critical_/x}")"

echo "$zz" # Outputs: 500

基于@ charles-duffy的应用编辑评论:

  1. 免责声明:读者要注意,这种方法中使用的命令替换会产生性能影响(FIFO创建,子shell的fork(),read()和wait()。
  2. 添加了引号以防止有损扩张,即echo "$zz"优于echo $zz
  3. 使用符合POSIX的函数声明语法,即将function deref { echo "${!1}" ; }替换为deref() { echo "${!1}" ; }
  4. 更正了每个引用上下文的引用问题