Bash-Skript: Problem mit Variablen aus CSV-Datei

Bash-Skript: Problem mit Variablen aus CSV-Datei

Ich habe ein kleines Problem damit, Variablen aus einer CSV-Datei auf meinem Linux-Rechner abzurufen und sie in einem zu verwenden if. Ich habe die folgende CSV:

Name;Age
Marc;18
Joseph;10

Ich versuche, diese Informationen aus meiner CSV-Datei zu extrahieren, um sie in einer Funktion zu verwenden:

Mein Bash-Code:

#!/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)

Nachdem ich meinen Code ausgeführt habe, erhalte ich:

Name : Marc
Age : 18
Name : Joseph
Age : 10

Ich habe erwartet:

Name : Marc
Age : 18
Marc can drive
Name : Joseph
Age : 10

Ich habe schon viel erfolglos ausprobiert. Ich kann c_1und c_2problemlos als Eingabe für einige Funktionen verwenden. Das Problem tritt nur auf, wenn ich versuche, mathematische Operationen durchzuführen.

Wenn ich mache:

s=$c_2+1
d=$((${c_2}+1))

es gibt zurück:

+1
+1")syntax error: invalid arithmetic operator (error token is "

Dasselbe Problem bei Verwendung d=$(("${c_2}+1")).

Was muss ich ändern , damit es läuft? Die Verwendung von #!/bin/kshoder führt zum gleichen Ergebnis.#!/bin/sh#!/bin/bash

Vielen Dank für Ihre Hilfe :)

Antwort1

Ihr erstes Problem ist, dass Sie eine Windows-Textdatei verwenden. Ihre CSV-Datei hat Zeilenenden im Windows-Stil ( \r\n). Sie können das folgendermaßen beheben:

dos2unix teste_input.csv

Oder wenn Sie es nicht dos2unixinstalliert haben, tun Sie einfach Folgendes:

sed -i 's/\r//g' teste_input.csv

Dadurch erzeugt Ihr Code die erwartete Ausgabe. Fast:

$ foo.sh teste_input.fixed.csv 
Name : Marc
Age : 18
$c_1 can drive
Name : Joseph
Age : 10

Das $c_1liegt an den einfachen Anführungszeichen in dieser Zeile:

echo '$c_1 can drive'

Variablen werden nicht in einfache Anführungszeichen gesetzt, deshalb sehen Sie $c_1und nicht den Wert der Variablen. Sie benötigen:

echo "$c_1 can drive"

Das nächste Problem ist, dass es ==sich um einen Zeichenfolgenvergleich und nicht um einen arithmetischen Vergleich handelt. Hier funktioniert es, aber wenn Sie numerische Werte vergleichen möchten, benötigen Sie -eq:

if [ $c_2 -eq "18" ]

Aufgrund Ihrer „can drive“-Ausgabe vermute ich jedoch, dass Sie prüfen möchten, ob der Wert der Variablen gleich oder größer ist 18. Daher würden Sie Folgendes verwenden -ge:

 if [ $c_2 -ge "18" ]

Schließlich müssen Sie eine Shell auswählen, die Sie verwenden möchten. kshist nicht dasselbe wie , bashwas nicht dasselbe ist wie sh. Obwohl die Syntax sehr ähnlich ist, ist sie nicht identisch und einige Dinge funktionieren je nachdem, was Sie verwenden, anders. Beispielsweise shunterstützt nicht <(command).

Was die Arithmetik betrifft, die Sie versucht haben, müssen Sie nur die Syntax richtig machen, Sie müssen einen „arithmetischen Kontext“ verwenden. s=$c_2+1führt nur eine einfache Variablenzuweisung durch. Es setzt den Wert der Variablen $sauf den Wert von $c_2mit demSchnur +1hinzugefügt:

$ c_2=10
$ s=$c_2+1
$ echo "$s"
10+1

Ihr zweites Beispiel d=$((${c_2}+1))funktioniert, weil (( ))es einen arithmetischen Kontext festlegt:

$ c_2=10
$ d=$((${c_2}+1))
$ echo "$d"
11

Der Syntaxfehler liegt aufgrund der Windows-Zeilenenden vor:

$ c_2=10$'\r'
$ d=$((${c_2}+1))
+1")syntax error: invalid arithmetic operator (error token is "

Das Problem wird behoben, wenn Sie die Datei wie eingangs beschrieben reparieren.

verwandte Informationen