ユーザーがパラメーターを追加する代わりに、パラメーターの前に追加するスクリプトがあります。つまりcommand C
、、、、command B C
などcommand A B C
を呼び出すことができます。
でできるように、これらのパラメータを右から簡単に移動できることを願っていますshift
。
私はshift-right
次のように動作するコマンドを想像しています。
echo "$@" # A B C
shift-right
echo "$@" # A B
shift-right
echo "$@" # A
shift-right
echo "$@" #
echo "$#" # 0
これを達成するためのきれいな方法はありますか?この問題を解決できることはわかっていますが、shift
同様の解決策がより良く簡単になります。
XYの質問コメントに応じて、私の特定のユースケースは、ポートまたはホストとポートを使用するコマンドです(command 123
または)command remotehost 123
。私は、ユーザーがこれを逆順(ポートの次のホスト)に割り当てるようにしたくありません。
次のように言うのはとてもきれいです(明らかにテストされていません)。
port=${@: -1}
shift-right
host=${1:-localhost}
しかし、実際には、この特定の例を解決するより良い方法があっても、この問題について疑問に思います。
shift-right
参考のために2つの引数がない場合を処理する非常にきれいな方法は次のとおりです。
port=${@: -1}
host=${2:+$1}
host=${host:-localhost}
しかし、パラメータの数が増えるにつれて、これがどれほど扱いにくくなるかを理解できることを願っています。
ベストアンサー1
位置引数のリストが次の場合:
$ set -- 0wer 1wdfg 2erty 333 4ffff 5s5s5
これにより、最後の引数なしで引数が印刷されます。
$ echo "${@:1:$#-1}"
0wer 1wdfg 2erty 333 4ffff
もちろん、パラメータは次のように設定することもできます。
$ set -- "${@:1:$#-1}"
$ echo $@
0wer 1wdfg 2erty 333 4ffff
これはbash 2.0以降で動作します。
他の単純なシェルの場合、最後の引数を削除するには(ややトリッキーな)ループが必要です。
unset b; for a; do set -- "$@" ${b+"$b"}; shift; b="$a"; done