如何输出“$@”的单个元素?

如何输出“$@”的单个元素?

我读过这$@是一个保存位置参数的数组。

我尝试输出$@数组的一个元素:

echo ${@[1]}

bash给了我这个错误:

test.sh: line 1: ${@[1]}: bad substitution

答案1

$@是一个“特殊参数”,不是数组;因此,您无法将其作为数组访问。您可以使用参数的位置直接访问参数 :${1}...。${n}

$ set -- a b c d e f g h i j k l m n
$ echo "$#"
14
$ echo "${10}"
j

因为我对参数 10+ 的大括号行为感到好奇,所以我对各种 shell 进行了测试:

for shell in ash bash dash fish ksh mksh posh rc sash yash zsh
do
  printf "The %s shell outputs: %s\n" "$shell" "$($shell -c 'set -- a b c d e f g h i j k l m n; echo $10')"
done

有了这些结果:

The ash shell outputs: j
The bash shell outputs: a0
The dash shell outputs: j
The fish shell outputs:
The ksh shell outputs: a0
The mksh shell outputs: a0
The posh shell outputs: a0
rc: cannot find `set'
The rc shell outputs:
The sash shell outputs: j
The yash shell outputs: a0
The zsh shell outputs: j

shell 参数的大括号行为在外壳命令语言Shell 参数扩展部分:

参数名称或符号可以用大括号括起来,除了多于一位数字的位置参数之外,大括号是可选的...

并且$@特殊参数本身在同一页面上进行了描述特殊参数部分。

答案2

实际上是$@一个值列表,而不是一个数组。数组语法实际上不起作用。他们称为“位置参数”通常通过语法访问$4(例如)。

在bash中:

$ set -- a b c d e f g h i j k l m n
$ echo $6
f
$ echo "${11}"
k
$ echo "${@:11:1}"
k

有索引:

$ i=11
$ echo "${@:i:1}"
k
$ echo "${!i}"
k

在较旧的 shell 上,除了使用 eval 之外没有解决方案(注意风险):

$ eval 'var=$'"{$i}"
$ echo "$var"
k

循环

循环很容易管理,只需使用for var; do …; done

$ for pos; do printf '%s:' "$pos"; done; echo
a:b:c:d:e:f:g:h:i:j:k:l:m:n:

shell 自动使列表中的每个值可用于每个循环。

相关内容