Shell语言用例

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

就完美了解决了。

上一篇 下一篇

猜你喜欢

热点阅读