2012-08-15 4 views
38

Ich brauche eine Zeichenfolge an ein Programm als Argument von der Bash CLI passieren, zBWie beeinflusst das führende Dollarzeichen einfache Anführungszeichen in Bash?

program "don't do this" 

Die Zeichenfolge ein beliebiges Zeichen wie '$', '\' usw. enthalten kann und will ich nicht Bash jeder tun Änderung. Also denke ich über die Verwendung von einfachen Anführungszeichen.

jedoch die folgende nicht funktioniert:

program 'don\'t do this'   //escape doesn't work in single quote 

Während die beiden folgenden Werke:

program $'dont\'t do this'   //seems fine, but any other side effects? 
program 'dont'\''do this'   //breaking into 3 parts 

Der erste Ansatz scheint in besser, dass es weniger vor Modifikation erwirbt (legen Sie die Dollar-Symbol vor und ersetzen Sie alle \ bis \\), aber ich weiß nicht, was sonst das DOLLAR SIGN tun könnte.

Ich habe das wirklich gegoogelt, aber ich kann nicht finden, was ich brauche ...

+4

Zum besseren Verständnis des '$‚...‘' Beispiel einen Blick auf dem ersten Absatz von [bash Info-Seite] (http://www.gnu.org/software/bash /manual/html_node/ANSI_002dC-Quoting.html#ANSI_002dC-Quoting) – suvayu

+0

Danke für das Posten dieser Frage. Es ist entscheidend für das Verständnis, wie Tab-getrennte Datensätze ausgerichtet werden (d. H. 'Cat myData.tsv | column -t -s $ '\ t'') –

Antwort

48

Es verursacht Escape-Sequenzen interpretiert werden.

$ echo $'Name\tAge\nBob\t24\nMary\t36' 
Name Age 
Bob  24 
Mary 36 

(und so behandelt Registerkarten in einer doof Weise, so versuchen Sie diesen zu Hause)

+0

+1 guten Fang.Ich schätze das passiert, weil Variablennamen erweitert werden? –

+0

Nein, das passiert, weil das Verhalten für '$ '...' definiert ist. –

+0

Das ist genau das, was ich brauche, wenn das alles $ '' ist! – user1206899

18

Mit $ als Präfix BASH sagt zu versuchen, eine Variable mit diesem Namen zu finden. $' ist eine spezielle Syntax (fully explained here), die ANSI-C-String-Verarbeitung ermöglicht. In diesem Fall ist der einzelne Tick nicht "wörtlich Wert bis zum nächsten einzelnen Tick". Es sollte ziemlich sicher zu benutzen sein. Die Nachteile sind, dass es nur BASH ist und ziemlich ungewöhnlich, so viele Leute werden sich fragen, was es bedeutet.

Der bessere Weg ist, einfache Anführungszeichen zu verwenden. Wenn Sie ein einfaches Anführungszeichen in einer Zeichenfolge benötigen, müssen Sie es durch '\'' ersetzen. Dies beendet die vorherige Zeichenfolge in Anführungszeichen, fügt ein einfaches Anführungszeichen hinzu (\') und startet dann eine neue Zeichenfolge in Anführungszeichen. Diese Syntax funktioniert mit jedem Nachkommen der Bourne shell, es ist ziemlich einfach zu verstehen und die meisten Menschen erkennen schnell das Muster.

Die Alternative besteht darin, jeden einzelnen Tick mit '"'"' zu replacesieren, was bedeutet: "aktuelle singuläre Zeichenfolge in Anführungszeichen beenden, doppelte Anführungszeichenfolge anhängen, die nur ein einzelnes Ankreuzfeld enthält, einzelne Anführungszeichenfolge neu starten". Dies vermeidet den Escape-Charakter und sieht gut symmetrisch aus. Es funktioniert auch umgekehrt, wenn Sie ein doppeltes Anführungszeichen in einer doppelten Zeichenfolge in Anführungszeichen benötigen: "'"'".

+0

ja es ist der richtige Weg – user1206899

+2

Es ist auch üblich, ''' '' '' zu sehen. zB ''der Hund' '' 'Schwanz' ' –

+0

$' SHELL 'und $' LANG 'werden * nicht *" nicht bestanden ". Das Dollarzeichen in $ 'hat eine andere Funktion. Ich würde sagen "ist ein richtiger Weg". – jox

-1

Sie werden nicht schneller oder effizienter als finden:

eval RESULT=\$\'$STRING\' 

Zum einen ist dies die Art von Sache, die eval ist es für und Sie die verrückt Kosten von Forking subprocess vermeiden überall, wie die vorherigen Antworten vermuten lassen. Ihr Beispiel:

$ foo='\u25b6' 
$ eval bar=\$\'$foo\' 
$ echo "$bar" 
▶ 
+0

Dies ist ein Missverständnis dessen, was die Syntax in Bash bedeutet. '$ '...'' ist eine [C-style string] (http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting), die anderen Zitationsregeln als normale Strings unterliegt, wie in den anderen Antworten auf dieser Seite beschrieben. – tripleee

Verwandte Themen