shell脚本中grep时关于变量带双引号的小问题

    今天在写一个shell脚本的时候,有一个操作是使用grep命令在一个文件中搜索指定内容。指定内容存放在文件中,使用一个变量去获取文件中内容,再传到grep命令中去。

    这段代码如下:

for target in `cat content.txt`
do
     grep $target test.txt >>result.txt
done

 

content.txt文本中的内容为:

"域\[2\]"

"域\[3\]"

"域\[4\]"

    因为使用grep时,最后要执行的命令是(grep "域\[2\]" test.txt),所以直接把双引号写在content.txt的文本中了。然后执行脚本,执行脚本的时候开始不对劲了,直接执行(grep "域\[2\]" test.txt)是能够搜索到内容的。但是在脚本中就是搜索不到内容了,于是添加了“set -x”来查看执行的命令,显示执行的命令就是(grep "域\[2\]" test.txt)。最后折磨了半天,发现原来是content.txt文本中的双引号的问题。改成如下后就执行成功,通过搜索到内容了。

content.txt文本中的内容为:

域\[2\]

域\[3\]

域\[4\]

脚本:

for target in `cat content.txt`
do
grep "$target" test.txt >>result.txt
done

 

于是想了想,又另外写了个脚本测试:

#!/bin/ksh

set -x

grep "\"hello\"" test.c

这个脚本实际模拟的就是上面把双引号当作变量的一部分。

执行结果显示执行的命令是:

+ grep "hello" test.c

和上面那例看到的是一样,表面上看起来是在test.c中搜索hello,但实际上搜索的是("hello"),所以搜索不到。同样,对于之前的例子,我以为搜索的是(域\[2\]),其实搜索的是("域\[2\]"),但是("域\[2\]")这个确实是没有的,所以搜索不到。

 

    也就是如果把双引号放在content.txt传给变量 ,导致双引号作用不再是把要查询的内容引起来,而是双引号是变量的一部分了。最后虽然两个看到的外观一模一样,但是意义却不一样了。哎,shell好神奇啊,不要相信你看到的,哈哈。

 

说明:使用的shell是ksh。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。