我有一个接受命令行参数的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
和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
这样的输出是这样的:
mno 345
stu 901
我希望Bash接受这些参数并认识到它们是数组/变量名称,然后像执行此操作一样打印它们: echo $1
我之前几乎没有做过任何Bash脚本编写,而我尝试使用的方法似乎无效。这是可能的吗?或者有比我尝试解决的方法更好的方法吗?
从Bash 4.3(2014-02-26)开始,您可以使用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手册,其中介绍了奇怪的语法"${array[@]}"
。这里的定义_t_
旨在创建该语法。它本身不是下标表达式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句