首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >shell脚本grep命令

shell脚本grep命令
EN

Stack Overflow用户
提问于 2012-11-12 23:32:13
回答 3查看 2.4K关注 0票数 0

我想使用"grep“命令查看字符串是否包含正斜杠。开始的时候很简单,我写了以下脚本。

代码语言:javascript
复制
foo=someone/books
if [ `echo "$foo" | grep '/'` ]
then
    echo "has forward slash"
fi

然而,问题出在角落里,如果我将变量"foo“设置为以下字符串,

代码语言:javascript
复制
foo="someone/books in stack"

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

代码语言:javascript
复制
grep '/' someone/books in stack

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

代码语言:javascript
复制
case $foo in
    */*)
        echo "has forward slash"
        ;;
    *)
        ;;
esac

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-12 23:47:06

您没有正确使用if语句。if-condition中的命令需要加引号,以便它在展开时成为单个字符串。如下所示:

代码语言:javascript
复制
if [ "`echo "$foo" | grep '/'`" ]
then
    echo "has forward slash"
fi

或者更好的方法是在if条件中检查grep的返回码:

代码语言:javascript
复制
if $(echo "$foo" | grep -q '/')
then
    echo "has forward slash"
fi

您也可以去掉grep,改用下面的代码:

代码语言:javascript
复制
foo="someone/books in stack"
if [[ "$foo" == */* ]]
then
  echo "has forward slash"
fi
票数 2
EN

Stack Overflow用户

发布于 2012-11-12 23:56:53

代码语言:javascript
复制
foo="someone/books with spaces"
bar=`echo $foo | grep '/'`
if [ $? -eq 0 ]
then
    echo "$foo has forward slash"
fi

这对我很有效。

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

票数 0
EN

Stack Overflow用户

发布于 2012-11-13 01:42:42

冗长并没有错--它通常有助于可维护性。但是,您可以将其概括为:您不需要每个换行符,也不需要缺省分支(如果您在其中什么都不做)。

代码语言:javascript
复制
case "$foo" in
    */*) echo "has forward slash" ;;
esac

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

代码语言:javascript
复制
if echo "$foo" | grep -q /; then
    echo "has forward slash"
fi
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13346576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档