首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >巴什字符串eval不清楚

巴什字符串eval不清楚
EN

Unix & Linux用户
提问于 2019-11-23 18:18:17
回答 2查看 69关注 0票数 0

考虑一下bash脚本中的以下内容:

代码语言:javascript
复制
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/草稿文本文件中的以下内容:

代码语言:javascript
复制
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 <#>,将收到草稿文本文件中的第二行:

代码语言:javascript
复制
2019-11-21 08:14:10,509 Task ended: 'Success' for Our Special Task_4 -- Elapsed time: 11.0 seconds

但是上面的最后两个命令(在bash脚本中)不打印任何东西!

知道为什么吗?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 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什么也不打印。

去掉引号,你就不会去找它们了:

代码语言:javascript
复制
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的命令。您可能会因此而得到一个错误:

代码语言:javascript
复制
$ echo $("grep -F "$STOP_SEARCH_STR" "$TEMP"/draft")
bash: grep -F 'for: command not found
票数 3
EN

Unix & Linux用户

发布于 2019-11-23 23:39:00

您应该更改这一行:

代码语言:javascript
复制
STOP_SEARCH_STR="'""for $TASKNAME""'"

对于这一行(是的,不需要单引号,它们是无用的):

代码语言:javascript
复制
STOP_SEARCH_STR="for $TASKNAME"

并在脚本中使用这一行(是的,引用如下所示):

代码语言:javascript
复制
grep -F "$STOP_SEARCH_STR" "$TEMP"/draft

如果希望/需要添加回波(这是超流,甚至可能导致问题),请使用这一行(是的,引用所有扩展(变量和子subshell)):

代码语言:javascript
复制
echo "$(grep -F "$STOP_SEARCH_STR" "$TEMP"/draft")"
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/553800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档