2016-06-03 8 views
0

Ich möchte (viele) Informationen zwischen Skripten weitergeben, idealerweise mit Ein-/Ausgabe eines persistenten Skripts. Die Verwendung einfacher Textdateien scheint eher passend zu sein, aber Probleme treten auf, sobald Einträge Leerzeichen enthalten.posix shell: Lesen von Einträgen mit Leerzeichen aus einer Textdatei in Variablen

Was ist der beste Weg, Variablen in einem Shell-Skript zu speichern und in einem anderen zu lesen?

In den folgenden Beispielen Mich erwartet, dass der Ausgang

'publicname' 'x86' '"test directory"' '5' rem:'some other parameters in the future' 

Version 1: Das wäre mein bevorzugtes Format der Text-Datei sein, die ich kein Entkommen, würden Leerzeichen in Anführungszeichen eingegeben.

echo 'publicname x86 "test directory" 5 some other parameters in the future 
' >/tmp/input.txt 
while read -r name archname vcdir rev rem; do 
    set -e 
    [ -n "$name" -a "$name" != "#" ] || continue 
    echo "'$name' '$archname' '$vcdir' '$rev' rem:'$rem'" 
done < /tmp/input.txt 

Ausgänge

'publicname' 'x86' '"test' 'directory"' rem:'5 some other parameters in the future' 

Version 2: korrekte Ausgabe erzeugt, setzen Sie die Eingabe für die Shell entkam werden muss. Dies ist problematisch, da im Idealfall würde die Eingabe mit anderen Sprachen verwendet werden, und auch von Shell-Skripten erzeugt wird (müssen Variablen für den Export zu entkommen)

echo 'publicname x86 test\ directory 5 some other parameters in the future 
' >/tmp/input.txt 
while read name archname vcdir rev rem; do 
    set -e 
    [ -n "$name" -a "$name" != "#" ] || continue 
    echo "'$name' '$archname' '$vcdir' '$rev' rem:'$rem'" 
done < /tmp/input.txt 

Antwort

0

Die allgemeine Regel ist: ein Trennzeichen verwenden, die nicht angezeigt werden können ein Feld. Sagen wir mal ein Komma ist sicher:

echo 'publicname,x86,test directory,5,some other parameters in the future' > /tmp/input.txt 
while IFS=, read -r name archname vcdir rev rem; do 
    printf "'%s' '%s' '%s' '%s' rem:'%s'\n" "$name" "$archname" "$vcdir" "$rev" "$rem" 
done < /tmp/input.txt 

Wenn ein Komma in einem Feld erscheinen könnte, können Sie einen weniger gebräuchlichen Trennzeichen, wie ein ASCII-Steuerzeichen, um versuchen möchten.

printf 'publicname\037x86\037test directory\0375\037some other parameters in the future\n' > /tmp/input.txt 
while IFS=$(printf '\037') read -r name archname vcdir rev rem; do 
    printf "'%s' '%s' '%s' '%s' rem:'%s'\n" "$name" "$archname" "$vcdir" "$rev" "$rem" 
done < /tmp/input.txt 

Eine einfachere Alternative ist eine neue Zeile zu verwenden, dann read mehrmals aufrufen.

printf 'publicname\nx86\ntest directory\n5\nsome other parameters in the future\n' > /tmp/input.txt 
while read -r name; read -r archname; read -r vcdir; read -r rev; read -r rem; do 
    printf "'%s' '%s' '%s' '%s' rem:'%s'\n" "$name" "$archname" "$vcdir" "$rev" "$rem" 
done < /tmp/input.txt 

Als letzte Möglichkeit können Sie versuchen, das Nullzeichen als Trennzeichen zu verwenden. [Kein Beispiel, weil ich nicht weiß, wie man mit Null-getrennten Daten in der Posix-Shell umgehen soll, aber wenn Sie bis jetzt ohne eine brauchbare Lösung gekommen sind, ist Shell wahrscheinlich nicht die richtige Sprache.]

Verwandte Themen