我有一个接受命令行参数的bash脚本。该脚本定义了几个字符串数组。参数确定我要打印的数组。由于可以选择一组不同的可能数组,我希望能够在命令行中指定要打印的数组。
例如,假设我定义了这些数组:
#/bin/bash
myarray1=(abc 123)
myarray2=(def 456)
myarray3=(ghi 789)
myarray4=(jkl 012)
myarray5=(mno 345)
myarray6=(pqr 678)
myarray7=(stu 901)
我想从命令行中选择是否要打印所有数组,或这些数组的各种组合,例如myarray1
,myarray3
和{{1} }。但另一方面,我只想打印myarray4
和myarray5
。
我希望能够像这样运行脚本:
myarray7
以便输出为:
np ~/usr-bin > bash myscript.bash myarray1 myarray3 myarray4
或者像这样:
abc 123
ghi 789
jkl 012
以便输出为:
np ~/usr-bin > bash myscript.bash myarray5 myarray7
我希望bash接受这些论点,并认识到他们是数组/变量名,然后打印出来就好像我这样做:mno 345
stu 901
我之前几乎没有做过任何bash脚本,我尝试完成此操作的方法似乎不起作用。这是可能的,还是有更好的方法来实现这一点,而不是我试图去实现它?
答案 0 :(得分:0)
您可以使用!
:
#/bin/bash
myarray1=(abc 123)
myarray2=(def 456)
myarray3=(ghi 789)
myarray4=(jkl 012)
myarray5=(mno 345)
myarray6=(pqr 678)
myarray7=(stu 901)
for i in $*; do
echo ${!i}
done
使用testscript myarray6 myarray2
运行该输出:
pqr
def
如果您想确保它没有为不存在的变量提供空行,您可以使用:
#/bin/bash
myarray1=(abc 123)
myarray2=(def 456)
myarray3=(ghi 789)
myarray4=(jkl 012)
myarray5=(mno 345)
myarray6=(pqr 678)
myarray7=(stu 901)
for i in $*; do
if [[ ! -z "${!i}" ]]; then
echo ${!i}
fi
done
使用testscript myarray6 xyzzy_plugh myarray2
运行仍然输出
pqr
def
(假设你没有一个名为xyzzy_plugh
的环境变量,但是,除非你是一个巨大的洞穴粉丝,你为什么要这样做?)。
答案 1 :(得分:0)
使用bash 4.3,您可以使用namerefs作为一个简单的解决方案:
print_arrays() {
for a in "$@"; do
# This makes _t_ an alias for the variable whose name is $a
declare -n _t_="$a"
echo "${_t_[@]}"
done
}
在4.3之前,您需要使用!
间接语法。但是,通过需要包含整个数组引用的变量,包括下标。而且你只能间接通过变量,而不是字符串表达式。所以你需要做这样的事情:
print_arrays() {
for a in "$@"; do
# Construct the "name", which is the subscripted array name
_t_=${a}[@]
echo "${!_t_}"
done
}
如果您不熟悉bash,则应阅读Bash manual section on arrays,其中解释了奇怪的语法"${array[@]}"
。 _t_
的定义旨在创建该语法;它本身不是下标表达式。