考虑一下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/草稿文本文件中的以下内容:
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但是上面的最后两个命令(在bash脚本中)不打印任何东西!
知道为什么吗?
发布于 2019-11-23 19:09:06
变量展开后,引号并不特殊。
假设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时,引号是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发布于 2019-11-23 23:39:00
您应该更改这一行:
STOP_SEARCH_STR="'""for $TASKNAME""'"对于这一行(是的,不需要单引号,它们是无用的):
STOP_SEARCH_STR="for $TASKNAME"并在脚本中使用这一行(是的,引用如下所示):
grep -F "$STOP_SEARCH_STR" "$TEMP"/draft如果希望/需要添加回波(这是超流,甚至可能导致问题),请使用这一行(是的,引用所有扩展(变量和子subshell)):
echo "$(grep -F "$STOP_SEARCH_STR" "$TEMP"/draft")"https://unix.stackexchange.com/questions/553800
复制相似问题