2013-05-09 107 views
5

下面的脚本输出为空。它缺少什么?我想用grep一个字符串shell脚本grep grep一个字符串

#!/bin/ksh  
file=$abc_def_APP_13.4.5.2  
if grep -q abc_def_APP $file; then 
echo "File Found" 
else 
echo "File not Found" 
fi 
+2

为什么#!行说ksh? – jman 2013-05-09 18:09:16

+1

'file'应该是什么值?我怀疑你可能在该作业的RHS上存在问题。 – chepner 2013-05-09 18:14:07

回答

9

bash,使用<<<重定向从一个字符串('Here string'):

if grep -q abc_def_APP <<< $file 

在其他炮弹,你可能需要使用:

if echo $file | grep -q abc_def_APP 

我把我的then放在下一行;如果你想让你的then在同一行上,然后在我写的东西之后加上; then


需要注意的是这个任务:

file=$abc_def_APP_13.4.5.2 

是非常奇怪的;它采用环境变量${abc_def_APP_13}的值并在末尾添加.4.5.2(由于我们可以看到脚本的开始,它必须是env var)。你可能打算写:

file=abc_def_APP_13.4.5.2 

在一般情况下,你应该附上持有的文件名用双引号变量的引用,以避免在文件名中的空格等问题。这里并不重要,但最佳做法是良好做法:

if grep -q abc_def_APP <<< "$file" 
if echo "$file" | grep -q abc_def_APP 
+0

如果我使用'if echo $ file | grep -q abc_def_APP这是打印$文件的内容,我不想 – Jill448 2013-05-09 18:12:15

+0

您选择了'-q'选项使'grep'以'quiet'模式运行(每个[POSIX](http:// pubs .opengroup.org/onlinepubs/9699919799 /公用事业/ grep.html));它不应该输出任何东西。如果你的'grep'版本对'-q'有不同的理解,你必须看看你的man'grep'的手册页,或者重定向到'/ dev/null'。 – 2013-05-09 18:16:13

+0

第一个人工作。 '如果grep -q abc_def_APP <<< $文件' – Jill448 2013-05-09 18:17:06

3

Yu!使用外壳的字符串匹配

if [[ "$file" == *abc_def_APP* ]]; then ... 
+0

你不用冒着与'* abc_def_APP *'匹配多个文件的风险并且破坏了这个过程中的条件吗?如果'$ file'为'abc_def_APP1'且'* abc_def_APP *'扩展为'abc_def_APP1 abc_def_APP2',那么该条件将被评估为false。 – Anthony 2014-11-01 13:08:22

+0

和关于“Yuck!”部分我完全同意你的看法!整个unix(unix-like)命令外壳令人恶心......但你不能没有它,你能吗? – Anthony 2014-11-01 13:14:02

+0

在双括号内,我们模式匹配左侧字符串,不匹配文件名。 – 2014-11-02 02:32:30