
在 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
,我收到草稿文字檔案中的第二行:
2019-11-21 08:14:10,509 Task ended: 'Success' for Our Special Task_4 -- Elapsed time: 11.0 seconds
但上面的最後 2 個指令(在 bash 腳本內)什麼也沒列印!
知道為什麼嗎?
答案1
變數展開後,引號並不特殊。
假設TASKNAME
contains 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"
防止分詞,請參閱為什麼我的 shell 腳本會因為空格或其他特殊字元而卡住?
當你手動鍵入指令grep -F 'for Our Special Task_4' /tmp/draft
,引號是 shell 語法的一部分,可以有效地刪除其中空格的特殊意義。這與變數內的引號不同,後者的作用類似於普通字元。
順便說一句: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
如果您想要/需要添加回顯(這是多餘的,甚至可能會導致問題),請使用此行(是的,引用所有擴展(變數和子shell)):
echo "$(grep -F "$STOP_SEARCH_STR" "$TEMP"/draft")"