今天在写一个shell脚本的时候,有一个操做是使用grep命令在一个文件中搜索指定内容。指定内容存放在文件中,使用一个变量去获取文件中内容,再传到grep命令中去。shell
这段代码以下:ide
for target in `cat content.txt`
do
grep $target test.txt >>result.txt
done测试
content.txt文本中的内容为:get
"域\[2\]"it
"域\[3\]"class
"域\[4\]"test
由于使用grep时,最后要执行的命令是(grep "域\[2\]" test.txt),因此直接把双引号写在content.txt的文本中了。而后执行脚本,执行脚本的时候开始不对劲了,直接执行(grep "域\[2\]" test.txt)是可以搜索到内容的。可是在脚本中就是搜索不到内容了,因而添加了“set -x”来查看执行的命令,显示执行的命令就是(grep "域\[2\]" test.txt)。最后折磨了半天,发现原来是content.txt文本中的双引号的问题。改为以下后就执行成功,可以搜索到内容了。变量
content.txt文本中的内容为:搜索
域\[2\]grep
域\[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。