【问题标题】:Unable to set second to last command line argument to variable无法将倒数第二个命令行参数设置为变量
【发布时间】:2013-05-13 17:06:45
【问题描述】:

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

执行程序我会输入这样的内容:

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

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

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

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

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

【问题讨论】:

  • 或者,倒数第二个参数是否始终是可变数量选项之后的第一个参数?
  • @chepner 我认为你的问题的答案是肯定的。我的脚本至少需要两个参数才能运行。

标签: bash shell command-line


【解决方案1】:

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

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

间接 (${!n}) 告诉 bash 使用 n 的值作为要使用的变量的名称(在本例中为 $2)。

【讨论】:

  • 谢谢!这有效,但我不确定如何或为什么。我理解 ($(($#-1))),但我不明白当你执行 (${!n}) 时会发生什么
  • @nkon 我在${!n} 上添加了一些解释。
  • 再次感谢您的帮助
【解决方案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-18
    • 1970-01-01
    • 2016-03-20
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 2015-06-03
    • 2019-12-04
    相关资源
    最近更新 更多