Bash 脚本:csv 文件中的变量出现问题

Bash 脚本:csv 文件中的变量出现问题

我在从 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_1and作为某些函数的输入。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/shor#!/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 "

因此,如果您按照我在开始时描述的方式修复该文件,这种情况就会消失。

相关内容