[英]CSV Bash loop Issue with Variables
我有一個csv文件,我試圖通過它循環查找是否在csv數據內找到了用戶輸入。 我寫了下面的代碼,有時可能有用,而其他的則無效。 當我嘗試與2位以上的數字進行比較時,它總是會停止工作。 1到9的數字可以正常工作,但是一旦輸入56或99或100,它就會停止工作。
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作為文本編輯器。
我嘗試在IF條件條件中回顯變量ID和變量,但它的行為與測試相同值時不同。 有人可以指出我正確的方向。 謝謝
這是代碼:
#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
您應該在if測試語句中引用變量。 您還應該執行數字test -eq
而不是字符串comparison =
。 因此,您的if
語句應類似於:
if [[ "$ID" -eq "$user" ]]
好吧,您編寫的代碼存在一些問題。
您在read
行上使用r-
而不是-r
我認為您的實際代碼中沒有錯字,否則您不會走得太遠。
同樣,您需要在[
... ]
方括號內留空格: [$ID
是語法錯誤。
您需要在if
子句中引用參數擴展,和/或切換括號類型。 您可能按照@ imp25的建議進行了數值比較,我可以使用((
... ... ))
。
您可能不希望在else
子句中將userType
設置為2,因為對於每個人,除非文件中最后列出的那個人(ID 100,大概是), else
將其設置為2。 您想在循環之外首先將其設置為2。 然后,在循環中找到匹配項時,將其設置為1並退出循環:
userType=2 while IFS=, read -r ID name asignature final; do if (( $ID == $user )); then userType=1; break fi done < notas.csv
您也可以只使用諸如awk之類的shell工具:
userType=$(awk -F, -vtype=2 '($1=="'"$user"'") {type=1}; END {print type}' notas.csv)
或grep
:
grep -q "^$user," notas.csv
userType=$(( $? + 1 ))
等等
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.