Tengo un pequeño problema para obtener variables de un archivo csv en mi máquina Linux y usarlas en un archivo if
. Tengo el siguiente csv:
Name;Age
Marc;18
Joseph;10
Estoy intentando obtener esta información de mi csv para usarla en una función:
Mi código 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)
Después de ejecutar mi código, obtengo:
Name : Marc
Age : 18
Name : Joseph
Age : 10
Yo estaba esperando:
Name : Marc
Age : 18
Marc can drive
Name : Joseph
Age : 10
Ya probé muchas cosas sin éxito. Puedo usar c_1
y c_2
como entrada para algunas funciones sin ningún problema. El problema es justo cuando intento hacer operaciones matemáticas.
Si lo hago:
s=$c_2+1
d=$((${c_2}+1))
vuelve :
+1
+1")syntax error: invalid arithmetic operator (error token is "
El mismo problema al usar d=$(("${c_2}+1"))
.
¿Qué debo cambiar para que funcione? Usar #!/bin/ksh
, #!/bin/sh
o #!/bin/bash
me da los mismos resultados.
Gracias por tu ayuda :)
Respuesta1
Su primer problema es que está utilizando un archivo de texto de Windows. Su csv tiene finales de línea al estilo de Windows ( \r\n
). Puedes arreglar eso usando:
dos2unix teste_input.csv
O si no lo tienes dos2unix
instalado, simplemente haz:
sed -i 's/\r//g' teste_input.csv
Eso hará que su código produzca el resultado que espera. Casi:
$ foo.sh teste_input.fixed.csv
Name : Marc
Age : 18
$c_1 can drive
Name : Joseph
Age : 10
Esto $c_1
se debe a las comillas simples en esta línea:
echo '$c_1 can drive'
Las variables no se expanden entre comillas simples, por eso se ve $c_1
y no el valor de la variable. Necesitas:
echo "$c_1 can drive"
El siguiente problema es que ==
se trata de comparación de cadenas y no de aritmética. Funcionará aquí, pero si desea comparar valores numéricos, desea -eq
:
if [ $c_2 -eq "18" ]
Sin embargo, según su resultado de "puede conducir", sospecho que desea verificar si el valor de la variable es igual o mayor que 18
, por lo que usaría -ge
:
if [ $c_2 -ge "18" ]
Finalmente, debes elegir un caparazón para usar. ksh
no es lo mismo que bash
cual no es lo mismo que sh
. Si bien tienen una sintaxis extremadamente similar, no es idéntica y algunas cosas funcionarán de manera diferente dependiendo de lo que uses. Por ejemplo, sh
no es compatible <(command)
.
En cuanto a la aritmética que probó, sólo necesita obtener la sintaxis correcta, necesita usar un "contexto aritmético". s=$c_2+1
solo está haciendo una simple asignación de variable. Es establecer el valor de la variable $s
al valor de $c_2
con elcadena +1
agregado:
$ c_2=10
$ s=$c_2+1
$ echo "$s"
10+1
Su segundo ejemplo d=$((${c_2}+1))
funciona porque (( ))
establece un contexto aritmético:
$ c_2=10
$ d=$((${c_2}+1))
$ echo "$d"
11
Obtuviste el error de sintaxis debido a los finales de línea de Windows:
$ c_2=10$'\r'
$ d=$((${c_2}+1))
+1")syntax error: invalid arithmetic operator (error token is "
Eso desaparecerá si arregla el archivo como lo describí al principio.