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。
在kshand 中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语法,但有自己的语法来选择元素范围。
与kshand相反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]元素。作为一种特殊情况,同样是为了使用ksh93and 的可移植性bash,zsh也接受0第一个元素 for$@并将其视为$0。
因此,您可以在所有 3 个 shell 中使用${a[@]:x:n}和${@:x:n}移植,但仅限于非稀疏数组,并注意 IFS 的值。