>我有一个csv文件,我试图循环访问该文件,目的是找出是否在csv数据中找到用户输入。我编写了以下代码,有时有效,有时无效。当我尝试与 2+ 位数字进行比较时,它总是停止工作。它适用于数字 1 到 9,但是一旦 u 输入,比如说 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 作为文本编辑器。
我尝试回显变量 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
好吧,您编写的代码存在一些问题。
-
你有
r-
而不是-r
在read
行 - 我认为这是一个错别字,在你的实际代码中不存在,否则你不会走得太远。 -
同样,您需要
[
周围的空间...]
括号:[$ID
是语法错误。 -
您需要在
if
子句和/或开关支架类型中引用参数扩展。您可能会按照@imp25的建议将其进行数字比较,我会使用((
来做到这一点......))
. -
您可能不想在
else
子句中将userType
设置为 2,因为这会将除文件中最后列出的任何人(大概是 ID 100)之外的所有人将其设置为 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 ))
等。
你应该在 if test 语句中引用你的变量。您还应该执行数值测试-eq
而不是字符串比较=
。因此,您的if
语句应如下所示:
if [[ "$ID" -eq "$user" ]]