我想使用“grep”命令查找字符串是否包含正斜杠。一开始很容易,我写了下面的脚本。
foo=someone/books
if [ `echo "$foo" | grep '/'` ]
then
echo "has forward slash"
fi
然而,如果我将变量“foo”设置为以下字符串,问题就在角落里,
foo="someone/books in stack"
上面的脚本将失败,因为变量foo中有“space”,当命令扩展时,if语句中的条件如下所示。
grep '/' someone/books in stack
由于“空格”,上面的“grep”命令有太多的参数是非法的。仅供参考,我尝试使用案例陈述来解决这个问题:
case $foo in
*/*)
echo "has forward slash"
;;
*)
;;
esac
但是,我不想使用case语句,因为它很冗长。那么我怎么能用grep命令或其他人解决这个问题呢?
答案 0 :(得分:2)
您没有正确使用if语句。需要引用if条件中的命令,以便在展开时它成为单个字符串。像这样:
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
答案 1 :(得分:0)
foo="someone/books with spaces"
bar=`echo $foo | grep '/'`
if [ $? -eq 0 ]
then
echo "$foo has forward slash"
fi
这适合我。
如果您不想以这种方式使用退出状态,我建议您查看dogbane的回复以获得更正确的答案。
答案 2 :(得分:0)
冗长并没有错 - 它通常有助于可维护性。但是,您可以将其简化:您不需要每个换行符,如果您不执行任何操作,也不需要默认分支。
case "$foo" in
*/*) echo "has forward slash" ;;
esac
如果你坚持使用grep,请使用它的返回状态,而不是输出:
if echo "$foo" | grep -q /; then
echo "has forward slash"
fi