从命令行调用bash-script变量

时间:2015-02-23 04:23:12

标签: arrays bash command-line arguments

我有一个接受命令行参数的bash脚本。该脚本定义了几个字符串数组。参数确定我要打印的数组。由于可以选择一组不同的可能数组,我希望能够在命令行中指定要打印的数组。

例如,假设我定义了这些数组:

#/bin/bash
myarray1=(abc 123)
myarray2=(def 456)
myarray3=(ghi 789)
myarray4=(jkl 012)
myarray5=(mno 345)
myarray6=(pqr 678)
myarray7=(stu 901)

我想从命令行中选择是否要打印所有数组,或这些数组的各种组合,例如myarray1myarray3和{{1} }。但另一方面,我只想打印myarray4myarray5

我希望能够像这样运行脚本:

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脚本,我尝试完成此操作的方法似乎不起作用。这是可能的,还是有更好的方法来实现这一点,而不是我试图去实现它?

2 个答案:

答案 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_的定义旨在创建该语法;它本身不是下标表达式。