Bash関数は変数で定義された引数を解析しません。

Bash関数は変数で定義された引数を解析しません。

Bashスクリプトで奇妙な動作が発生しました。

parser.sh私は非常に単純な簡単なスクリプトを持っています。

#!/bin/bash

for arg in "$@"
do 
    echo ARGUMENT: "$arg"
done

このスクリプトは、同じディレクトリ内の他のスクリプトから呼び出されます。このスクリプトを呼び出します。test.sh

#!/bin/bash

`pwd`/parser.sh "ARG1=FIRST" "ARG2=TESTING SPACES"

上記のスクリプトは機能し、期待どおりにパラメータを出力します。

ARGUMENT: ARG1=FIRST
ARGUMENT: ARG2=TESTING SPACES

test.shしかし、次のように変更した場合:

#!/bin/bash

ARGS="\"ARG1=FIRST\" \"ARG2=TESTING SPACES\""
`pwd`/parser.sh $ARGS 

この簡単な修正により、パラメータを繰り返すとコードが失敗します。

ARGUMENT: "ARG1=FIRST"
ARGUMENT: "ARG2=TESTING
ARGUMENT: SPACES"

なぜこれが起こるのですか?私は何を見逃していますか?

事前にありがとう

ベストアンサー1

一般変数にパラメータを保存せずに配列を使用してください。

args=( "ARG1=FIRST" "ARG2=TESTING SPACES" )
./parser.sh "${args[@]}"

引用符はエスケープされ、文字通り処理され、変数は引用符なしで拡張されるため、単語の区切りの影響を受けます。

pwdまた、このように使用する必要はなく、.現在のディレクトリを参照するために使用できます。

次のように、変数がどのように処理されるかを確認できます。

$ ARGS="\"ARG1=FIRST\" \"ARG2=TESTING SPACES\""
$ printf '%q\n' $ARGS
\"ARG1=FIRST\"
\"ARG2=TESTING
SPACES\"

TESTINGご覧のとおり、二重引用符は意図したものではなくエスケープのために拡張されています。SPACES いいえ脱出しました。

おすすめ記事