手机版
你好,游客 登录 注册
背景:
阅读新闻

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

[日期:2015-02-15] 来源:Linux社区  作者:yiqianghua [字体: ]

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

grep使用简明及正则表达式  http://www.linuxidc.com/Linux/2013-08/88534.htm

Linux下Shell编程——grep命令的基本运用 http://www.linuxidc.com/Linux/2013-06/85525.htm

grep 命令详解及相关事例 http://www.linuxidc.com/Linux/2014-07/104041.htm

Linux基础命令之grep详解 http://www.linuxidc.com/Linux/2013-07/87919.htm

设置grep高亮显示匹配项 http://www.linuxidc.com/Linux/2014-09/106871.htm

Linux grep命令学习与总结 http://www.linuxidc.com/Linux/2014-10/108112.htm

本文永久更新链接地址http://www.linuxidc.com/Linux/2015-02/113500.htm

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款