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

岑志鹏*_*岑志鹏 3 bash shell

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

Joh*_*ica 10

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

首先,是什么set --

  • set有很多用途。它可以更改shell选项,例如,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}"双引号。如果任何参数包含空格或通配符(,等等)*,双引号都将丢失?。如有疑问,请始终引用变量扩展!