Bash cli和脚本中的grep行为不同

Bash cli和脚本中的grep行为不同,bash,grep,Bash,Grep,我有一个web服务器,它有一堆不同名称的域服务器,我正在努力清理这些混乱。我正在尝试获取域及其名称服务器的列表。我已经编写了这个简单的脚本,它几乎可以工作: #!/bin/bash for f in `cat mydomains.txt` do echo $f " " >> mydns.txt dig ns $f | grep '^$f' | cut -d $'\t' -f 5 >> mydns.txt echo "" >> mydns

我有一个web服务器,它有一堆不同名称的域服务器,我正在努力清理这些混乱。我正在尝试获取域及其名称服务器的列表。我已经编写了这个简单的脚本,它几乎可以工作:

#!/bin/bash
for f in `cat mydomains.txt`
do
    echo $f " " >> mydns.txt
    dig ns $f | grep '^$f' | cut -d $'\t' -f 5 >> mydns.txt
    echo "" >> mydns.txt
done
到目前为止,所有这些操作都是
echo$f”“>>mydns.txt


如果我使用dig行并替换命令行中应该出现的
$f
,我将得到预期的结果。然而,我的剧本里什么都没有。我知道填充了
$f
变量,因为它回显前一行中的
$f
。为什么它不能在脚本中工作?

可能是Windows风格/Unix风格的换行符问题。将换行符转换为\n而不是\r\n可能会有所帮助


您是否尝试过此处给出的
dos2unix
建议:?

可能是Windows风格/Unix风格的换行符问题。将换行符转换为\n而不是\r\n可能会有所帮助


您是否尝试过此处给出的
dos2unix
建议:?

您的意思是grep for“^$f”?它应该是“^'”$f”,即在变量周围没有记号。它不会以这种方式扩展。

您的意思是对“^$f”进行grep吗?它应该是“^'”$f”,即在变量周围没有记号。它不会以这种方式展开。

单引号阻止shell展开变量。您应该使用双引号:

dig ns "$f" | grep "^$f" | ...

注意,在
dig
调用中,我还在
$f
周围使用了双引号。引用你的变量是很好的做法;有关详细信息,请参阅

单引号阻止shell扩展变量。您应该使用双引号:

dig ns "$f" | grep "^$f" | ...

注意,在
dig
调用中,我还在
$f
周围使用了双引号。引用你的变量是很好的做法;有关详细信息,请参阅

这些文件是在Linux中创建的,并且仅存在于Linux中。没有Windows换行符。在Linux上创建并不一定意味着文本编辑器不使用CRLF换行符。不过,我很高兴你找到了解决问题的办法这些文件是在Linux中创建的,并且仅存在于Linux中。没有Windows换行符。在Linux上创建并不一定意味着文本编辑器不使用CRLF换行符。不过,我很高兴你找到了解决问题的办法就这样!非常感谢,就这样!多谢各位。