it-swarm.com.de

Was bedeutet IFS = $ '\ n' genau?

Wenn im folgenden Beispiel die Umgebungsvariable IFS auf ein Zeilenvorschubzeichen festgelegt wird ...

IFS=$'\n'
  • Was bedeutet das Dollarzeichengena?
  • Was macht es in diesem speziellen Fall?
  • Wo kann ich mehr über diese spezielle Verwendung erfahren? (Google lässt keine Sonderzeichen in Suchanfragen zu und ich weiß nicht, wonach ich sonst suchen soll.)

Ich weiß, was die Umgebungsvariable IFS ist und was die Umgebungsvariable \n Zeichen ist (Zeilenvorschub), aber warum nicht einfach folgendes Formular verwenden: IFS="\n" (was geht nicht)?

Wenn ich zum Beispiel jede Zeile einer Datei durchlaufen und eine for-Schleife verwenden möchte, könnte ich Folgendes tun:

for line in (< /path/to/file); do
    echo "Line: $line"
done

Dies funktioniert jedoch nur, wenn IFS auf ein Zeilenvorschubzeichen gesetzt ist. Um es zum Laufen zu bringen, müsste ich Folgendes tun:

OLDIFS=$IFS
IFS=$'\n'
for line in (< /path/to/file); do
    echo "Line: $line"
done
IFS=$OLDIFS

Anmerkung: Ich brauche keinen anderen Weg, um dasselbe zu tun, ich kenne schon viele andere ... Ich bin nur neugierig darüber $'\n' und fragte mich, ob mir jemand eine Erklärung dazu geben könnte.

115
Yanick Girouard

Normalerweise interpretiert bash keine Escape-Sequenzen in String-Literalen. Also, wenn Sie schreiben \n oder "\n" oder '\n', das ist kein Zeilenumbruch - es ist der Buchstabe n (im ersten Fall) oder ein Backslash, gefolgt vom Buchstaben n (in den anderen beiden Fällen).

$'somestring' ist ein Syntax für String-Literale mit Escape-Sequenzen. Also im Gegensatz zu '\n', $'\n' ist eigentlich ein Zeilenumbruch.

155
sepp2k

Nur um dem Konstrukt seinen offiziellen Namen zu geben : Zeichenketten der Form $'...' heißen ANSI C-quoted strings.

Das heißt, wie in [ANSI] C-Strings werden Escape-Sequenzen erkannt und zu ihrem wörtlichen Äquivalent erweitert (siehe unten für die vollständige Liste der unterstützten Escape-Sequenzen).

After diese Erweiterung, $'...' Zeichenfolgen verhalten sich genauso wie '...' Strings - dh sie werden als Literale NICHT [weiteren] Shell-Erweiterungen unterworfen .

Zum Beispiel, $'\n' wird zu einem wörtlichen Newline-Zeichen erweitert - das ist ein normales Bash-String-Literal (ob '...' oder "...") nicht können.[1]

Ein weiteres interessantes Feature ist, dass ANSI C-quotierte Strings ' (einfache Anführungszeichen) als \', welches, '...' (reguläre Zeichenfolgen in Anführungszeichen) können nicht:

echo $'Honey, I\'m home' # OK; this cannot be done with '...'

Liste der unterstützten Escape-Sequenzen :

Escape-Sequenzen für umgekehrte Schrägstriche werden, falls vorhanden, wie folgt dekodiert:

\ ein Alarm (Glocke)

\ b Rücktaste

\ e\E ein Escapezeichen (nicht ANSI C)

\ f Formularvorschub

\ n Newline

Wagenrücklauf

\ t horizontale Registerkarte

\ v vertikale Registerkarte

\ Backslash

\ 'einfaches Anführungszeichen

"doppeltes Anführungszeichen

\ nnn das Acht-Bit-Zeichen, dessen Wert der Oktalwert nnn ist (ein bis drei Ziffern)

\ xHH das Acht-Bit-Zeichen, dessen Wert der Hexadezimalwert HH ist (eine oder zwei Hexadezimalziffern)

\ uHHHH das Unicode-Zeichen (ISO/IEC 10646), dessen Wert der Hexadezimalwert ist HHHH (eine bis vier Hexadezimalziffern)

\ UHHHHHHHH das Unicode-Zeichen (ISO/IEC 10646), dessen Wert der Hexadezimalwert ist HHHHHHHH (eine bis acht Hexadezimalstellen)

\ cx ein Control-X-Zeichen

Das erweiterte Ergebnis wird in einfache Anführungszeichen gesetzt, als ob das Dollarzeichen nicht vorhanden gewesen wäre.


[1] Sie können jedoch actual Zeilenumbrüche in die Zeichenfolgen "..." und "..." einbetten. Sie können Zeichenfolgen definieren, die sich über mehrere Zeilen erstrecken.

18
mklement0

From http://www.linuxtopia.org/online_books/bash_guide_for_beginners/sect_03_03.html :

Wörter in der Form "$ 'STRING'" werden auf besondere Weise behandelt. Das Word wird zu einer Zeichenfolge erweitert, wobei mit einem Backslash versehene Zeichen gemäß dem ANSI-C-Standard ersetzt werden. Backslash-Escape-Sequenzen finden Sie in der Dokumentation zu Bash.found

Ich vermute, es zwingt das Skript, den Zeilenvorschub auf den richtigen ANSI-C-Standard zu setzen.

16
Brad Swerdfeger

Wiederherstellen des Standard-IFS - dies OLDIFS=$IFS Ist nicht erforderlich. Führen Sie ein neues IFS in der Subshell aus, um das Überschreiben des Standard-IFS zu vermeiden:

ar=(123 321); ( IFS=$'\n'; echo ${ar[*]} )

Außerdem glaube ich nicht wirklich, dass Sie das alte IFS vollständig wiederherstellen. Sie sollten es in doppelte Anführungszeichen setzen, um Zeilenumbrüche wie OLDIFS="$IFS" Zu vermeiden.

8
Marek

ANSI-C-Zeichenfolgen sind ein wichtiger Punkt. Vielen Dank an @ mklement0.

Sie können ANSI C-quotierte Zeichenfolgen mit dem Befehl od testen.

echo -n $'\n' | od -c
echo -n '\n' | od -c
echo -n $"\n" | od -c
echo -n "\n" | od -c

Ausgänge:

0000000  \n  
0000001

0000000   \   n   
0000002

0000000   \   n   
0000002

0000000   \   n   
0000002

An den Ausgängen können Sie die Bedeutung gut erkennen.

3
Big Shield