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)
Sté*_*las 17
这是一个ksh
在还发现功能bash
和最新版本zsh
。
在ksh
and 中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>
Run Code Online (Sandbox Code Playgroud)
$@
是特例。$@
是位置参数数组 ( $1
, $2
...)。但是当与:
, 一起使用时,$0
也包括在内。所以${@:1}
与 相同$@
,${@:0}
与其他数组不同。
在 中zsh
,情况略有不同。最近才为兼容性zsh
添加了ksh
语法,但有自己的语法来选择元素范围。
与ksh
and相反bash
,zsh
数组是与标量变量不同的变量类型,不是稀疏的(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]
元素。作为一种特殊情况,同样是为了使用ksh93
and 的可移植性bash
,zsh
也接受0
第一个元素 for$@
并将其视为$0
。
因此,您可以在所有 3 个 shell 中使用${a[@]:x:n}
和${@:x:n}
移植,但仅限于非稀疏数组,并注意 IFS 的值。