2012-11-12 65 views
0

我想使用“grep”命令查找一个字符串是否包含正斜杠。一开始很容易,我写了下面的脚本。shell脚本grep命令

foo=someone/books 
if [ `echo "$foo" | grep '/'` ] 
then 
    echo "has forward slash" 
fi 

然而,问题是在角落里,如果我设置变量“富”到下面的字符串,

foo="someone/books in stack" 

以上脚本将因为有“空间”中的变量失败foo,当命令扩展时,if语句中的条件如下。

grep '/' someone/books in stack 

由于“空间”,上面的“grep”命令有太多的参数是非法的。仅供参考,我尝试使用case语句解决此问题:

case $foo in 
    */*) 
     echo "has forward slash" 
     ;; 
    *) 
     ;; 
esac 

但是,我不想使用case语句,因为它是冗长的。那么我怎么能用grep命令或其他方法解决这个问题?

+0

实际上不存在这个问题你描述的方式 - 如果你管有空格的文字进入grep,它会工作得很好,因为它不会像你所描述的那样将它扩展到greps命令行。用/空格“|”再次验证'echo“的东西grep'/''实际上工作正常 –

+0

@Yefim Dinitz其实,我尝试它。它不能正常工作 – eleven

+0

那么你必须使用我见过的最奇怪的'grep' ... –

回答

2

您没有正确使用if语句。 if条件中的命令需要引用,以便在展开时变为单个字符串。就像这样:

if [ "`echo "$foo" | grep '/'`" ] 
then 
    echo "has forward slash" 
fi 

甚至更​​好的是,如果你在检查的grep的返回码你如果条件:

if $(echo "$foo" | grep -q '/') 
then 
    echo "has forward slash" 
fi 

您也可以废除的grep,用这个代替:

foo="someone/books in stack" 
if [[ "$foo" == */* ]] 
then 
    echo "has forward slash" 
fi 
+0

我知道。但是/ bin/sh而不是/ bin/bash呢 – eleven

0
foo="someone/books with spaces" 
bar=`echo $foo | grep '/'` 
if [ $? -eq 0 ] 
then 
    echo "$foo has forward slash" 
fi 

这适用于我。

如果你不想用这种方式使用退出状态,我建议你看看dogbane的回答,以获得更正确的答案。

0

冗长 - 它通常有助于可维护性。然而,你可以简化它:你不需要每一个换行符,如果你什么都不做,你也不需要默认分支。

case "$foo" in 
    */*) echo "has forward slash" ;; 
esac 

如果你坚持用grep,使用从它的返回状态,而不是输出:

if echo "$foo" | grep -q /; then 
    echo "has forward slash" 
fi