我在 AU 上发布了一个问题的答案,我发现参数扩展 on$@
不适用于sh
shell:
<infile xargs -d'\n' sh -c 'echo "${@%%/*}"' _
但它在bash
. 这是sh
外壳的预期行为,我如何在那里执行扩展?
此外,我知道通过-n1
选项xargs
我一次只能将一行传递给命令,但我对是否sh
可以扩展感兴趣$@
:
<infile xargs -d'\n' -n1 sh -c 'echo "${0%%/*}"'
infile
包含:
A1 /B1/C1
A 2/B2/C2
A3/B3/C3
是的,破折号在这里似乎不太有用。虽然严格来说它没有错,但正如POSIX 未指定的
${@%...}
那样:不过这很奇怪,似乎如果这样的扩展修改了一个位置参数的结尾,它会删除以下位置参数。但如果它实际上没有修改结尾,则不是:
Bash、ksh 和 Zsh 似乎都通过独立处理每个位置参数来处理
"${@#...}"
和"${@%...}"
处理,这似乎是有用的事情。我想明显的解决方法
dash
是一次修改一个参数:对于它的价值,使用的前缀/后缀删除扩展的行为
$*
也因外壳而异。Bash 和 ksh 似乎是先修改参数,然后再加入,而 Zsh 和 dash 是先加入参数,然后修改连接的字符串: