在 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")"