我正在编写一个 shell 脚本,我需要打印脚本的第 n 个参数。
例如,假设我们有n=3
并且我们的脚本以足够的参数运行。现在我需要打印第n
th 个参数,即$3
.
但是如果n=2
,我们会打印参数$2
。
我不想使用if
语句。我想做类似的事情
echo $($n)
但是上面的方法并不能按照我需要的方式工作。
我正在编写一个 shell 脚本,我需要打印脚本的第 n 个参数。
例如,假设我们有n=3
并且我们的脚本以足够的参数运行。现在我需要打印第n
th 个参数,即$3
.
但是如果n=2
,我们会打印参数$2
。
我不想使用if
语句。我想做类似的事情
echo $($n)
但是上面的方法并不能按照我需要的方式工作。
按时间顺序,在各种外壳中:
$argv[$n]
自 1991 年起在 zsh 中工作,自 2005 年起在 fish 中工作)$argv[n]
//$@[n]
($*[n]
最后一个也被 yash 支持,但只有额外的大括号:${@[n]}
/${*[n]}
)$$n
/$*($n)
(也适用于 es、akanga)${@:n:1}
, (自 1996 年以来也受 bash 支持;自 2010 年${*:n:1}
以来 zsh 也支持,尽管您需要或在那里避免与 csh 样式修饰符发生冲突并查看案例)${@:$n:1}
${@: n:1}
"$*"
${!n}
${(P)n}
:。请记住,在 ksh93/bash/yash 中,您至少需要在列表上下文中引用参数扩展,而 csh 几乎不能用于编写可靠的代码。
在中,当未设置第n个位置参数时,列表上下文和列表上下文
bash
之间存在差异,因为后者然后扩展为没有参数,而前者扩展为一个空元素。"${!n}"
"${@:n:1}"
在类似 Bourne 的 shell 中(但不是 Bourne shell,它不适用于 9 号之后的索引),并且使用标准 POSIX sh 语法,您还可以执行以下操作:
$n
如果不包含严格大于 0 的整数的规范十进制表示,那么所有这些之间的行为也会有所不同。如果您不能保证会是这种情况,则使用其中的大多数(不仅仅是eval
一个)会引入了一个任意命令执行漏洞(唯一的例外rc
可能是csh
上面的)。还要记住,除了
zsh
(withecho -E - $argv[n]
)、yash
(withECHO_STYLE=raw echo "${*[$n]}"
) 和fish
(withecho -- $argv[$n]
) 之外,echo
不能用于输出任意数据,请printf '%s\n' ...
改用)。您传递给脚本的参数存储在
@
数组中,因此执行所需操作的简单方法是获取数组 slice,从 position 开始,n
长度为 1:如果你用几个参数运行它,你会得到:
另一种选择,也是您最初要求的,称为“间接扩展”:
运行这个:
您可以使用变量间接:
简单的便携式外壳(不依赖 bash)解决方案(对
echo
命令的潜在错误进行模数运算;可以用 替换printf
):然后做: