"$@"
私は配列を使って反転することが可能であることを知っています。
arr=( "$@" )
そしてこの回答を使用してください、配列を反転します。
ただし、これには配列を含むシェルが必要です。
可能tac
:
set -- $( printf '%s\n' "$@" | tac )
ただし、引数に空白、タブ、または改行$IFS
(デフォルトは仮定)が含まれているか、ワイルドカードが含まれている(ワイルドカードが事前に無効になっていない場合)、空の要素が削除され、GNUtac
コマンド(tail -r
GNUシステムの外部で使用されます)が少しより移植性がある場合、これは中断されます。しかし、いくつかの実装は大きな入力のために失敗します)。
配列を使用せずにシェル位置パラメータを移植可能に戻し、パラメータに空白、改行、またはワイルドカードが含まれているか空になる可能性がある場合でも、そのメソッドを機能させる方法はありますか?
ベストアンサー1
移植可能で、配列は必要なく(位置引数のみ)、スペースと改行を使用できます。
flag=''; for a in "$@"; do set -- "$a" ${flag-"$@"}; unset flag; done
例:
$ set -- one "two 22" "three
> 333" four
$ printf '<%s>' "$@"; echo
<one><two 22><three
333><four>
$ flag=''; for a in "$@"; do set -- "$a" ${flag-"$@"}; unset flag; done
$ printf '<%s>' "$@"; echo
<four><three
333><two 22><one>
値はflag
拡張を制御します${flag-"$@"}
。 setの場合(空の場合でも)flag
値に展開されます。flag
したがって、 flag
isのflag=''
場合は${flag....}
nullに展開され、引用符がないため、シェルから削除されます。設定されていない場合、flag
の値は の拡張である${flag-"$@"}
右の値に拡張されるので、すべての位置引数になります (引用符を含む、null 値は削除されません)。また、変数は最終的に削除(設定解除)され、後続のコードには影響しません。-
"$@"
flag