IFS-Variable unter Linux

IFS-Variable unter Linux

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 setversucht man einfach, eine Variable anzuzeigen, die unsichtbare Zeichen enthält. Er \tstellt also einen Tabulator dar und der \neinen Zeilenumbruch, und die Umgebung $'...'zeigt an, dass die Backslash-Kombinationen als Sonderzeichen und nicht als wörtlicher Text zu interpretieren sind.

setverwendet 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 \tbefindet. Und tatsächlichläuft IFS=$' \t\n'als Befehl würde die IFS-Variable tatsächlich auf Leerzeichen + Tab + Zeilenumbruch setzen.

Antwort2

Weil \tund \nbei der Eingabe analysiert und in die tatsächlichen Zeichencodes konvertiert werden. Die Ausgabe von echo $IFSsieht 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

verwandte Informationen