シェルパラメータをどのように変更しますか?

シェルパラメータをどのように変更しますか?

"$@"私は配列を使って反転することが可能であることを知っています。

arr=( "$@" )

そしてこの回答を使用してください、配列を反転します。

ただし、これには配列を含むシェルが必要です。

可能tac:

set -- $( printf '%s\n' "$@" | tac )

ただし、引数に空白、タブ、または改行$IFS(デフォルトは仮定)が含まれているか、ワイルドカードが含まれている(ワイルドカードが事前に無効になっていない場合)、空の要素が削除され、GNUtacコマンド(tail -rGNUシステムの外部で使用されます)が少しより移植性がある場合、これは中断されます。しかし、いくつかの実装は大きな入力のために失敗します)。

配列を使用せずにシェル位置パラメータを移植可能に戻し、パラメータに空白、改行、またはワイルドカードが含まれているか空になる可能性がある場合でも、そのメソッドを機能させる方法はありますか?

ベストアンサー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したがって、 flagisのflag=''場合は${flag....}nullに展開され、引用符がないため、シェルから削除されます。設定されていない場合、flagの値は の拡張である${flag-"$@"}右の値に拡張されるので、すべての位置引数になります (引用符を含む、null 値は削除されません)。また、変数は最終的に削除(設定解除)され、後続のコードには影響しません。-"$@"flag

おすすめ記事