Bashでコマンドライン引数を並べ替える方法は?この場合、$1
最初の引数()を特定の位置に移動して$1
nullに設定しようとします。
私の試みは次のとおりです。
#!/bin/bash
FIRST=$1
$1=
echo $* $FIRST
以下を提供します。
% ./test.sh foo bar quux
./test.sh: line 4: foo=: command not found
foo bar quux foo
次のように出力する必要があります。
bar quux foo
答え1
位置引数にのみ割り当てることはできません(1=value
他のすべての割り当てと一致するzshを除く)。
最初の引数を最後の引数に移動したい場合は、使いやすいです。shift
次のように出力されますb c a
。
set -- a b c
temp=$1
shift
echo "$@" "$temp"
途中で移動するのは少しトリッキーで、Bashでは"${@:n:m}"
挿入ポイントの前後の引数を取得するために使用できます。最初の延長だ米パラメータは次から始まります。N。これは以下を提供しますb c a d e f g
(最初の位置を3番目の位置に移動します)。
set -- a b c d e f g
echo "${@:2:2}" "$temp" "${@:4}"
もちろん、$1
ここでShiftを使って消去することもできます。それに応じてインデックスを変更するだけです。
空の文字列パラメーターと存在しないパラメーターとの間に違いがあります。空の要素を保持します"$@"
が"${@:n:m}"
、an(引用符を除く)は$*
すべての引数を連結してからスペースに分割します。これにより空のパラメータが削除されますが、パラメータも空白に分割されます。比較する:
$ set -- foo '' 'bar bar'
$ printf ":%s\n" "$@"
:foo
:
:bar bar
$ printf ":%s\n" $*
:foo
:bar
:bar
(引用符のない拡張もファイル名拡張なので、*
現在のディレクトリなどのすべてのファイルに拡張されます。)