Bash 字串 eval 不清楚

Bash 字串 eval 不清楚

在 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

變數展開後,引號並不特殊。

假設TASKNAMEcontains 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")"

相關內容