Esta pregunta ya tiene una respuesta aquí:
- En bash, ¿cómo escapo de un signo de exclamación? 5 respuestas
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?

$nameno se expande!echo $var, respóndeme conhello! my name is boda! bye!. ¿Estás seguro de que no escribistevar="hello! my name is $name! bye" !!?echo hienter y luego!!enter. Compruebe si lo expande antes de ejecutarlo. Quizásset +o histexpandpueda ayudar.Respuestas:
Su código será más fácil de leer si lo hace así:
&&- El segundo comandoecho $varse ejecuta solo si el primer comandovar="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.fuente
set +Hcomo se sugiere en el duplicado detiene esto.linuxetiqueta, por lo que el ejemplo en mi respuesta se ejecutó en Linux en Ubuntu 14.04 (gnome-terminal). Vi unMacOSdirectorio 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."/some/dummy/command"presione Entrar (obtendrá "No existe tal archivo o directorio") y luego repita los pasos anteriores.!"y presionando Intro obtendrá ese comando ficticio nuevamente. La historia se expande.