kjo*_*kjo 5 scripting bash zsh shell-script
(注意:这个问题的动机只是为了提高我的bash编程知识。)
我想知道bash等效的zsh表达式,如$@[2,$#],这直接涉及的范围内的外壳功能的(或脚本的)命令行参数阵列($@)。
(我在网上找到的用于寻址范围$@in 的所有解决方案bash都可以描述为“间接寻址”,因为它们都需要首先分配$@给一个中间变量。请参见下面的示例。)
为了具体起见:bash以下zsh测试函数的等效项是什么?
testfn () {
printf '>%s<\n' $@[2,$#]
}
% testfn a b c d
>b<
>c<
>d<
Run Code Online (Sandbox Code Playgroud)
以下是我设法想出的最接近的;如上所述,它需要分配$@给一个中间变量:
testfn () {
holdargs=( $@ )
printf '>%s<\n' "${holdargs[@]:1}"
}
Run Code Online (Sandbox Code Playgroud)
我对不需要中间变量的所有尝试都失败并出现bad substitution错误。
这对我有用:
testfn () {
printf '>%s<\n' "${@:2}"
}
Run Code Online (Sandbox Code Playgroud)
例子:
$ testfn a b c d
>b<
>c<
>d<
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)$@ Expands to the positional parameters, starting from one. When the expansion occurs within double quotes, each parameter expands to a separate word.
查看Bash Hacker's Wiki的 Positional Parameters 部分以及Mass Usage部分以获取更多示例和详细信息。
一般当你双引号的形式是$@这样的,"$@"否则"${@:2}"返回的结果会是双引号的结果。
$@可以使用以下表示法访问数组元素 like :
"${@:START:COUNT}"
Run Code Online (Sandbox Code Playgroud)
大量使用部分的摘录
这将从 START 开始扩展 COUNT 个位置参数。COUNT 可以省略 (${@:START}),在这种情况下,所有以 START 开始的位置参数都会被扩展。
其他人表示,上述内容并不等效,因为它无法处理空元素。我在 Bash 4.1.7 上,似乎确实如此。
例子:
$ testfn "" a "" c d e
>a<
><
>c<
>d<
>e<
$ testfn '' a '*' c d e
>a<
>*<
>c<
>d<
>e<
$ testfn "" a " " c d e
>a<
> <
>c<
>d<
>e<
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
252 次 |
| 最近记录: |