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_4
にSTOP_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
答え2
次の行を変更する必要があります。
STOP_SEARCH_STR="'""for $TASKNAME""'"
この行に追加します(たとえば、一重引用符は必要なく、役に立たない)。
STOP_SEARCH_STR="for $TASKNAME"
スクリプトで次の行を使用します(例:示されているように引用)。
grep -F "$STOP_SEARCH_STR" "$TEMP"/draft
エコーを追加したい場合(重複して問題を引き起こす可能性がある)を追加する必要がある場合は、次の行を使用してください(例:すべての拡張(変数とサブシェル)を引用してください):
echo "$(grep -F "$STOP_SEARCH_STR" "$TEMP"/draft")"