这个 ${@:2} 在 shell 脚本中是什么意思

Len*_*ran 38 bash ksh shell-script

我在 shell 脚本中看到了这一点。

variable=${@:2}
Run Code Online (Sandbox Code Playgroud)

它在做什么?

slm*_*slm 51

$@在 Bash 中显示了特殊变量的内容。它包含所有命令行参数,该命令将第二个参数中的所有参数存储在一个变量中variable

例子

这是一个示例脚本。

#!/bin/bash

echo ${@:2}

variable=${@:3}
echo $variable
Run Code Online (Sandbox Code Playgroud)

示例运行:

./ex.bash 1 2 3 4 5
2 3 4 5
3 4 5
Run Code Online (Sandbox Code Playgroud)

参考

  • 请注意,显示的技术将给定的参数混搭为单个字符串。如果您需要将它们作为单独的参数保留,请使用数组:`vars=( "${@:2}" )` (13认同)
  • 还要注意大括号的使用。您应该始终使用大括号,但 Bash 允许您在上下文明确时省略它们。因此,`$@` 和 `${@}` 是相同的,尽管后者是“更正确”的语法。你必须使用带有 `${@:2}` 的括号,因为 `$@:2` 是不明确的,因此会被解释为 `${@}:2`,这不是一回事。 (4认同)

Sté*_*las 17

这是一个ksh在还发现功能bash和最新版本zsh

kshand 中bash,您可以使用${array[@]:first:length}语法访问数组的多个元素,该语法最多扩展到length(或所有如果length省略)array数组元素(在索引上按数字排序的数组元素列表中),从第一个索引大于或等于first. 当在标量上下文中(就像这里在对标量变量的赋值中)时,元素列表用空格字符bashksh93和和的第一个字符$IFS(如果$IFS是空的,则没有任何字符,如果未设置,则为空格)用zsh.

例如:

$ a[23]=a a[5]=b a[235]=c a[45]=d
$ x=${a[@]:12:2}; printf '<%s>\n' "$x"
<a d>
Run Code Online (Sandbox Code Playgroud)

$@是特例。$@是位置参数数组 ( $1, $2...)。但是当与:, 一起使用时,$0也包括在内。所以${@:1}与 相同$@${@:0}与其他数组不同。

在 中zsh,情况略有不同。最近才为兼容性zsh添加了ksh语法,但有自己的语法来选择元素范围。

kshand相反bashzsh数组是与标量变量不同的变量类型,不是稀疏的(zsh具有关联数组作为另一种变量类型)并且从索引 1 而不是 0 开始。

对于zsh,您可以使用$a[first,last](wherelast也可以为负数从末尾向后计数)访问数组元素范围。

zsh

a[23]=a a[5]=b a[235]=c a[45]=d
Run Code Online (Sandbox Code Playgroud)

创建一个包含 235 个元素的数组,其中大部分为空。$a[12,50]将扩展到元素 12 到 50,并且${a[@]:12:2}只会扩展到(空)$a[12]$a[13]元素。作为一种特殊情况,同样是为了使用ksh93and 的可移植性bashzsh也接受0第一个元素 for$@并将其视为$0

因此,您可以在所有 3 个 shell 中使用${a[@]:x:n}${@:x:n}移植,但仅限于非稀疏数组,并注意 IFS 的值。