“set -- ${@:2}”是什么意思?

问题描述 投票:0回答:1

我有一个 shell 脚本,其中一行是

set -- ${@:2}
。这是什么意思? 我已经在我的测试脚本中尝试过。它似乎删除了 args 中的
$1
参数。你能帮我提供更多细节吗?

bash shell
1个回答
17
投票

这是一种复杂的书写方式

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}"
。缺少双引号是一个错误,如果任何参数包含空格或通配字符(
*
?
等),则会困扰您。如有疑问,请始终引用变量扩展!

© www.soinside.com 2019 - 2024. All rights reserved.