Bashでのコマンドラインパラメータの変更と並べ替え

Bashでのコマンドラインパラメータの変更と並べ替え

Bashでコマンドライン引数を並べ替える方法は?この場合、$1最初の引数()を特定の位置に移動して$1nullに設定しようとします。

私の試みは次のとおりです。

#!/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

(引用符のない拡張もファイル名拡張なので、*現在のディレクトリなどのすべてのファイルに拡張されます。)

関連情報