2012-03-02 66 views
1

您好我正在嘗試編寫一個名稱作爲參數的bourne-shell腳本,並檢查用戶是否已登錄並輸出消息。誰在bourne-shell中返回值

這是我到目前爲止,但我的情況是錯誤的。

if test "who|grep $1" == "$1" //the problem is that it takes the hole 1st column 
then 
    who|grep $1|awk '{print $5}' 
else 
    echo user not logged in 
fi 

有幫助嗎?提前致謝。

+0

我算了4個錯誤。 – 2012-03-02 01:21:57

+0

@ IgnacioVazquez-Abrams:這是否包括競賽條件? – Johnsyweb 2012-03-02 05:46:55

回答

2

1)您的狀況完全被玷污。

2)你的正則表達式是不準確的。

3)你在混合grep和awk。

4)你沒有引用你的echo參數。

if who | grep -q "^$1\s" 
then 
    who | awk -v user="$1" '$1 == user { print $5 }' 
else 
    echo "user not logged in" 
fi 

更換第一grepawk就留給讀者自己練習。

+0

+1:爲了指出沒有必要混合'grep'和'awk' [已經完成替換練習;]]並將'user'放入一個變量中,我已經編輯了我的答案來加入它。 – Johnsyweb 2012-03-02 03:59:01

+0

我試過你的代碼,但它總是打印'用戶沒有登錄',如果它不是太多問你可以解釋你的狀況嗎? – Glove 2012-03-02 04:00:15

3

這裏有一些注意事項。

1)使用[而不是測試 - 測試只是它的一個別名。 ([不是語法,它是程序的名稱。)

2)//在shell中不是註釋。 :)同樣,「」s中的事情,比如「who | grep ...」將不會被執行,它們將被shell視爲文字。

3)先做人| grep ... | awk提取特定列。

4)你可以做這樣的事情

變量= $(誰捕獲3輸出)| THEN ...)

5),你可以做,如果[-z「$變量「 ] 或者其他的東西。

6)或者,檢查誰| fgrep -w ... | wc -l的產量大於零。

有可能有十幾種其他方式來擺動這一點。

+0

6)你是什麼意思?對不起,我剛開始B殼 – Glove 2012-03-02 01:43:06

+0

如果列有例如3行如何將只捕獲第一列的第三行?\ – Glove 2012-03-02 01:49:27

+0

由6)我的意思是,使用wc -l來統計grep的輸出行。詳細信息請閱讀wc手冊頁。我不明白你的第二個問題,因爲我看到用戶是否登錄。 – Perry 2012-03-02 01:53:34

4

如果你真的想用whoawk

who | awk -v user="$1" ' 
$1 == user { 
    found = 1 
    print $5 
} 

END { 
    if (!found) { 
     print "user not logged in" 
    } 
}' 

就個人而言,我只想用finger

+0

這是bourne-shell嗎? – Glove 2012-03-02 01:38:27

+0

這是(大部分)'awk'。它應該在大多數炮彈中工作。 – Johnsyweb 2012-03-02 02:02:58