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
いいえ脱出しました。