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

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

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

variable=${@:2}

它在做什么?

答案1

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

例子

这是一个示例脚本。

#!/bin/bash

echo ${@:2}

variable=${@:3}
echo $variable

运行示例:

./ex.bash 1 2 3 4 5
2 3 4 5
3 4 5

参考

答案2

最新版本ksh的.bashzsh

ksh和中bash,您可以使用以下${array[@]:first:length}语法访问数组的多个元素,该语法最多扩展到length(或length省略所有)数组元素array(在按索引数字排序的数组元素列表中),从第一个索引大于或等于 的first。当在标量上下文中时(就像这里对标量变量的赋值一样),元素列表用空格字符与bashandksh93和 的第一个字符$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>

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

zsh,略有不同。最近才zsh添加ksh语法以实现兼容性,但具有自己的用于选择元素范围的语法。

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

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

zsh

a[23]=a a[5]=b a[235]=c a[45]=d

创建一个包含 235 个元素的数组,其中大部分为空。$a[12,50]将扩展到元素 12 到 50,并且${a[@]:12:2}只会扩展到 (空)$a[12]$a[13]元素。作为一种特殊情况,并且再次考虑到ksh93和 的可移植性bashzsh还接受 的0第一个元素$@并将其视为$0

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

相关内容