设为首页 加入收藏

TOP

shell脚本中grep时关于变量带双引号的小问题
2015-02-25 16:15:39 来源: 作者: 【 】 浏览:36
Tags: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。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Python pickle模块的简单使用笔记 下一篇关于Python模块和包

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: