Ich habe eine Datei wie folgt aus:Wie lese ich eine Zeile einer Datei richtig in ein Array?
1234 1234 "First Name" "Last Name"
Und ich habe eine Bash-Funktion wie folgt aus:
function somePeoples()
{
body='"id":"'$1'","num":"'$2'","name":"'$3'","lname":"'$4'"'
echo $body
}
, die in einem Bash-Skript enthalten ist, die ich in der Befehlszeile beziehen würde. Danach mache ich die folgende Funktion zu testen:
$ arr=(1234 1234 "First Name" "Last Name")
$ somePeoples "{arr[@]}"
$ "id":"1234","num":"1234","name":"First Name","lname":"Last Name"
$ somePeoples "${arr[0]}" "${arr[1]}" "${arr[2]}" "${arr[3]}"
$ "id":"1234","num":"1234","name":"First Name","lname":"Last Name"
ist nun zurück in die Datei loslassen, die Zeilen wie diese enthält:
input.txt:
1234 1234 "First Name" "Last Name"
2234 2234 "Some other name" "Some other last name"
Ich versuche, jede Zeile in der Datei über ein lesen for-Schleife mit einer begrenzten Anzahl, weil ich genau weiß, wie viele Zeilen in der Datei. Der Trick besteht darin, jede Zeile zu lesen und jede Zeile in ein Array einzufügen, das an die somePeoples-Funktion übergeben wird. Also mache ich ein Skript, das das andere Skript mit der Funktion versorgt. Sagen wir es einfach Skript der Client aufrufen und lassen Sie uns so tun, als es tatsächlich ist Looping:
the client script:
arr=(`sed -n "1p" input.txt`)
somePeoples "${arr[@]}"
Aber zu meinem Entsetzen der Ausgang ist:
$ "id":"1234","num":"1234","name":""First,"lname":"Name""
auch versuchen, diese Erträge um das gleiche Ergebnis zu tun
somePeoples "${arr[0]}" "${arr[1]}" "${arr[2]}" "${arr[3]}"
somePeoples `sed -n "1p" input.txt`
Was ist der Unterschied? Wenn ich es in der Befehlszeile mit denselben Anführungszeichen austippe, funktioniert es gut, aber nicht, wenn ich die Eingabe aus der Datei lese und sie an ein Array oder direkt an die Funktion übergebe. Warum bricht es bei Leerzeichen, obwohl die Argumente zitiert werden? Und, äh, wie kann ich das verhindern?
Ich versuche tatsächlich, einen Anfragetext vorzubereiten, der an cURL im jSON-Format übergeben wird, und die Eingabeparameter sind in einer Datei enthalten, die Hunderte von Zeilen lang ist. Aber ich denke, dass das CURL-Material für diese Frage irrelevant ist, da ich das Problem durch Bash allein reproduziert habe.
Vielen Dank. IFS hat den Trick gemacht :) – avendael