在 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
如果我手动输入 command 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 脚本中)什么也没打印!
知道为什么吗?
扩展变量后,引号并不特殊。
假设
TASKNAME
containsOur 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
打印任何内容。删除引号,您不是在寻找它们:
注意:您确实需要在变量扩展周围使用双引号
"$str"
或"$STOP_SEARCH_STR"
防止分词,请参阅为什么我的 shell 脚本会因空格或其他特殊字符而窒息?当您手动键入 command
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
. 你可能应该得到一个错误:你应该改变这一行:
到这一行(是的,不需要单引号,它们没用):
并在脚本中使用这一行(是的,如图所示):
如果您想/需要添加回声(这是多余的,甚至可能导致问题)使用此行(是的,引用所有扩展(变量和子shell)):