2014-02-18 21 views
1

開頭我想在Bash中使用if/then聲明,我似乎無法使其工作。我想說的是「如果該行以>字符開始,那麼做這個,否則做別的事情」。Bash:如果行以>

我:

while IFS= read -r line 
do 
    if [[$line == ">"*]] 
    then 
     echo $line'first' 
    else 
     echo $line'second' 
    fi 
done 

但它無法正常工作。 我也試圖逃避「>」說:

if [[$line == ^\>*]] 

哪個也沒有工作。 我得到這個錯誤的兩種方法:

line 27: [[>blah: command not found 

建議?

+0

我d建議使用'='而不是'==' - 否則你的習慣會咬你如果你曾經在純POSIX shell(運算符是'=',而不是'==')上使用'[「$ foo」==「$ bar」]''。 –

+0

@mbratch,你正在使用模式語法(其中錨定是隱式的)混合RE語法(其中'^'是合適的)。 –

+0

@CharlesDuffy我並沒有試圖讓這個部分正確,這不是我的觀點。我只是舉例說明了使用op的例子。我的觀點是關於空間。 – lurker

回答

4

空間需要內部[[ and ]]如下:

if [[ "$line" == ">"* ]]; then 
    echo "found" 
else 
    echo "not found" 
fi 
+1

這裏有一個問題 - 如果第一個'echo'出於某種原因失敗(標準輸出關閉?),第二個將會運行(這與回聲有關,但可能與其他代碼無關)。最好不要對待'foo && bar || baz'作爲三元組,因爲它不是。 –

+1

...並且不,不需要引用'[[$ foo =「$ bar」]]'的左側;這是使用'[[]]'而不是'[]'的關鍵優勢之一。 –

+0

謝謝,是的,我知道關於三元操作的陷阱,讓我編輯它保留'if/else'。 – anubhava

1

間距是非常重要的。

$ [[ ">test" == ">"* ]]; echo $? 
0 
$ [[ "test" == ">"* ]]; echo $? 
1 
2

這種嘗試嘗試使用正則表達式:

line="> line" 
if [[ $line =~ ^\> ]] ; then 
    echo "found" 
else 
    echo "not found" 
fi 

這一個使用glob模式:用grep

line="> line" 
if [[ $line == \>* ]] ; then 
    echo "found" 
else 
    echo "not found" 
fi 
+2

效率極低(產生一個子過程而不是使用本地比較),以及'&& $?'應該達到的是什麼? '$?'總是非空的,無論是「0」還是「1」,並且測試都不起作用。 –

+0

@CharlesDuffy更好? ;) – hek2mgl

+0

更好。不是使用glob的正則表達式的粉絲,但這肯定不會是-1。 –

0
if grep -q '>' <<<$line; then 
    .. 
else 
    .. 
fi 

好得多:)

+0

你的情況是什麼?你爲什麼這麼認爲? – leekaiinthesky