2

无论传递给我的脚本的参数数量如何,我都希望倒数第二个参数始终代表我的代码中的特定变量。

执行程序我会输入如下内容:

sh myprogram.sh -a arg_a -b arg_b special specific

test=("${3}")
echo $test

结果将显示“特殊”。因此,如果我尝试这样做,请使用相同的想法(因为我不知道参数的数量):

secondToLastArg=$(($#-1))
echo $secondToLastArg

结果将显示“3”。如何动态分配倒数第二个参数?

4

2 回答 2

3

您需要进行一些数学运算才能获得所需的数字 ( $(($#-1))),然后使用间接 ( ${!n}) 来获得实际参数。

$ set -- a b c 
$ echo $@
a b c
$ n=$(($#-1))
$ echo $n
2
$ echo ${!n}
b
$ 

间接 ( ${!n}) 告诉 bash 使用 的值n作为要使用的变量的名称 ( $2,在这种情况下)。

于 2013-05-13T17:16:56.847 回答
2

您可以将 $@ 用作数组和数组切割方法:

echo ${@:$(($#-1)):1}

这意味着,使用1$(($#-1))...开始的元素

如果某些旧版本的 shell 不支持${array:start:length}语法但只支持${array:start}语法,请使用以下 hack:

echo ${@:$(($#-1))} | { read x y ; echo $x; } # OR
read x unused <<< `echo ${@:$(($#-1))}`
于 2013-05-13T17:38:50.703 回答