【问题标题】:grep in script doesn't work but works in shell [duplicate]脚本中的 grep 不起作用,但在 shell 中起作用 [重复]
【发布时间】:2021-10-04 22:50:15
【问题描述】:

我有这个字符串:

address 0 address-set hostname-of-a-host

还有这个 grep 命令:

file=`/bin/grep -ilr ".*$host_name.*" /path/to/some/files/*

地点:

host_name=`echo $line | cut -d ' ' -f 4-`

我想获取 host_name 以及是否在包含它的路径文件中。

所以,这是代码:

line="address 0 address-set hostname-of-a-host"
host_name=`echo $line | cut -d ' ' -f 4-`
file=`/bin/grep -ilr ".*$host_name.*" /path/to/some/files/*

这些命令可以在 shell 中正常工作。但是,该脚本返回一个空的“文件”变量。我不知道为什么它们不能在脚本中工作,而是在 shell 中工作。

这是 bash 执行的输出(对不起,我必须修改:

root@cpm:/path/# line="address 0 address-set hostname"
root@cpm:/path/# host_name=`echo $line | cut -d ' ' -f 4-`
root@cpm:/path/# file=`/bin/grep -ilr ".*$host_name.*" /path/to/some/files/*
root@cpm:/path/# echo $file
/path/to/some/files/file1

【问题讨论】:

  • 缺少一些结束的反引号。
  • 我建议将set -x 放在脚本的问题部分之前,这样它会打印出正在发生的事情的痕迹(例如,host_name 被设置为什么,正在传递给@ 987654329@ 等),看看它是否符合您的预期。注意:引用/转义看起来很奇怪是正常的,因为它可能会选择与您输入的内容不同(但等效)的引号/转义以获得相同的结果(请参阅this question)。但是如果 in 引号中的东西很奇怪,那会告诉你一些事情。
  • 好的,这是一个非常简单但有用的想法。每行都有一个 \r,因此字符串不匹配。谢谢。

标签: bash shell scripting grep


【解决方案1】:

您可以使用evaleval 接受一个字符串并将其作为命令运行,就像在 shell 命令行中输入它一样。这包括所有引用和扩展处理,只要您不使用用户输入,因为如果用户输入单引号,他们可能会跳出引用并运行任意命令

一个使用eval的例子

host_name=`echo $line | cut -d ' ' -f 4-`
eval "$host_name"

【讨论】:

  • 这无济于事,只会产生新问题。如果不是文件格式,原始文件将起作用。这无论如何都行不通,因为它试图将主机名作为命令运行,但它不是一个。
【解决方案2】:

每行的末尾都有一个 \r 字符。用 set -x 就清楚了。

【讨论】:

  • 我想可能就是这样。带有 DOS/Windows 行尾的文件会导致 unix 工具出现各种奇怪的问题。不管怎样,很高兴你把它整理好了。
最近更新 更多