今天在写一个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。