Estou tendo um pequeno problema para obter variáveis de um arquivo csv em minha máquina Linux e usá-las em um arquivo if
. Eu tenho o seguinte csv:
Name;Age
Marc;18
Joseph;10
Estou tentando obter essas informações do meu csv para usar em uma função:
Meu 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)
Depois de executar meu código, recebo:
Name : Marc
Age : 18
Name : Joseph
Age : 10
Eu estava esperando:
Name : Marc
Age : 18
Marc can drive
Name : Joseph
Age : 10
Já tentei muitas coisas sem sucesso. Posso usar c_1
e c_2
como entrada para algumas funções sem problemas. O problema é justamente quando tento fazer operações matemáticas.
Se eu fizer:
s=$c_2+1
d=$((${c_2}+1))
ele retorna:
+1
+1")syntax error: invalid arithmetic operator (error token is "
Mesmo problema usando d=$(("${c_2}+1"))
.
O que devo mudar para fazê-lo funcionar? Usar #!/bin/ksh
ou #!/bin/sh
me #!/bin/bash
dá os mesmos resultados.
Obrigado pela ajuda :)
Responder1
Seu primeiro problema é que você está usando um arquivo de texto do Windows. Seu csv possui terminações de linha no estilo Windows ( \r\n
). Você pode corrigir isso usando:
dos2unix teste_input.csv
Ou se você não tiver dos2unix
instalado, basta fazer:
sed -i 's/\r//g' teste_input.csv
Isso fará com que seu código produza a saída que você espera. Quase:
$ foo.sh teste_input.fixed.csv
Name : Marc
Age : 18
$c_1 can drive
Name : Joseph
Age : 10
O que $c_1
existe por causa das aspas simples nesta linha:
echo '$c_1 can drive'
As variáveis não são expandidas entre aspas simples, por isso você vê $c_1
e não o valor da variável. Você precisa:
echo "$c_1 can drive"
A próxima questão é ==
para comparação de strings e não para aritmética. Funcionará aqui, mas se quiser comparar valores numéricos, você deseja -eq
:
if [ $c_2 -eq "18" ]
No entanto, com base na saída "can drive", suspeito que você queira verificar se o valor da variável é igual ou maior que 18
, então você usaria -ge
:
if [ $c_2 -ge "18" ]
Finalmente, você precisa escolher um shell para usar. ksh
não é o mesmo que bash
que não é o mesmo que sh
. Embora tenham uma sintaxe extremamente semelhante, ela não é idêntica e algumas coisas funcionarão de maneira diferente dependendo do que você usar. Por exemplo, sh
não suporta <(command)
.
Quanto à aritmética que você tentou, você só precisa acertar a sintaxe, você precisa usar um "contexto aritmético". s=$c_2+1
está apenas fazendo uma simples atribuição de variável. É definir o valor da variável $s
para o valor de $c_2
com ocorda +1
adicionado:
$ c_2=10
$ s=$c_2+1
$ echo "$s"
10+1
Seu segundo exemplo d=$((${c_2}+1))
funciona, porque (( ))
define um contexto aritmético:
$ c_2=10
$ d=$((${c_2}+1))
$ echo "$d"
11
Você recebeu o erro de sintaxe por causa dos finais de linha do Windows:
$ c_2=10$'\r'
$ d=$((${c_2}+1))
+1")syntax error: invalid arithmetic operator (error token is "
Então isso desaparecerá se você corrigir o arquivo como descrevi no início.