2012-11-12 269 views
0

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

+0

實際上不存在這個問題你描述的方式 - 如果你管有空格的文字進入grep,它會工作得很好,因爲它不會像你所描述的那樣將它擴展到greps命令行。用/空格「|」再次驗證'echo「的東西grep'/''實際上工作正常 –

+0

@Yefim Dinitz其實,我嘗試它。它不能正常工作 – eleven

+0

那麼你必須使用我見過的最奇怪的'grep' ... –

回答

2

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

0
foo="someone/books with spaces" 
bar=`echo $foo | grep '/'` 
if [ $? -eq 0 ] 
then 
    echo "$foo has forward slash" 
fi 

這適用於我。

如果你不想用這種方式使用退出狀態,我建議你看看dogbane的回答,以獲得更正確的答案。

0

冗長 - 它通常有助於可維護性。然而,你可以簡化它:你不需要每一個換行符,如果你什麼都不做,你也不需要默認分支。

case "$foo" in 
    */*) echo "has forward slash" ;; 
esac 

如果你堅持用grep,使用從它的返回狀態,而不是輸出:

if echo "$foo" | grep -q /; then 
    echo "has forward slash" 
fi