分割パラメータのリスト

分割パラメータのリスト

可変数の引数を受け入れるbash関数を作成したいと思います。パラメーターは少なくとも1つ必要です。次に、受け入れる最初のパラメータと残りのパラメータの間に固定値を挿入する必要がある別のプログラムを呼び出します。

私はこれに基づいてこの回答

tt() {
  name="$1"
  params="${@:2}"
  someapp ${name} 1234 /some/path "${params}"
}

しかし、思ったよりできませんでした。

tt John has fun

結果の呼び出しは次のとおりです。

someapp John 1234 /some/path 'has fun' 

引用符を参照してください。一方、結果は次のとおりです。

someapp John 1234 /some/path has fun 

最後の2つのパラメータは公開引用符で囲まれません。

答え1

最初の引数を選択shiftし、保存された最初の引数と残りの引数を使用して別のコマンドを呼び出します。

tt () {
   name=$1
   shift

   someapp "$name" 1234 /some/path "$@"
}

または試みるような名前付き配列を使用してください。

tt () {
    name=$1
    params=( "${@:2}" )

    someapp "$name" 1234 /some/path "${params[@]}"
}

独自のコードの最大の問題は、変数をparams配列として作成または使用しないことです。これを正しく行うことは、二重引用符とビットを含むparams=( "${@:2}" )at asを使用するのと同じです。"${params[@]}"[@]

配列の割り当ては常に次のようになるname=( ... )ため、params="${@:2}"配列ではなく、最初から2番目の要素で構成される単一の文字列が区切り文字でスペース"$@"で連結されます。

に二重引用符がない場合、"${params[@]}"シェルは配列の各要素をスペース、タブ、および改行($IFSデフォルトはの文字)に分割し、結果の単語ごとにファイル名のグロービングを適用します。それ以外の場合は、[@]配列の最初の要素のみを取得します。


簡単な書き換え:

tt () { someapp "$1" 1234 /some/path "${@:2}"; }

関連情報