パラメータ配列をマッピングして文字列に変換する

パラメータ配列をマッピングして文字列に変換する

私にこれらがあるとします。強く打つスクリプトの機能:

foo(){
  my_args_array=("$@")
  export my_args="${my_args_array[@]}"
  bar $my_args
}

bar(){
  echo "number of args: $#";
}


foo a b 'c d e'

上記のスクリプトを実行すると、次のような結果が得られます。

パラメータ数:5

しかし、私が探しているものは次のとおりです。

パラメータ数:3

my_args_array[@]だから私の質問は - 各要素を一重引用符で囲むことができるように返された値をマッピングする方法はありますか?または、環境変数文字列を元のコマンドライン引数のように見せるために必要なすべての操作を実行します。

答え1

文字列ではなく配列を使用してください。

#!/bin/bash
foo(){
  my_args=("$@")
  bar "${my_args[@]}"
}

bar(){
  echo "number of args: $#";
}


foo a b 'c d e'

答え2

Bashの"${array[@]}"割り当ての右側に(or)を使用するのは(or)と少し似ています。スペースを区切り文字として使用して、配列要素を単一の文字列に連結します。 (()は使用された最初の文字(バイト?)です。)これはの引数にも適用されます。"$@"${array[*]}"$*"${array[*]}"$*"IFSexportdeclarelocal

a b c d eその後、入力すると、引用符のmy_argsない拡張が分割されます。

配列が必要な場合は、配列を使用してください。

foo() {
    bar "$@"
}
bar() {
    echo "number of args: $#";
}
foo a b 'c d e'

または、文字列が必要な場合は明確にするために明示的に使用することをお勧めします"${array[*]}"

(FWIW、Bashは環境を介した配列のエクスポートをサポートしていません。[1] [2])

関連情報