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

相关内容