Wie wird ein "einfaches Anführungszeichen" ausgegeben, wenn Sonderzeichen in einfache Anführungszeichen eingeschlossen werden?

26

Ich lese heute ein Shell-Tutorial von http://www.tutorialspoint.com/unix/unix-quoting-mechanisms.htm

In dem es erwähnt:

Wenn ein einzelnes Anführungszeichen in einer auszugebenden Zeichenfolge enthalten ist, sollten Sie nicht die gesamte Zeichenfolge in einzelne Anführungszeichen setzen, sondern dies mit einem Backslash () voranstellen:

echo 'It\'s Shell Programming'

Ich habe es auf meinem Centos-Server versucht, es funktioniert nicht. Es wird gefragt, ob ich mehr tippen möchte >.

Ich habe mich gefragt, da zwei einfache Anführungszeichen jedes Sonderzeichen in normale Zeichen umwandeln, die ein Escape-Symbol enthalten \, sich aber selbst ausschließen '.
Wie soll ich ein einfaches Anführungszeichen 'in einem einfachen Anführungszeichen darstellen?

Zen
quelle
1
Warum nicht echo It\'s Shell Programmingoder verwenden echo "It's Shell Programming"?
Dienstag,
@ Cuonglm, weil ich Satz wieecho Wow, I'm going to have lots of $$$$$$ now
Zen
2
Sie sollten also doppelte Anführungszeichen verwenden und auch entkommen $. Etwas wie echo Wow, I\'m going to have lots of \$\$\$\$\$\$ nowoder nurecho Wow, I\'m going to have lots of '$$$$$$' now
cuonglm
@ Cuonglm, ja, ich kann es tun und ich weiß, wie ich es tun kann. Aber das Tutorial, das ich gelesen habe, scheint zuversichtlich zu sein, dass es eine Möglichkeit gibt, einfache Anführungszeichen in einfach zitierten Ausdrücken zu umgehen, aber das angegebene Beispiel des Tutorials funktioniert nicht. Ich frage mich also, ob jemand die Lösung kennt.
Zen
1
Wie wäre es damit? echo 'It'"'"'s Shell Programming'. Ich teile es einfach in 3 Zeichenfolgen ein, wobei die erste und die letzte von einfachen Anführungszeichen umgeben sind, während die mittlere von doppelten Anführungszeichen umgeben ist.
jcbermu

Antworten:

49

Das Tutorial ist falsch.

POSIX sagt:

Ein einfaches Anführungszeichen darf nicht in einfachen Anführungszeichen stehen.

Hier sind einige Alternativen:

echo $'It\'s Shell Programming'  # ksh, bash, and zsh only, does not expand variables
echo "It's Shell Programming"   # all shells, expands variables
echo 'It'\''s Shell Programming' # all shells, single quote is outside the quotes
echo 'It'"'"'s Shell Programming' # all shells, single quote is inside double quotes

Lesen Sie weiter: Zitate - Gregs Wiki

Mikel
quelle
4
Ein weiteres echo 'It''s Shell Programming'Argument : - zsh mit rc_quotesOptionssatz (und auch die RC-Shell) - Ein paar einfache Anführungszeichen in einfachen Anführungszeichen stehen für ein einfaches Anführungszeichen.
Michał Politowski
5
Ich benutze q="'"und qq='"'mache das manchmal sauberer. Dies erlaubt dann echo "It${q}s ${qq}Shell Programming${qq}"(geschweifte Klammern werden bei nachgestellten Buchstaben benötigt). POSIX-sicher. Die äußere Schicht muss in doppelte Anführungszeichen gesetzt werden.
Adam Katz
1

Sie können verwenden:

sed "s/'"'/&\\&&/g
     s/.*/'"'&'"'/
' <<IN
$arbitrary_value
IN

Um sicher zu sein, zitieren Sie einen Wert zeilenweise.

Abhängig von der Shell haben Sie möglicherweise auch die Option:

printf %q\\n "$arbitrary_value"

Normalerweise bevorzuge ich:

a=$(alias "a=$arbitrary_value" a); a=${a#*=}

Ein manuellerer Ansatz könnte folgendermaßen aussehen:

sq(){ set \' "$1"
      while case $2 in (*\'*) :;;
      (*) ! RETURN="$1$2'"     ;;esac
      do  set "$1${2%%\'*}'\''" "${2#*\'}"
      done
}

... was zumindest gabelfrei ist.

mikeserv
quelle
1
Ich habe überhaupt keine Ahnung, wovon du sprichst, außer dem Satz printf %q\\n "$arbitrary_value", andere sind zu kompliziert.
Zen
1

Falls jemand anderes kommt, um eine Mischung aus einfachen und doppelten Anführungszeichen in eine Datei einzufügen, funktioniert dies auch:

cat > its-shell-programing.txt << __EOF__
echo $'It\'s Shell Programming'
echo "It's Shell Programming"
echo 'It'\''s Shell Programming'
echo 'It'"'"'s Shell Programming'
__EOF__

Alles, was die Shell als Variable sieht, muss durch einen Backslash maskiert werden:

cat >> its-shell-programing.txt << __EOF__
echo \$It\'s Shell Programming
__EOF__
alexh
quelle