bash - "set -- ${@:2} "在 bash shell 中意味着什么

标签 bash shell

我有一个 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/

相关文章:

linux - 在日志文件中捕获 nethogs 输出

bash - $* 在 bash 脚本中是什么意思?

shell - 如何使用 unix shell 脚本截断文件名

java - 在 Java 中执行 shell 命令行

shell - 反 "use alternative value"的方便 shell 习语

c++ - Makefile 空白参数导致 shell 出错

bash - 使用 bash 在我的网络服务器上查找恶意脚本

linux - 从 cshell (tcsh) 执行 bash shell

linux - 如何将变量传递给 bash 脚本中的命令参数?

linux - shell 和变量中的 Expr 和日期