2009-10-28 330 views
2

好吧,所以我正在學習Bash,並且有那個練習;Bash腳本 - 腳本內執行和grep命令

「編寫腳本,如果用戶'user000'已登錄,則每10秒檢查一次。」

我的想法是grep a who,但我不知道如何將它合併到腳本中。我試過類似的東西

if [ `who | grep "user000"` ] then things 

但它返回匹配的行與grep,不是真/假。

回答

3

你可以做

who | grep "user000" > /dev/null 2>&1 
# You can use "-q" option of grep instead of redirecting to /dev/null 
# if your grep support it. Mine does not. 
if [ "$?" -eq "0" ] 
then ... 

這使用$? - 一個Shell變量,用於存儲最後執行的命令的返回/退出代碼。 grep成功時退出代碼「0」,失敗時退出非零(例如,沒有找到行返回「1」) - 順便提一下Unix命令的典型安排。

+0

您的重定向'>&!'創建一個名爲「!」的文件。也許你的意思是'... 2>&1>/dev/null' – 2009-10-28 17:10:45

+0

這是因爲我使用csh重定向而不是強制使用sh重定向 - 在年齡中沒有做過任何事情:) – DVK 2009-10-28 17:50:23

+0

而且,投票是??? – DVK 2009-10-28 18:21:09

7

你想要grep -q。這是「安靜模式」;只是根據是否有任何匹配來設置狀態,不輸出任何內容。所以:

if who | grep -q "user000"; then things; fi 
+1

僅供參考 - Solaris的'grep'不支持'-q' – DVK 2009-10-28 16:50:12

+0

DVK:太糟糕了。 POSIX grep自1997年開始指定'-q':http://www.opengroup.org/onlinepubs/7990989775/xcu/grep.html 另外,刪除括號。這是if(var == true){} – guns 2009-10-28 17:54:46

+1

的shell等價物可能要在其中拋出一個「| cut -d1 -b''」並使用「grep'^ user000 $'」。這會避免'user0001'登錄時的誤報。 – 2009-10-28 18:34:22

0

它可能不是最優雅的咒語,但我傾向於使用:

if [ `who | grep "user000" | wc -l` = "1" ]; then .... 
+0

爲什麼不使用'who | grep -c user000'? – innaM 2009-10-28 16:50:17

+0

如果用戶多次登錄,該怎麼辦? – 2009-10-28 17:12:19

+0

@曼尼:沒有想到-c標誌爲grep。那是Posix,還是一個擴展? @丹尼斯:每個登錄shell是否列出一個「who」列表? – 2009-10-28 22:02:18

1

大多數答案都正確的想法,但真的要刪除從grep的所有輸出,包括錯誤。而且,在使需要分號]一個如果:

if who | grep 'user000' >/dev/null 2>&1; then 
    do things 
fi 

如果你正在使用的GNU grep您可以使用-s-q選項,而不是:

if who | grep -sq 'user000'; then 
    do things 
fi 

編輯:下降托架;如果只需要比較OPS

+0

您可以複製文件描述符並縮短重定向規範。 – 2009-10-28 17:19:15

+0

僅當_then_出現在同一行上時才需要使用分號。當_then_在下面一行時,它不是必需的。 – bstpierre 2009-10-28 23:34:35

+0

爲什麼在兩次而不是使用&>時重定向,是否有原因? (純粹的好奇心)。 – LB40 2009-10-29 16:35:41

2

括號如果你在一個ifwhile測試管道或命令的退出代碼,可以去掉方括號和反引號(你應該使用$()而不是反引號反正):

if who | grep "user000" > /dev/null 2>&1 
then 
    things-to-do 
fi 
+0

您也可以在user000附近留下引號。 – Idelic 2009-10-28 21:42:28