Was ist die korrekte Verwendung von (verschachtelt | double | einfache) Anführungszeichen

StackOverflow https://stackoverflow.com/questions/1258985

  •  12-09-2019
  •  | 
  •  

Frage

Ich bin sicher, diese Frage zu einigen von euch dumm erscheinen mag, aber ich bin hier, um zu lernen.
Sind diese Annahmen gilt für die meisten Sprachen?
Bearbeiten : OK, nehmen wir an, ich Perl / Bash Scripting bin im Gespräch.

'Single quotes'

=> Keine Interpretation bei allen (z ‚$‘ oder jeden metacharacter wird als ein Zeichen betrachtet wird und wird auf dem Bildschirm gedruckt werden)

"Double quotes" 

=> Variable Interpretation

Um genauer zu sein über meine Sorgen, ich habe einige Shell-Skripte zu schreiben (in denen zitiert manchmal kann ein großer Aufwand sein), und schrieb die folgende Zeile:

CODIR=`pwd | sed -e "s/$MODNAME//"`

Wenn ich einfache Anführungszeichen in meinem sed verwendet hätte, wäre mein Muster gewesen ‚$ MODNAME‘ hat, nicht wahr? (Und nicht der tatsächliche Wert von $ MODNAME, das ist `alpha‘ in diesem speziellen Fall)

Ein weiteres Problem, das ich hatte, mit einem awk innerhalb eines Echos:

USAGE=`echo -ne "\
Usage : ./\`basename $0\` [-hnvV]\n\
\`ls -l ${MODPATH}/reference/ | awk -F " " '$8 ~ /\w+/{print "> ",$8}'\`"`

Ich verbrachte einige Zeit Debuggen ein. Ich kam zu dem Schluss, dass Backticks entgangen waren, so dass der Dolmetscher nicht „split“ der Befehl (und direkt vor «Basisnamen» stoppen). In dem awk commmand, '$ 8' wird erfolgreich von awk interpretiert, also nicht von Shell. Was passiert, wenn ich einen Shell-Variable verwenden wollte? Würde ich awk -F "\" $ MY_SHELL_VAR \ "" schreiben? Da $ MY_SHELL_VAR wie angeboten wird, von awk interpretiert werden, nicht wahr?

Zögern Sie nicht, irgendwelche Informationen über zitieren oder Backticks addieren!

Danke! :)

War es hilfreich?

Lösung

Es variiert massiv nach Sprache. Zum Beispiel in dem C / Java / C ++ / C # etc Familie, können Sie nicht einfache Anführungszeichen für eine Zeichenfolge verwenden überhaupt - sie nur für einzelne Zeichen sind

.

Ich denke, es ist weit besser ist, die Regeln richtig für die Sprachen zu lernen, die Sie tatsächlich daran interessiert sind, als zu versuchen, zu verallgemeinern.

Andere Tipps

  

Sind diese Annahmen gilt für die meisten Sprachen?

Antwort: Nein

In Bash Scripting, Backticks zu Gunsten von $ sind veraltet () teilweise, weil es ist nicht klar, wie verschachtelte Zitate und Flucht arbeiten sollen. Sie können auch einen Blick nehmen unter Bash Pitfalls .

Es ist definitiv nicht das gleiche für alle Sprachen. In Python, sind beispielsweise einfache und doppelte Anführungszeichen austauschbar. Der einzige Unterschied ist, dass Sie einfache Anführungszeichen innerhalb eines Strings in doppelten Anführungszeichen enthalten können sie und umgekehrt, ohne zu entkommen ( „Wie geht es dir?“).

Auch gibt es Triple-Strings in Anführungszeichen, die über mehrere Zeilen erstrecken können.

In Perl, Sie haben auch q () und qq () Ihnen in verschachtelten zitieren Situationen zu helfen:

my $x = q(a string with 'single quotes');
my $y = qq(an $interpreted string with "double quotes");

Diese sicherlich helfen Ihnen zu vermeiden "\" unnötig \ "" '\' zu entkommen \ '' interne Anführungszeichen.

Ja, so etwas wie awk -F "\"$MY_SHELL_VAR\"" arbeiten, aber in diesem Fall würden Sie nicht in der Lage sein, Variablen in awk zu verwenden, da sie von Shell interpretiert werden, so dass die Art und Weise, so etwas zu gehen ist (verwende ich Befehl einfacher als ihr, wenn Sie nicht :)) nichts dagegen:

awk -F " " '$8 ~ /\w+/{print "> ",$8, '$SOME_SHELL_VAR'}'

Beachten Sie die einfachen Anführungszeichen beendet und neu gestartet werden.

Der schwierigste Teil, in der Regel ist das Angebot im Argumente für den Befehl zu übergeben. In diesem Fall müssen Sie Apostroph beenden, fügen Sie entkam Anführungszeichen, beginnen Zitat wieder, wie folgt aus:

awk '$1 ~ '\''{print}'

Beachten Sie, dass Apostroph kann nicht in einfachen Anführungszeichen maskiert werden, da die „\“ wird nicht als Escape-Zeichen behandelt werden.

Dies ist wahrscheinlich nicht direkt auf Ihr quiestion verwendet, aber immer noch nützlich.

Ich weiß nicht, über Perl, aber für bash müssen Sie nicht über die Newline diese Schrägstrich.

Wie für Zitate, ich habe ein (sehr persönlich) Muster, das ich die „fünf Anführungszeichen“ Muster nennen. Es hilft, ein Zitat in einer Reihe von der gleichen Art von Anführungszeichen

eingeschlossen zu setzen

Zum Beispiel:

doublequoted="some things "'"'"quoted"'"'" and some not"
simplequoted='again '"'"'quote this'"'"' but not that'

Beachten Sie, dass Sie frei Strings mit verschiedenen Arten von Anführungszeichen anfügen können, was nützlich ist, wenn Sie die Shell wollen einige Vars zu interpretieren, aber nicht einige andere:

awk -F " " '$8 ~ /\w+/{print "> ",$8, '"$SOME_SHELL_VAR"'}'

Auch ich Graviszeichen nicht mehr verwenden, aber die $(...)pattern, die besser lesbar ist und können verschachtelt werden.

USAGE=$(echo -ne "
Usage : ./$(basename $0) [-hnvV]\n
$(ls -l ${MODPATH}/reference/ | awk -F " " '$8 ~ /\w+/{print "> ",$8}')")

In Perl, doppelte Anführungszeichen werden ihre Variablen erweitert haben.

Wenn Sie schreiben, dass zum Beispiel:

my $email = "foo@bar.com" ;

perl werden versuchen @bar zu erweitern. Wenn Sie use strict, werden Sie eine beschweren sich über das Array Leiste nicht vorhanden sind. Wenn Sie dies nicht tun, werden Sie nur ein seltsames Verhalten sehen.

So ist es besser, schreiben:

my $email = 'foo@bar.com' ;

Für diese Art von Grund, mein Rat ist Apostroph für Strings immer zu verwenden, es sei denn, Sie wissen, dass Sie variable Erweiterung benötigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top