Gibt es eine Möglichkeit, einfache Anführungszeichen in der Shell zu vermeiden?

22024
codeholic

Z.B. ich möchte sagen

perl -e 'print '"'"'Hello, world!'"'"', "\n";' 

Gibt es einen etwas unpraktischeren Weg, zB Anführungszeichen zu vermeiden?

Ja, ich weiß, dass ich schreiben kann

perl -e 'print q[Hello, world!], "\n"' perl -e 'print "Hello, world!\n"' 

Bei dieser Frage geht es jedoch um Zitate in der Shell, nicht im Perl.

Ich bin daran interessiert, wie es geht bashund cshin erster Linie.

11

6 Antworten auf die Frage

9
Chris Johnsen

Dennis weist in seiner Antwort auf die üblichen Alternativen hin (single-in-double, double-in-single, einzelne Anführungszeichen mit verkappten einfachen Anführungszeichen; Sie haben bereits anpassbare Zitatoperatoren von Perl erwähnt), aber vielleicht ist dies die direkte Antwort, die Sie gesucht haben zum.

In Bourne-ähnlichen Shells (sh, ksh, ash, dash, bash, zsh usw.) sind einzelne Anführungsstriche vollständig wörtlich. Dadurch können Zeichen, die die Shell andernfalls speziell behandeln würde, leicht hinzugefügt werden, ohne sie zu umgehen, aber das Anführungszeichen selbst kann nicht in einzelne Anführungszeichen eingeschlossen werden.

Ich lehne es ab, auch nur über die Csh-Shells nachzudenken, da sie in anderer Hinsicht völlig kaputt sind (siehe Csh-Programmierung als schädlich ).

Vielen Dank. "Das ist unmöglich" - es ist die Antwort, die ich erwartet hatte :) Obwohl ich immer gehofft hatte, dass es sich hier um Dokumente handelt, die dieser Rolle gewidmet sind. codeholic vor 14 Jahren 0
Unlike in Perl, Bourne-like shell here documents are only directly useful for providing input via stdin. You can, of course, put single quotes in them. You can also enable "literal mode" of a here document by quoting the word: (e.g.) `blah <<\EOF … EOF`. You can also use `<<'EOF'` and `<<"EOF`. They all mean literal here documents (unlike Perl). If you were really determined, you could do `blah "$(cat<<\EOF … EOF )" other args` (using newlines where I have written spaces in the command substitution; ksh and zsh can do without the *cat*, the others need it). But would it really be worth it? Chris Johnsen vor 14 Jahren 0
Ich möchte nur beachten, dass zsh einfache Anführungszeichen nicht ganz wörtlich sind. Zsh versucht, ein '\ U' irgendwo in einer Zeichenfolge mit einem Anführungszeichen als Zeichencode zu interpretieren, z. B. 'echo' \ U0000068 \ U000069 '' hallo 'hi'. Nicht sicher warum, es sei denn, es ist ein Fehler in der Shell. Matthew vor 11 Jahren 0
@ Matthew: Die Interpretation von `\ U` erfolgt in diesem Fall durch den eingebauten Befehl * echo * (dieses Verhalten kann durch` -E` oder die Option BSD_ECHO und `-e` gesteuert werden). Sie können sehen, dass die Literalzeichenfolge in anderen Befehlen übergeben (und nicht anderweitig interpretiert) wird. ZB `printf% s \\ n '\ U0000068 \ U000069' '. Chris Johnsen vor 11 Jahren 1
@ ChrisJohnsen Danke, ich bin neu bei zsh und habe das nicht gemerkt, aber du hast recht. Die Manpage hat mir gesagt, dass sie Standard ist, aber zsh muss das überschreiben. Matthew vor 11 Jahren 0
6
Dennis Williamson

Für mich produzieren alle Ihre Beispiele:

Hallo Welt!

Und das auch so:

perl -e 'print "Hello, world!", "\n";' 

Und das:

perl -e 'print '\''Hello, world!'\'', "\n";' 

Können Sie erklären, was Sie zu tun versuchen?

Wenn Sie in der Shell, z. B. Bash, Anführungszeichen als Teil der Zeichenfolge drucken möchten, wird der eine Typ von Anführungszeichen dem anderen entgehen.

$ echo '"Hello, world!"' "Hello, world!" $ echo "'Hello, world!'" 'Hello, world!' 

Bearbeiten:

Hier ist ein anderer Weg:

$ perl -e 'print "\047Hello, world!\047", "\n";' 'Hello, world!' $ echo -e "\047Hello, world! \047" 'Hello, world! ' 

Das Leerzeichen nach dem Ausrufezeichen vermeidet einen Erweiterungsfehler. Ich hätte es set +Hstattdessen tun können .

1
Kaushik B

Not sure if my edit to the previous answer would show up:

Pasting the same as a new answer:

Alternate approach:

When i tried your solution i could still not get the ' printed.

But i took cue from your solution and tried the following:

$ perl -e '$foo = chr(39); print "$Hello, world $", "\n";' 'Hello, world ' 

ASCII value of ' is 39.

I needed this to make an inline edit to bunch of files to add ' at a location of interest.

0
Jezz

Hier ist das Dokument der beste Weg, sich nicht um die Flucht zu kümmern:

$ cat <<EOF my $var = "Hello"; print $text, ', world!', "\n";' EOF 

Sie können alle Erweiterungen vollständig durch Verwendung des hier zitierten Dokuments unterbinden:

$ cat <<'EOF' my $var = "Hello"; print $text, ', world!', "\n";' EOF 

Wenn Sie es anstelle von Eingabe als Argument übergeben möchten, können Sie xargs verwenden:

$ xargs -0 <<'EOF' perl -e my $var = "Hello"; print $text, ', world!', "\n";' EOF 
0
SilverWolf

Ich weiß nicht, ob es in bash eine Option gibt, aber mit zsh können Sie ''die RC_QUOTESOption verwenden, nachdem Sie die Option aktiviert haben. (Ich würde zsh empfehlen; es ist meist bash-kompatibel und kann bash für noch mehr Kompatibilität emulieren.)

Mit bash (und immer noch meistens mit zsh) benutze ich es einfach, '\''weil es einfacher zu lesen ist als '"'"'.

Ich habe absolut keine Ahnung, wie es in csh geht.

-1
Micah

Sie können \ 'und \ "verwenden, um Anführungszeichen mit Perl zu schützen, wenn sie intern als Teil eines Perl-Skripts verwendet werden. Ich bin nicht sicher, ob die Befehlszeile dies akzeptieren wird. Sie könnten es versuchen und sehen, ob es funktioniert.

Wenn es so einfach wäre, würde ich nicht fragen. Sie können es ausprobieren und sehen, ob es funktioniert, bevor Sie eine Antwort posten. codeholic vor 14 Jahren 3