Hallo, hat jemand eine Idee, warum für die IFS-Variable ein leerer Wert angezeigt wird?
bash-4.2$ set | grep -i ifs
IFS=$' \t\n'
bash-4.2$ echo $IFS
bash-4.2$
bash-4.2$
Antwort1
Sie sehen einen leeren Wert, weildas ist, wasIstimmer in IFS gespeichert: Es enthält ein Leerzeichen (unsichtbar), einen Tabulator (ebenfalls unsichtbar) und einen Zeilenvorschub (ebenfalls unsichtbar).
Es enthält weder ein Dollarzeichen noch Backslashs oder Buchstaben: So set
versucht man einfach, eine Variable anzuzeigen, die unsichtbare Zeichen enthält. Er \t
stellt also einen Tabulator dar und der \n
einen Zeilenumbruch, und die Umgebung $'...'
zeigt an, dass die Backslash-Kombinationen als Sonderzeichen und nicht als wörtlicher Text zu interpretieren sind.
set
verwendet dieses spezielle Format, da es auch angegeben werden kannzurückan die Shell als Teil eines anderen Befehls. Beispielsweise echo $'Hello\tworld!
würde run eine Registerkarte ausgeben, in der sich das \t
befindet. Und tatsächlichläuft IFS=$' \t\n'
als Befehl würde die IFS-Variable tatsächlich auf Leerzeichen + Tab + Zeilenumbruch setzen.
Antwort2
Weil \t
und \n
bei der Eingabe analysiert und in die tatsächlichen Zeichencodes konvertiert werden. Die Ausgabe von echo $IFS
sieht also wie Leerzeichen aus (und einige werden durch Argumentanalyse entfernt, da Sie keine Anführungszeichen gesetzt haben). Wenn Sie den tatsächlichen Inhalt sehen möchten, konvertieren Sie in Hex und vergessen Sie nicht, Anführungszeichen zu setzen, damit keine Zeichen analysiert werden:
IFS=$' \t\n'
printf '%s' "$IFS" | hd
00000000 20 09 0a | ..|
00000003
0