¿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.