我有一个shell脚本,其中的一行是“ set-$ {@:2}”,请您告诉我这是什么意思? 我已经在测试脚本中尝试过,它似乎删除了args中的$ 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}"
。如果任何参数包含空格或通配符(*
,?
等),缺少双引号将是一个会叮咬您的错误。如有疑问,请始终引用变量扩展!