2016-04-21 7 views
4

"[email protected]" scheint , verschwinden zu machen. z.B.

param="123 1,2" 
set echo $param 
"[email protected]" 

Dies wird "123 1 2" anstelle von "123 1,2", Echo, aber in einigen Fällen wird , als Wert auf einen Befehl benötigt wird.

Und das scheint zu Bash-Version zu sein, mit Bash 4.1.2 ist das Ergebnis korrekt, aber mit 4.2.46 fehlt das Komma.


Edit:

Kurz gesagt, vielleicht ist es nice schuld:

I unset IFS tat und im Terminal den Testfall gab ich richtig funktioniert, aber nicht mit meinem Skript.

Ich bin eigentlich auf ein Init-Skript arbeiten, überprüfte ich die action() Funktion in /etc/init.d/functions und fügte einige Debug-Code:

echo "[email protected]" # added by me 
unset IFS # added by me 
"[email protected]" && success $"$STRING" || failure $"$STRING" 

der Befehl Echo korrekt ist (nice -n -10 ovs-vswitchd ... --socket-mem 1024,1024), aber im ps Ergebnis der Der von nice ausgeführte Befehl wird ovs-vswitchd ... --socket-mem 1024 1024.

Ich fing an zu denken, vielleicht ist es nice zu beschuldigen.

+1

Überprüfen Sie die IFS auf der eine es ist kaputt. – 123

+1

Dies scheint wie ein Fehler in bash 4.1. Ich überprüfe das [changelog for bash 4.2] (https://github.com/sunny256/bash/blob/master/CWRU/changelog) um zu sehen, ob etwas damit zusammenhängt. – fedorqui

+0

Es funktioniert gut mit der Version 4.2.47 ... – Joda

Antwort

0

Bitte setzen Sie das IFS direkt in Ihrem Skript, bevor Sie param trennen (vor dem Befehl set). Zum Beispiel tun Sie etwas wie folgt:

oldIFS=$IFS 
param="123 1,2" 
IFS=" " # put tabs and or newline if also wanted. 
set echo $param 
IFS=$oldIFS 
"[email protected]" 

Dies funktioniert, egal was war Ihre IFS vorher.

+0

Wenn das OP String-Splitting durchführen möchte, empfiehlt es sich, 'read -a' zu verwenden, um überhaupt nicht von IFS abhängig zu sein. 'IFS = Lesen -r -a Argumente <<<" $ param "; set - echo "$ {args [@]}" 'ändert' IFS' nur für die Dauer des 'read'-Befehls, so dass Sie den alten Wert –

+0

nicht wiederherstellen und zurückgeben müssen ... was wichtig ist, weil der 'oldIFS'-Ansatz fehlerhaft ist: In dem Fall, in dem der alte Wert nicht gesetzt ist ('unset IFS'), führt der obige Code zu einem wesentlich anderen Verhalten davor und danach. –