0

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

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

但是,问题出在拐角处,如果我将变量“foo”设置为以下字符串,

foo="someone/books in stack"

上面的脚本会失败,因为变量 foo 中有“空格”,当命令展开时,if 语句中的条件如下。

grep '/' someone/books in stack

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

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

但是,我不想使用 case 语句,因为它很冗长。那么如何使用 grep 命令或其他命令来解决这个问题呢?

4

3 回答 3

2

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

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

或者更好的是,如果您在 if 条件中检查 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
于 2012-11-12T15:47:06.273 回答
0
foo="someone/books with spaces"
bar=`echo $foo | grep '/'`
if [ $? -eq 0 ]
then
    echo "$foo has forward slash"
fi

这对我有用。

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

于 2012-11-12T15:56:52.867 回答
0

冗长并没有错——它通常有助于可维护性。但是,您可以将其简化:您不需要每个换行符,如果您在其中不执行任何操作,也不需要默认分支。

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

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

if echo "$foo" | grep -q /; then
    echo "has forward slash"
fi
于 2012-11-12T17:42:41.657 回答