我有一个 shell 脚本,其中一行是
set -- ${@:2}
。这是什么意思?
我已经在我的测试脚本中尝试过。它似乎删除了 args 中的 $1
参数。你能帮我提供更多细节吗?
这是一种复杂的书写方式
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}"
。缺少双引号是一个错误,如果任何参数包含空格或通配字符(*
、?
等),则会困扰您。如有疑问,请始终引用变量扩展!