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


27

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

variable=${@:2}

到底在做什么


这正是脚本中显示的方式吗?该语法看起来像一个数组,但是缺少一些片段。您能否在脚本中在此行附近发布几行?
slm

这是从第二个字母开始的变量。var="my_value"; echo var="${var[@]:2}"; echo "$var"看到不同?
Valentin Bajrami 2013年

Answers:


34

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

这是一个示例脚本。

#!/bin/bash

echo ${@:2}

variable=${@:3}
echo $variable

示例运行:

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

参考文献


9
请注意,显示的技术将给定的参数混为一个字符串。如果需要将它们作为单独的参数保留,请使用数组:vars=( "${@:2}" )
glenn jackman 2013年

@glennjackman-感谢您指出这一点。
slm

2
另请注意大括号的使用。您应该始终使用大括号,但是当上下文明确时,Bash允许您省略大括号。因此,$@${@}相同,尽管后者是“更正确”的语法。您必须将括号与一起使用${@:2},因为$@:2它含糊不清,因此将被解释为${@}:2,这不是同一回事。
帕迪·兰道

14

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和相反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]元素。作为特殊情况,并再次用于与便携ksh93bashzsh还接受0用于第一元件$@和对待,作为$0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.