2013-11-05 110 views
0

我有一個csv文件,即時通訊嘗試循環,目的是要找出是否在csv數據中找到用戶輸入。我寫了下面的代碼,有時可以使用,其他代碼不可以。當我試圖比較2位數字時,它總是停止工作。它適用於數字1到9,但是一旦你輸入說56或99或100,它就停止工作。CSV Bash循環問題與變量

csv數據是逗號分隔的,我有大約300行他們就是這樣。

1,John Doe,Calculus I,5.0 
1,John Doe,Calculus II,4.3 
1,John Doe,Physics II,3.5 
2,Mary Poppins,Calculus I,3.7 
2,Mary Poppins,Calculus II,4.7 
2,Mary Poppins,Physics I,3.7 

數據就像這樣,直到ID#100爲止,總共有300行。 sh文件和csv文件都在同一個文件夾中,我使用全新安裝的Ubuntu 12.04.3,使用gedit作爲文本編輯器。

我試着迴應變量ID和IF條件內,但它不會像測試相同的值時那樣運行。有人能指出我正確的方向嗎?由於

下面的代碼:

#s!/bin/bash 
echo "enter your user ID"; 
read user; 

INPUT_FILE=notas.csv 
while IFS="," read r- ID name asignature final; 
do 
if [$ID = $user]; then 
userType=1; 
else 
userType=2; 
fi 
done < notas.csv 
+0

你的意思是' - r',而不是'r'。 –

回答

0

嗯,寫代碼有幾個問題。

  1. 你有r-,而不是-rread行 - 我認爲這是不存在的實際代碼一個錯字或你不會走得很遠。

  2. 同樣,您需要在[ ...... ]附近的空格括號:[$ID是一個語法錯誤。

  3. 您需要引用if子句中的參數擴展和/或切換括號類型。您可能會將它作爲@ imp25建議的數字比較,我會通過使用(( ... ))來完成。

  4. 你可能不希望設置userType 2在else條款,因爲這將它設置爲2,除了不管是誰最後列出的文件中的每個人(ID 100,大概)。你想先把它設置爲2,在循環之外。然後,當你找到一個匹配的循環中,將其設置爲1,並打破循環:

    userType=2 
    while IFS=, read -r ID name asignature final; do 
        if (($ID == $user)); then 
        userType=1; 
        break 
        fi 
    done < notas.csv 
    

你也可以只使用shell工具,如awk:

userType=$(awk -F, -vtype=2 '($1=="'"$user"'") {type=1}; END {print type}' notas.csv) 

grep

grep -q "^$user," notas.csv 
userType=$(($? + 1)) 

0

你應該引用您的變量中,如果測試聲明。您還應該執行數字測試-eq而不是字符串比較=。所以,你的if語句應該是這樣的:

if [[ "$ID" -eq "$user" ]]