うん、ダッシュはここでは役に立たないようです。厳密に言うと、POSIX${@%...}
で指定されていないため、これは問題ではありません。
以下の4種類のパラメーター拡張は、サブストリング処理を提供します。[...]パラメータが ' #
'、 ' *
'、または ' @
'の場合、展開の結果は不定です。
奇妙なことですが、そのような展開が1つの位置パラメーターの終わりを変更すると、次のものは削除されるようです。しかし、それが実際に終了を変更しない場合はそうではありません:
$ dash -c 'set -- foo bar; printf "<%s>\n" "${@%o}";'
<fo>
$ dash -c 'set -- foo bar; printf "<%s>\n" "${@%x}";'
<foo>
<bar>
$ dash -c 'set -- foo bar doo; printf "<%s>\n" "${@%r}";'
<foo>
<ba>
Bash、ksh、およびZshはすべて、各位置パラメータを個別に処理"${@#...}"
および"${@%...}"
処理するように見えますが、これは便利なことのようです。
の明らかな回避策dash
は、変更を一度に1つの引数にすることだと思います。
for x in "$@"; do echo "${x%%/*}"; done
価値があるのは、使用される接頭辞/接尾辞の削除拡張の動作$*
もシェルによって異なることです。Bashとkshは最初にパラメーターを変更し、その後それらを結合するようですが、Zshとdashは最初にパラメーターを結合し、連結された文字列を変更します。
$ zsh -c 'set -- ax bx; printf "<%s>\n" "${*%%x*}";'
<a>
$ bash -c 'set -- ax bx; printf "<%s>\n" "${*%%x*}";'
<a b>
sh
思っ$@
ファイル全体のための単一のパラメータである(またはARG_MAXを超えた場合は、複数に壊れる)と唯一の引数の拡張を行います。