17

我想检索 $@ 的第 n 个参数(传递给脚本的命令行参数列表),其中 n 存储在一个变量中。

我试过 ${$n}。

例如,我想获取调用的第二个命令行参数:

./my_script.sh alpha beta gamma

并且索引不应该是显式的,而是存储在变量 n 中。

源代码:

n=2
echo ${$n}

我希望输出为“beta”,但我收到错误:

./my_script.sh: line 2: ${$n}: bad substitution

我究竟做错了什么?

4

5 回答 5

36

您可以使用变量间接。它独立于数组,并且在您的示例中可以正常工作:

n=2
echo "${!n}"

编辑: 变量间接可以在很多情况下使用。如果存在变量foobar,则以下两个变量展开会产生相同的结果:

$foobar

name=foobar
${!name}
于 2012-05-25T07:12:14.597 回答
14

试试这个:

#!/bin/bash
args=("$@")
echo ${args[1]}

好的,用一些 $n 或其他东西替换“1”...

于 2012-05-25T07:14:09.700 回答
9

以下也有效:

#!/bin/bash
n=2
echo ${@:$n:1}
于 2012-05-25T07:19:07.360 回答
4

便携式(非 bash 特定)解决方案是

$ set a b c d
$ n=2
$ eval echo \${$n}
b
于 2012-05-25T07:16:14.150 回答
2

eval可以帮助您间接访问变量,这意味着对表达式求值两次。

你可以这样做eval alph=\$$n; echo $alph

于 2012-05-25T07:18:14.160 回答