$ 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
$@
是“特殊参数”,而不是数组;因此,您不能将其作为数组访问。您可以使用它们的位置直接访问参数:${1}
...${n}
。因为我对参数 10+ 的大括号行为感到好奇,所以我对各种 shell 进行了测试:
有了这些结果:
Shell 参数的大括号行为在 Shell 参数扩展的Shell 命令语言部分中进行了说明:
并且
$@
特殊参数本身在特殊参数部分的同一页面上进行了描述。$@
实际上是一个值列表,而不是一个数组。数组语法实际上不起作用。它们被称为“位置参数”,通常通过$4
语法访问(例如)。在 bash 中:
有一个索引:
在较旧的 shell 上没有解决方案,只能使用 eval (注意风险):
循环
循环易于管理,只需使用
for var; do …; done
shell 自动使列表中的每个值可用于每个循环。