好吧,所以我正在學習Bash,並且有那個練習;Bash腳本 - 腳本內執行和grep命令
「編寫腳本,如果用戶'user000'已登錄,則每10秒檢查一次。」
我的想法是grep
a who
,但我不知道如何將它合併到腳本中。我試過類似的東西
if [ `who | grep "user000"` ] then things
但它返回匹配的行與grep,不是真/假。
好吧,所以我正在學習Bash,並且有那個練習;Bash腳本 - 腳本內執行和grep命令
「編寫腳本,如果用戶'user000'已登錄,則每10秒檢查一次。」
我的想法是grep
a who
,但我不知道如何將它合併到腳本中。我試過類似的東西
if [ `who | grep "user000"` ] then things
但它返回匹配的行與grep,不是真/假。
你可以做
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命令的典型安排。
你想要grep -q
。這是「安靜模式」;只是根據是否有任何匹配來設置狀態,不輸出任何內容。所以:
if who | grep -q "user000"; then things; fi
僅供參考 - Solaris的'grep'不支持'-q' – DVK 2009-10-28 16:50:12
DVK:太糟糕了。 POSIX grep自1997年開始指定'-q':http://www.opengroup.org/onlinepubs/7990989775/xcu/grep.html 另外,刪除括號。這是if(var == true){} – guns 2009-10-28 17:54:46
的shell等價物可能要在其中拋出一個「| cut -d1 -b''」並使用「grep'^ user000 $'」。這會避免'user0001'登錄時的誤報。 – 2009-10-28 18:34:22
它可能不是最優雅的咒語,但我傾向於使用:
if [ `who | grep "user000" | wc -l` = "1" ]; then ....
爲什麼不使用'who | grep -c user000'? – innaM 2009-10-28 16:50:17
如果用戶多次登錄,該怎麼辦? – 2009-10-28 17:12:19
@曼尼:沒有想到-c標誌爲grep。那是Posix,還是一個擴展? @丹尼斯:每個登錄shell是否列出一個「who」列表? – 2009-10-28 22:02:18
大多數答案都正確的想法,但真的要刪除從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
括號如果你在一個if
或while
測試管道或命令的退出代碼,可以去掉方括號和反引號(你應該使用$()
而不是反引號反正):
if who | grep "user000" > /dev/null 2>&1
then
things-to-do
fi
您也可以在user000附近留下引號。 – Idelic 2009-10-28 21:42:28
您的重定向'>&!'創建一個名爲「!」的文件。也許你的意思是'... 2>&1>/dev/null' – 2009-10-28 17:10:45
這是因爲我使用csh重定向而不是強制使用sh重定向 - 在年齡中沒有做過任何事情:) – DVK 2009-10-28 17:50:23
而且,投票是??? – DVK 2009-10-28 18:21:09