我在从 Linux 计算机上的 csv 文件获取变量并在if
.我有以下 csv:
Name;Age
Marc;18
Joseph;10
我正在尝试从 csv 中获取此信息以在函数中使用:
我的bash代码:
#!/bin/ksh
while IFS=";" read -r c_1 c_2
do
echo "Name : $c_1"
echo "Age : $c_2"
if [ $c_2 == "18" ]
then
echo "$c_1 can drive"
fi
done < <(tail -n +2 teste_input.csv)
运行我的代码后,我得到:
Name : Marc
Age : 18
Name : Joseph
Age : 10
我期待着:
Name : Marc
Age : 18
Marc can drive
Name : Joseph
Age : 10
我已经尝试了很多东西但没有成功。我可以毫无问题地使用c_1
and作为某些函数的输入。c_2
问题出在我尝试进行数学运算时。
如果我做:
s=$c_2+1
d=$((${c_2}+1))
它返回:
+1
+1")syntax error: invalid arithmetic operator (error token is "
使用同样的问题 d=$(("${c_2}+1"))
。
我应该改变什么才能让它运行?使用#!/bin/ksh
, #!/bin/sh
or#!/bin/bash
给出了相同的结果。
感谢您的帮助 :)
答案1
您的第一个问题是您正在使用 Windows 文本文件。您的 csv 具有 Windows 样式的行结尾 ( \r\n
)。您可以使用以下方法修复该问题:
dos2unix teste_input.csv
或者,如果您尚未dos2unix
安装,只需执行以下操作:
sed -i 's/\r//g' teste_input.csv
这将使您的代码产生您期望的输出。几乎:
$ foo.sh teste_input.fixed.csv
Name : Marc
Age : 18
$c_1 can drive
Name : Joseph
Age : 10
这$c_1
是因为这一行中的单引号:
echo '$c_1 can drive'
变量不会在单引号内扩展,因此您看到的$c_1
不是变量的值。你需要:
echo "$c_1 can drive"
下一个问题是==
字符串比较而不是算术。它在这里可以工作,但如果您想比较数值,您需要-eq
:
if [ $c_2 -eq "18" ]
但是,根据您的“可以驱动”输出,我怀疑您想检查变量的值是否等于或大于18
,因此您将使用-ge
:
if [ $c_2 -ge "18" ]
最后,您需要选择一个 shell 来使用。ksh
与 不一样 与bash
不一样sh
。虽然它们具有极其相似的语法,但并不完全相同,并且根据您使用的内容,某些功能的工作方式会有所不同。例如,sh
不支持<(command)
.
至于你尝试的算术,你只需要确保语法正确,你需要使用“算术上下文”。s=$c_2+1
只是做了一个简单的变量赋值。它将变量的值设置为的$s
值$c_2
细绳 +1
添加:
$ c_2=10
$ s=$c_2+1
$ echo "$s"
10+1
您的第二个示例d=$((${c_2}+1))
确实有效,因为(( ))
设置了算术上下文:
$ c_2=10
$ d=$((${c_2}+1))
$ echo "$d"
11
由于 Windows 行结尾而出现语法错误:
$ c_2=10$'\r'
$ d=$((${c_2}+1))
+1")syntax error: invalid arithmetic operator (error token is "
因此,如果您按照我在开始时描述的方式修复该文件,这种情况就会消失。