2017-10-15 72 views
2

我試圖找到使用bash中的一種特殊處理的數量,如果條件爲猛砸oneliner與管道,如果條件給錯誤

if ps auwx | grep -v grep | grep -ic python -le 2; then echo error; else echo no_error; fi 

和我得到的輸出作爲

grep: python: No such file or directory 

NO_ERROR

如果我使用管道,單線程似乎會中斷,並且如果省略管道,則不會引發錯誤,如果使用grep的絕對路徑也無關緊要。如果沒有使用管道,我無法獲得所需的結果管道。我在這裏做錯了什麼?我可以在腳本文件中完成這項工作,將其分解爲變量,然後進行比較,但我將其用作練習來學習bash。任何幫助是極大的讚賞。

+1

檢查'pgrep'是否在您的機器上可用。 – chepner

回答

4

首先,使用命令替換,if命令的語法是:

if cmd; then 
    # cmd exited with status 0 (success) 
else 
    # cmd exited with status >0 (fail) 
fi 

上述cmd是所謂列表 - 的序列管道。每個管道都是一系列以|分隔的命令。

-le操作者由test命令(也稱爲[,或[[)解釋,而不是由if命令。

所以,當你說:

if ps auwx | grep -v grep | grep -ic python -le 2; then ... fi 

你居然叫grep與參數:

grep -ic python -le 2 

而且,由於-e用於指定的搜索模式,參數python被解釋爲一個文件名的文件搜索模式2。這就是爲什麼grep告訴你它無法找到名爲python的文件。

要測試的一個命令管道的輸出在if,可以使用命令替換的[[/[/test內(作爲對方的回答表明):

if [[ $(ps auwx | grep -v grep | grep -ic python) -le 2 ]]; then ... fi 

,或者內((..)),與隱算術比較:

if (($(ps auwx | grep -v grep | grep -ic python) <= 2)); then ... fi 
+3

爲了擴大這個位:在bash腳本中,context *很重要*。在某些情況下意味着一件事的語法元素(例如,'-le'意味着小於或等於'[]'或'[[]]'內部)通常意味着在其他上下文中完全不同的東西(例如,在「grep」命令)。 '[]'中的語法規則與'[[]]'中的語法規則略有不同,這與'(())'完全不同,這些都沒有任何與'$ {}' ',以上所有內容都與您可以在命令行中單獨使用的內容不同。 –

2

在條件

if [[ $(ps ...) -le 2 ]]; then 
+0

謝謝@ nahuel-fouilleul,但它再次給我一個錯誤。我根據你的回答重新編寫了if [[$(ps auwx |/usr/bin/grep -v'grep'|/usr/bin/grep -ic'python')-le 2]];然後回顯「錯誤」;其他回聲「no_error」; fi',它給了我以下錯誤'bash:條件表達式中的語法錯誤:意外的令牌';' bash:';'附近的語法錯誤''' – file2cable

+2

應該有一個空格'2]]' – RomanPerekhrest