簡體   English   中英

shell腳本grep命令

[英]shell scripting grep command

我想使用“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命令或其他方法解決這個問題呢?

您沒有正確使用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
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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM