¿Cómo hacer eco de 'comilla simple' cuando se usa comilla simple para envolver caracteres especiales en el shell?

26

Estoy leyendo el tutorial de Shell hoy en http://www.tutorialspoint.com/unix/unix-quoting-mechanisms.htm

En el que menciona:

Si aparece una comilla simple dentro de una cadena que se va a generar, no debe colocar la cadena completa entre comillas simples, sino que debe preceder eso usando una barra diagonal inversa () de la siguiente manera:

echo 'It\'s Shell Programming'

Probé esto en mi servidor centos, no funciona, me >pide que me escriba más.

Me preguntaba, ya que dos comillas simples transforman todos los caracteres especiales en caracteres normales, que incluyen el símbolo de escape \, pero se excluyen ',
¿cómo debo representar una comilla simple 'en una frase entre comillas simples?

zen
fuente
1
¿Por qué no usar echo It\'s Shell Programmingo echo "It's Shell Programming"?
Cuonglm
@cuonglm, porque puedo usar frases comoecho Wow, I'm going to have lots of $$$$$$ now
Zen
2
Por lo tanto, debe usar comillas dobles y escapar $también. Algo como echo Wow, I\'m going to have lots of \$\$\$\$\$\$ nowo soloecho Wow, I\'m going to have lots of '$$$$$$' now
cuonglm
@cuonglm, sí, puedo hacerlo y sé cómo puedo hacerlo. Pero el tutorial que he estado leyendo parece estar seguro de que hay una manera de escapar de las comillas simples dentro de frases entre comillas simples, pero el ejemplo dado del tutorial no funciona. Así que me pregunto si alguien puede conocer la solución.
Zen
1
¿Qué tal esto? echo 'It'"'"'s Shell Programming'. Simplemente lo divido en 3 cadenas, la primera y la última rodeadas de comillas simples, pero la del medio tiene una comilla simple rodeada de comillas dobles.
jcbermu

Respuestas:

49

El tutorial está mal.

POSIX dice:

Una comilla simple no puede ocurrir dentro de comillas simples.

Aquí hay algunas alternativas:

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

Lectura adicional: Citas - Greg's Wiki

Mikel
fuente
44
Una más: echo 'It''s Shell Programming'- zsh con rc_quotesconjunto de opciones (y el shell rc también) - un par de comillas simples dentro de comillas simples representa una comilla simple.
Michał Politowski
55
A veces uso q="'"y qq='"'para hacer este limpiador. Esto luego permite echo "It${q}s ${qq}Shell Programming${qq}"(se necesitan llaves para las letras finales). POSIX seguro. La capa externa debe estar entre comillas dobles.
Adam Katz
1

Puedes usar:

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

Para cotizar con seguridad una línea de valor por línea.

Dependiendo de Shell, también puede tener la opción de hacer:

printf %q\\n "$arbitrary_value"

Aunque generalmente prefiero hacer:

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

Un enfoque más manual podría verse así:

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

... que es, al menos, sin tenedor.

mikeserv
fuente
1
No tengo ni idea de lo que estás hablando, excepto la frase printf %q\\n "$arbitrary_value", otros son demasiado complicados.
Zen
1

En caso de que alguien más aparezca para poner una combinación de comillas simples y dobles en un archivo, esto también funciona:

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__

Sin embargo, todo lo que el shell puede ver como una variable debe ser escapado por una barra invertida:

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