うん、ダッシュはここでは役に立たないようです。厳密に言うと、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を超えた場合は、複数に壊れる)と唯一の引数の拡張を行います。