関数に引数をそのまま渡します。

関数に引数をそのまま渡します。

この記事:関数に引数をそのまま正確に渡します。

ただし、設定が若干異なります。

私は3つのbash機能、foo、bar、bazを持っています。その設定は次のとおりです。

foo() {
  bar $1
}

bar() {
  var1=$1
  var2=$2
  echo "$var1" test "$var2"
}
export ENV_VAR_1="1"
export ENV_VAR_2="2 3"

foo "${ENV_VAR_1} ${ENV_VAR_2}"

私の予想結果は次のとおりです。

1 test 2 3

ただし、出力は次のようになります。

1 test 2

私はこれがなぜそうなのか理解しています。 barは次のように実行されます。

bar 1 2 3

私の質問は:それを実行する方法です

bar 1 "2 3"

私が試したこと:

foo () {bar "$1"} 
# Out: 1 2 3 test. Makes sense since "1 2 3" is interpreted as a single argument.

ベストアンサー1

これは文字列を引数として提供しますfoo

foo "${ENV_VAR_1} ${ENV_VAR_2}"

$1引用符内にないため、シェルは単語の区切りを実行するため、次の3つの引数が提供されますbar

bar $1

S1トークン化は、これらの文字の元のソースに関係なく実行されます。

より簡単な例

これを次のように定義しましょうx

$ x="${ENV_VAR_1} ${ENV_VAR_2}"

今印刷してみましょう"$x"

$ printf "%s\n" "$x"
1 2 3

ご覧のとおり、パラメータ"$x"として解釈されます。これとは対照的に、次の点を考慮してください。

$ printf "%s\n" $x
1
2
3

上記では、$x3つのパラメータを生成するとトークン化が行われます。

シェル文字列には記録の概念はありません。文字列には、割り当てられる前に文字列の一部という記録はxありません。文字列は、スペース、スペースでのみ構成され、単語分割はスペースで機能します。2 3xx123

代替案:独自のIFSを選択してください

これにより、所望の出力が生成される。

$ foo() ( IFS=@;  bar $1; )
$ foo "${ENV_VAR_1}@${ENV_VAR_2}"
1 test 2 3

で にfoo設定しました。したがって、その後のすべての単語分割は、単語区切り記号を使用して実行される。したがって、呼び出し時に単語の分割が必要な場所に配置します。IFS@@foo@

おすすめ記事