出于教育目的,我正在尝试编写一个小脚本来测试 bash 中带引号和不带引号的特殊参数之间的差异。特别是$、“$”、$@和“$@”
粗略地说,当特殊参数的名称存储在数组中时,我试图在 for 循环中获取特殊参数的名称和值
script
#!/bin/bash
IFS=','
args='$*,"$*"'
for a in ${args}
do
echo "$a" # Outputs $* or "$*"
echo $(echo "$a") # Outputs the same
# but desired output is the value of variable stored inside $a
echo "${!a}" # Doesn't work. Indirect expansion?
done
如果我将
args
变量的值放在单引号 (args='$*,"$*"'
) 中,我将获得 for 循环内的参数名称。
如果我将 args
变量的值放在双引号 (args="$*,\"$*\""
) 中,我将获得循环内特殊参数的值。
但我两者都需要。还有名称和“值的值”。
我尝试过间接扩展,但我不确定我是否正确使用它
例如当我运行带有多个参数的脚本时:
./script arg1 arg2
我期望这个输出:
$* <-------value of $args
arg1 <-------values of 'value of $args', i.e echo $*
arg2
"$*" <-------the second iteration
arg1 arg2 <--values of 'value of $args', i.e. echo "$*"
Bash 解决方案是可以接受的,但如果是 Posix 解决方案那就太好了
要使用间接(参考),请检查:
$ foo=bar
$ declare -n qux=foo
$ echo $qux
bar