我有一个 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}"
。缺少双引号是一个错误,如果任何参数包含空格或通配字符(*
、?
等),它会咬你一口。如有疑问,请始终引用变量扩展!
关于bash - "set -- ${@:2} "在 bash shell 中意味着什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56229939/