Bash文字列評価が不明である

Bash文字列評価が不明である

Bashスクリプトでは、次の点を考慮してください。

STOP_SEARCH_STR="'""for $TASKNAME""'"
echo $STOP_SEARCH_STR               # prints 'for Our Special Task_4'
echo "$STOP_SEARCH_STR"             # prints 'for Our Special Task_4'
echo "grep -F "$STOP_SEARCH_STR" "$TEMP"/draft" # prints grep -F 'for Our Special Task_4' /tmp/draft
echo "$(grep -F "$STOP_SEARCH_STR" "$TEMP"/draft)"  # prints nothing!
echo $("grep -F "$STOP_SEARCH_STR" "$TEMP"/draft")  # prints nothing!

$TEMP/draft テキストファイルの内容は次のとおりです。

2019-11-21 08:13:58,825 Task started: 'Our Special Task_4' of type 'Our - Special Task' 
2019-11-21 08:14:10,509 Task ended: 'Success' for Our Special Task_4 -- Elapsed time: 11.0 seconds

もし私が手動コマンドを入力すると、grep -F 'for Our Special Task_4' /tmp/draftドラフトテキストファイルの2行目が表示されます。

2019-11-21 08:14:10,509 Task ended: 'Success' for Our Special Task_4 -- Elapsed time: 11.0 seconds

しかし、上記の最後の2つのコマンド(bashスクリプト内)は何も印刷しません!

理由をご存知ですか?

ベストアンサー1

変数が展開された後、引用符は特別ではありません。

TASKNAME含まれている場合は、その引用符を含めてOur Special Task_4STOP_SEARCH_STR設定します。'for Our Special Task_4'これがあなたがecho示すものです。

これを実行すると、検索するgrep -F "$STOP_SEARCH_STR" "$TEMP"/draft文字列が提供されますgrep'for Our Special Task_4'文字列がファイルに存在しないため、一致する行がなく、grep何も印刷されません。

引用符を削除すると、探していません。

task="Our Special Task_4"
str="for $task"
grep -F "$str" "$TEMP/draft"

注: あなたする変数を拡張するときに二重引用符を使用する"$str"か、"$STOP_SEARCH_STR"単語の区切りを避ける必要があります。スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?

手動コマンドを入力すると、grep -F 'for Our Special Task_4' /tmp/draft引用符はシェル構文の一部であり、スペース内の特別な意味を効果的に削除します。これは、通常の文字のように動作する変数内の引用符とは異なります。


注:1)echo "$(somecmd)"一般的に重複するので、単に実行することができますsomecmd。 2)ここでは、echo $("grep -F "$STOP_SEARCH_STR" "$TEMP"/draft")引用符で囲まれたスペースのために名前付きコマンドを実行しようとしていますgrep -F 'for。次のエラーが発生する可能性があります。

$ echo $("grep -F "$STOP_SEARCH_STR" "$TEMP"/draft")
bash: grep -F 'for: command not found

おすすめ記事