2014-10-07 83 views
0

我有一個簡單的腳本,用於檢查名稱是否存在於列表中,如果不存在,它會添加它,但由於循環不會停止,所以我遇到了問題!如果名稱不存在,則將名稱添加到列表中

我有這樣與人的名單:

名1

名2

NAME3

列表的名稱names.txt中

b=$1 
FILE=names.txt 
while read F ; do 
    if [ "$b" != "$F" ] 
    then 
     echo "$b" >> names.txt 
     /home/tests/emailSend.sh 
    fi 
done < $FILE 

我想要做的是,當我運行腳本時,我想檢查名稱是否在列表中,如果是,則不會發生任何事情,如果不是,則比我想將名稱添加到列出併發送電子郵件!

如果我像這樣運行腳本,它永遠不會結束,並在列表中添加相同的名稱!

+0

現在它看起來你是不一致在'$ a'和'$ b'之間,但這不是你的根本原因。見下面的答案。 – 2014-10-07 19:48:10

+0

這是一個錯字!編輯帖子! – 2014-10-07 19:50:25

回答

0

如果列表中的任何名稱與輸入不匹配,則當前循環訪問列表並添加名稱。它看起來像你想匹配,如果所有名稱不匹配。

b=$1 
FILE=names.txt 
MATCHED=false 
while read F ; do 
    if [ "$b" = "$F" ] 
    then 
    MATCHED=true 
    break 
    fi 
done < $FILE 

# Now check MATCHED 
if ! $MATCHED 
then 
    echo "$b" >> names.txt 
    /home/tests/emailSend.sh 
fi 
+0

是的,這工作!謝謝@Jeff Bowman – 2014-10-07 19:55:26

4

你不通過文件需要循環,只要使用grep -vx這樣的:

grep -xFqv "$1" names.txt && echo "$1" >> names.txt 
+1

你會想要指定'-x'來匹配整行;否則,如果名稱出現在該行的任何位置,就會匹配。 – 2014-10-07 19:51:39

+1

謝謝@JeffBowman:好點。我編輯過。 – anubhava 2014-10-07 19:52:40

0

檢查了這一點:

sort -u <(echo $1) names.txt > temp; mv temp names.txt 
+0

漂亮!有沒有辦法使用返回值或差異結果來觸發一個動作(問題中的'emailSend.sh')? – 2014-10-07 21:17:36

+0

錯過了$ 1。通過anubhava檢查答案,'grep -v ... &&如果grep找不到匹配,則執行其他操作 – 2014-10-07 21:29:10

相關問題