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_1
und c_2
problemlos 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/ksh
oder 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 dos2unix
installiert 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_1
liegt 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_1
und 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. ksh
ist nicht dasselbe wie , bash
was 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 sh
unterstü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+1
führt nur eine einfache Variablenzuweisung durch. Es setzt den Wert der Variablen $s
auf den Wert von $c_2
mit demSchnur +1
hinzugefü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.