変数拡張を引用符で囲む方法は?

変数拡張を引用符で囲む方法は?

私のbashスクリプトは次のとおりです。

#!/bin/bash
set -x 

./test FLAGS=${@:2}

私が実行したときに./script 1 2 3実行されるコマンドは./test FLAGS=2 3...私の考えではFLAGS="2 3"

4行目をに変更しても./test FLAGS="${@:2}"何も変わりません。

4行目を次のように変更すると、./test FLAGS=\"{@:2}\"私が得ることは./test 'FLAGS="2' '3"'実際に私が望むものではありません。

変数を引用符で囲む方法は?

答え1

使用

"${*:2}"

変える

"${@:2}"

$@そして${x[@]}その変形、配列の各要素は「単語」に拡張されます。引用するとき。$*(そして${x[*]}すべての要素をまとめて単一の単語に拡張使用された最初の文字です$IFS

まったく参照されない場合は、両方のバージョンが合格します。噴射すべての文字から複数の単語分割を生成します。IFS発生する。

答え2

コメントによれば、最初の引数を削除(またはどこかに保存)して、残りの引数をスクリプト内で呼び出す他のスクリプトまたはコマンドの引数として使用することを理解しています。

そうすれば、これを簡単に実行でき、FLAGSスクリプト引数をスクリプト内のコマンドに渡すために変数(または他のもの)を設定する必要はありません。次の例をご覧ください。

#!/bin/bash
set -x

original_first_arg="$1"     # Use this line if you need to save the value to use later.

shift
mycommand "$@"

これshiftbash組み込みコマンドです。それ自体は(数値を指定しない)スクリプトの最初の引数(位置引数)だけを破棄します。マンページから:

   shift [n]
          The  positional  parameters  from n+1 ... are renamed to $1 ....
          Parameters represented by the numbers  $#  down  to  $#-n+1  are
          unset.   n  must  be a non-negative number less than or equal to
          $#.  If n is 0, no parameters are changed.  If n is  not  given,
          it  is assumed to be 1.  If n is greater than $#, the positional
          parameters are not changed.  The return status is  greater  than
          zero if n is greater than $# or less than zero; otherwise 0.

その後、コマンドによって削除された後、最初の引数を減算して"$@"スクリプトに指定した正確な引数に展開します。$1shift

追加資料:

答え3

スクリプトのパラメータに応じて異なるパラメータセットを使用するにはできるこれには機能を使用してください。

other_script(){ shift; command other_script "$@"; }
other_script "$@"

それが私が通常することです。関数は他の関数自体を呼び出すことも、新しい関数を定義または上書きすることもできます。すべての関数に配列があります。

関連情報