Wenn das folgende Beispiel, das die IFS
Umgebungsvariable auf ein Zeilenvorschubzeichen setzt ...
IFS=$'\n'
- Was bedeutet die Dollarzeichen bedeuten genau ?
- Was macht es in diesem speziellen Fall?
- Wo kann ich mehr über diese spezielle Verwendung lesen (Google lässt keine Sonderzeichen in Suchanfragen zu und ich weiß nicht, wonach ich sonst suchen soll)?
Ich weiß, was die IFS
Umgebungsvariable ist und was das \n
Zeichen ist (Zeilenvorschub), aber warum nicht einfach das folgende Formular verwenden:
IFS="\n"
(was nicht funktioniert)?
Wenn ich beispielsweise jede Zeile einer Datei durchlaufen und eine for-Schleife verwenden möchte, kann ich Folgendes tun:
for line in (< /path/to/file); do
echo "Line: $line"
done
Dies funktioniert jedoch nur dann richtig, wenn IFS
ein Zeilenvorschubzeichen festgelegt ist. Damit es funktioniert, müsste ich Folgendes tun:
OLDIFS=$IFS
IFS=$'\n'
for line in (< /path/to/file); do
echo "Line: $line"
done
IFS=$OLDIFS
Hinweis: Ich brauche keinen anderen Weg, um dasselbe zu tun, ich kenne bereits viele andere ... Ich bin nur neugierig $'\n'
und frage mich, ob mir jemand eine Erklärung dazu geben könnte.
\n
ist nur ein (entkommener) Buchstabe n. Sie haben Recht damit'\n'
und"\n"
sind Spiel, gefolgt von n.$'\n'
bash-spezifisch ist - es funktioniert nicht in einer POSIX-Shell (/bin/sh
). Um den gleichen Effekt auf POSIX-konforme Weise zu erzielen, können SieIFS='
eingeben, dann die Eingabetaste drücken, um ein tatsächliches Zeilenumbruchzeichen einzugeben, und dann den Abschluss eingeben'
IFS=$(echo -e '\n')
sollte es auch auf POSIX-kompatible Weise tun.-e
ist nicht definiert und funktioniert\n
ohne-e
XSI-Erweiterung: pubs.opengroup.org/onlinepubs/9699919799/utilities/… .printf '\n'
Felsen;)Nur um dem Konstrukt seinen offiziellen Namen zu geben : Zeichenfolgen der Form
$'...'
werden als ANSI C-Zeichenfolgen bezeichnet .Das heißt, wie in [ANSI] C-Zeichenfolgen werden Spiel-Escape-Sequenzen erkannt und auf ihr Literaläquivalent erweitert (siehe unten für die vollständige Liste der unterstützten Escape-Sequenzen).
Nach dieser Erweiterung
$'...'
verhalten sich Zeichenfolgen genauso wie'...'
Zeichenfolgen, dh sie werden als Literale behandelt, die KEINEN [weiteren] Shell-Erweiterungen unterliegen .$'\n'
Erweitert sich beispielsweise zu einem wörtlichen Zeilenumbruchzeichen - was ein reguläres Bash-String-Literal (ob'...'
oder nicht"..."
) nicht kann. [1]Ein weiteres interessantes Merkmal ist, dass ANSI-Zeichenfolgen in C-Anführungszeichen
'
(einfache Anführungszeichen) entweichen können, wie\'
dies bei'...'
(regulären Zeichenfolgen in einfachen Anführungszeichen) nicht möglich ist:Liste der unterstützten Escape-Sequenzen :
[1] Sie können jedoch tatsächliche Zeilenumbrüche in Zeichenfolgen "..." und "..." einbetten . Sie können also Zeichenfolgen definieren, die mehrere Zeilen umfassen.
quelle
Von http://www.linuxtopia.org/online_books/bash_guide_for_beginners/sect_03_03.html :
Ich denke, es zwingt das Skript, dem Zeilenvorschub zum richtigen ANSI-C-Standard zu entkommen.
quelle
Die Wiederherstellung des Standard-IFS
OLDIFS=$IFS
ist nicht erforderlich. Führen Sie ein neues IFS in der Subshell aus, um zu vermeiden, dass das Standard-IFS überschrieben wird:Außerdem glaube ich nicht wirklich, dass Sie das alte IFS vollständig wiederherstellen. Sie sollten es doppelt zitieren, um Zeilenumbrüche wie z
OLDIFS="$IFS"
.quelle
args=$(IFS='&'; echo "$*")
. Auf eine Bourne-Shell-freundliche Art und Weise wiederherzustellenIFS
,$' \t\n'
ist keine leichte Aufgabe.Besides I don't really believe you recover the old IFS fully
: Wort Spaltung wird nicht auf der rechte Seite von Variablenzuweisungen durchgeführt (aber Zitat Entfernung ist), soOLDIFS=$IFS
undOLDIFS="$IFS"
die gleiche Art und Weise verhalten.ANSI C-Zeichenfolgen sind ein wichtiger Punkt. Danke an @ mklement0.
Sie können ANSI C-Zeichenfolgen mit dem Befehl od testen.
Ausgänge:
Sie können die Bedeutung anhand der Ausgänge klar erkennen.
quelle
Es ist wie das Abrufen des Werts aus einer Variablen:
sind unterschiedlich, so dass das Dollarzeichen im Grunde den Inhalt bewertet.
quelle
$'FOO'
(im Gegensatz zu$FOO
dem, worum es bei dieser Frage nicht ging) ist ein String-Literal. Wenn Sie ausführenecho $'VAR'
, werden Sie sehen, dass die ZeichenfolgeVAR
nicht gedruckt wirdtest
.