我想使用"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由于"space“的原因,上面的"grep”命令有太多非法的参数。仅供参考,我尝试使用case语句来解决此问题:
case $foo in
*/*)
echo "has forward slash"
;;
*)
;;
esac但是,我不想使用case语句,因为它很冗长。那么,我如何使用grep命令或其他命令来解决这个问题呢?
发布于 2012-11-12 23:47:06
您没有正确使用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-12 23:56:53
foo="someone/books with spaces"
bar=`echo $foo | grep '/'`
if [ $? -eq 0 ]
then
echo "$foo has forward slash"
fi这对我很有效。
如果你不想以这种方式使用退出状态,我建议你看看dogbane的回复,以获得更正确的答案。
发布于 2012-11-13 01:42:42
冗长并没有错--它通常有助于可维护性。但是,您可以将其概括为:您不需要每个换行符,也不需要缺省分支(如果您在其中什么都不做)。
case "$foo" in
*/*) echo "has forward slash" ;;
esac如果您坚持使用grep,请使用它的返回状态,而不是输出:
if echo "$foo" | grep -q /; then
echo "has forward slash"
fihttps://stackoverflow.com/questions/13346576
复制相似问题