bash shell中的“ set-$ {@:2}”是什么意思

时间:2019-05-21 01:24:02

标签: bash shell

我有一个shell脚本,其中的一行是“ set-$ {@:2}”,请您告诉我这是什么意思? 我已经在测试脚本中尝试过,它似乎删除了args中的$ 1参数,您能帮我提供更多详细信息吗?

1 个答案:

答案 0 :(得分:10)

这是一种写shift的复杂方式。*

首先,set --是什么?

  • set有许多用途。它可以更改外壳程序选项,例如使用set -e启用严格的错误检查,或者使用set -x打印运行的每个命令。
  • set也可以更改$1$2等命令行参数。 set foo bar baz$1设置为"foo",将$2设置为"bar",将$3设置为"baz"
  • --是一个常见的成语,意思是“停止寻找标志”。如果您写set -e,则会得到错误检查,但是使用set -- -e-e不再是标志,它的值现在是$1

好吧,"${@:2}"呢?

  • "$@"是命令行参数的列表。编写"$@"就像编写"$1" "$2" "$3" ...一样,尽管有很多论点。
  • :2是数组切片符号。它为您提供了从第二个元素开始的数组元素。 "${@:2}为您提供从第二个开始的所有命令行参数。就像写"$2" "$3" "$4" ...
  • $var${var}的简写。对于简单的扩展,花括号是可选的,对于更复杂的花括号是必需的。要使用数组切片,"$@"必须写为"${@}""$@:2"不起作用:shell将其解析为"${@}:2"

将它们放在一起,您将获得“将命令行参数设置为$2$3$4等”或者,就像您所说的,它摆脱了$1

shift正是这么做的。

*实际上,shift等同于带有双引号的set -- "${@:2}"。如果任何参数包含空格或通配符(*?等),缺少双引号将是一个会叮咬您的错误。如有疑问,请始终引用变量扩展!