shell脚本grep命令
问题描述:
我想使用“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命令或其他方法解决这个问题?
答
您没有正确使用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
答
foo="someone/books with spaces"
bar=`echo $foo | grep '/'`
if [ $? -eq 0 ]
then
echo "$foo has forward slash"
fi
这适用于我。
如果你不想用这种方式使用退出状态,我建议你看看dogbane的回答,以获得更正确的答案。
答
冗长 - 它通常有助于可维护性。然而,你可以简化它:你不需要每一个换行符,如果你什么都不做,你也不需要默认分支。
case "$foo" in
*/*) echo "has forward slash" ;;
esac
如果你坚持用grep,使用从它的返回状态,而不是输出:
if echo "$foo" | grep -q /; then
echo "has forward slash"
fi
实际上不存在这个问题你描述的方式 - 如果你管有空格的文字进入grep,它会工作得很好,因为它不会像你所描述的那样将它扩展到greps命令行。用/空格“|”再次验证'echo“的东西grep'/''实际上工作正常 –
@Yefim Dinitz其实,我尝试它。它不能正常工作 – eleven
那么你必须使用我见过的最奇怪的'grep' ... –