bash变量的间接引用
2018-12-30 本文已影响0人
CodingCode
今天碰到一个问题,如何打印出传递给bash的所有参数:
本来想用一个for循环实现如下效果:
$ test.sh aa bb
ARGS[#]=3
ARGS[0]=test.sh
ARGS[1]=aa
ARGS[2]=bb
脚本test.sh怎么写呢?
echo "ARGS[#]=$#"
for ((i = 1; i <= $#; i++ )); do
echo "ARGS[${i}]=[${i}]"
done
循环体里面既要打印参数序号,又要打印对应的参数值,可怎么办呢?上述代码会打印:
ARGS[0]=0
ARGS[1]=1
ARGS[2]=2
因为后面的值,我们其实需要的是二次引用,类似{i}}格式,但是这个语法bash根本不认:
ENTRY ARGS[${i}]=[${${i}}]: bad substitution
Bash恰好提供了"变量的间接引用"功能,正好满足这种需求。Bash使用叹号!(exclamation mark)来表明这是一个间接引用(indirect reference), 语法格式就是:
${!variable}
其含义是显示变量variable的值所对应的变量值。例如:
#!/bin/bash
AA=BB
BB=CC
echo ${AA}
echo ${!AA}
运行脚本得到:
BB
CC
因为"${!AA}"等价于"${BB}",所以最后显示"CC"。
回来开头的遍历参数的问题:
echo "ARGS[#]=$#"
for ((i = 1; i <= $#; i++ )); do
echo "ARGS[${i}]=[${!i}]"
done
就完美了解决了。