¿Cómo escribir el símbolo "!" Entre comillas dobles en bash? [duplicar]


0

Esta pregunta ya tiene una respuesta aquí:

No puedo entender cómo escribir un !símbolo en los scripts de bash cuando lo pongo entre comillas dobles.

Por ejemplo:

var="hello! my name is $name! bye!"

Algo loco sucede si escribo los siguientes comandos:

$ age=20
$ name='boda'
$ var="hello! my name is $name! bye!"

Cuando presiono enter en el último comando, el comando se repite (se escribe a sí mismo) sin el último !:

var="hello! my name is $name! bye"

Si presiono enter nuevamente:

$ var="hello! my name is $name bye"

Si presiono enter nuevamente, desaparece, no se genera nada:

$ 

Si intento esto:

$ echo "hello\! my name is $name\! bye\!"

Luego sale: hello\! my name is boda\! bye\!

Si uso comillas simples, entonces mi nombre no se expande:

$ echo 'hello! my name is $name! bye!'

Las salidas son: hello! my name is $name! bye!

Lo tengo trabajando de esta manera:

$ echo "hello"'!'" my name is $name"'!'" bye"'!'

Pero es un gran desastre "e 'imposible de entender / editar / mantener / actualizar.

¿Alguien puede ayudar?


@Hastur no! $nameno se expande!
— bodacydo

Lo siento, no puedo reproducir tu problema. Ahora estoy en una computadora y después de los primeros tres pasos, si la escribo echo $var, respóndeme con hello! my name is boda! bye!. ¿Estás seguro de que no escribiste var="hello! my name is $name! bye" !!?
— Hastur

Estoy viendo esto en una nueva ventana de Terminal, después de ejecutar esos 3 comandos, @Hastur. (Y esa carpeta Google no es la carpeta actual en que estoy, pero hacer la historia de comandos de sincronización entre las ventanas de Terminal Server.)
— Arjan

Parece relacionado con la expansión de shell ... @bodacydo 1. escribe las 3 líneas + echo $ var en un pequeño script y ejecútalo. 2. En un nuevo shell escriba echo hienter y luego !!enter. Compruebe si lo expande antes de ejecutarlo. Quizás set +o histexpandpueda ayudar.
— Hastur

1
duplicado: unix.stackexchange.com/q/246170/4667 y stackoverflow.com/q/33980965/7552 - no publique la misma pregunta en varios sitios
— glenn jackman

Respuestas:


0

Su código será más fácil de leer si lo hace así:

:~$ name='boda'
:~$ var="hello! my name is $name! bye!" && echo $var
hello! my name is boda! bye!
  • &&- El segundo comando echo $varse ejecuta solo si el primer comando var="hello! my name is $name! bye!"tiene éxito.

  • :~$ - No se escribe en este ejemplo porque denota el indicador bash.

  • !- No necesita escapar del !comando anterior porque está dentro de un par de comillas dobles.


No veo por qué esto detendría la expansión de la historia bash . Para mí, pegar lo anterior me da esto , comparto el historial de comandos entre las ventanas de Terminal para que incluso una instancia nueva de Bash encuentre algo de historial. Solo usar set +Hcomo se sugiere en el duplicado detiene esto.
— Arjan

Su pregunta fue etiquetada con la linuxetiqueta, por lo que el ejemplo en mi respuesta se ejecutó en Linux en Ubuntu 14.04 (gnome-terminal). Vi un MacOSdirectorio en su captura de pantalla, aunque no estoy seguro si la captura de pantalla fue tomada de una computadora Mac o si esto tiene algo que ver con obtener dos resultados diferentes al ejecutar el mismo comando en dos computadoras diferentes.
— karel

Simplemente escriba, incluidas las comillas, "/some/dummy/command"presione Entrar (obtendrá "No existe tal archivo o directorio") y luego repita los pasos anteriores.
— Arjan

Además, simplemente escribiendo !"y presionando Intro obtendrá ese comando ficticio nuevamente. La historia se expande.
— Arjan

1
Repetí los pasos anteriores que mencionaste y obtuve el mismo resultado que en mi respuesta nuevamente. Estoy usando bash en gnome-terminal en Ubuntu 14.04. Mi gnome-terminal tiene todas las configuraciones predeterminadas, excepto para cambiar las configuraciones para el tamaño de ventana y el esquema de colores de gnome-terminal.
— karel
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.