我在shell脚本中看到了这一点。
variable=${@:2}
到底在做什么
var="my_value"; echo var="${var[@]:2}"; echo "$var"
看到不同?
我在shell脚本中看到了这一点。
variable=${@:2}
到底在做什么
var="my_value"; echo var="${var[@]:2}"; echo "$var"
看到不同?
Answers:
它$@
在Bash中显示特殊变量的内容。它包含所有命令行参数,并且此命令将从第二个参数中获取所有参数并将其存储在变量中variable
。
这是一个示例脚本。
#!/bin/bash
echo ${@:2}
variable=${@:3}
echo $variable
示例运行:
./ex.bash 1 2 3 4 5
2 3 4 5
3 4 5
vars=( "${@:2}" )
$@
和${@}
相同,尽管后者是“更正确”的语法。您必须将括号与一起使用${@:2}
,因为$@:2
它含糊不清,因此将被解释为${@}:2
,这不是同一回事。
ksh
在。的bash
最新版本中也发现了该功能zsh
。
在ksh
和中bash
,您可以使用以下${array[@]:first:length}
语法来访问数组的多个元素,该语法最多可扩展到(在索引上按数字顺序排序的数组的元素列表中)该数组的元素length
(或length
省略的所有元素array
)。第一个索引大于或等于的索引first
。在标量上下文中(如此处的对标量变量的赋值),元素列表与带有bash
和的空格字符连接在一起,ksh93
并带有的第一个字符$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
和相反bash
,zsh
数组是与标量变量不同的变量类型,不是稀疏的(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
和bash
,zsh
还接受0
用于第一元件$@
和对待,作为$0
。
因此,您可以在所有3个shell上使用${a[@]:x:n}
并${@:x:n}
移植它们,但只能用于非稀疏数组,并要注意IFS的价值。