Intento un reemplazo de cadena básico en un script bash:
#!/bin/bash
x="I love Linux"
echo "${x/Linux/Unix}"
Funciona bien en mi mac, pero no funciona en mi servidor. Probé diferentes ejemplos de varios sitios, pero siempre aparece el error:
Bad substitution
Mi versión de bash:GNU bash, Version 4.4.12(1)-release (x86_64-pc-linux-gnu)
¿Qué estoy haciendo mal?
Respuesta1
echo "${x/Linux/Unix}"
es la sintaxis correcta en bash desde la versión 2.0 que se lanzó en 1996.
Bash no emite el mensaje de error exacto Bad substitution
. Su mensaje cuando encuentra algo que parece casi, pero no del todo, una sustitución de parámetro, es ligeramente diferente:
$ bash -c '${}'
bash: ${}: bad substitution
Por otro lado, Dash, que es la implementación de /bin/sh
muchos sistemas Linux, emite exactamente este mensaje:
$ dash -c 'echo "${x/Linux/Unix}"'
dash: 1: Bad substitution
El error es suficiente indicio de que,como lo notó Kusalananda, en realidad no estás ejecutando este script como un programa: estás ejecutando algún programa, presumiblemente sh
o /bin/sh
, y le estás indicando que ejecute este script. Su script es un programa bash correcto pero no un programa sh correcto, por lo que no funcionará en sistemas donde sh es un dialecto diferente que no tiene las mismas funciones configuradas que bash.
Su script es un programa independiente. Elel asuntoLa línea en la parte superior del script le dice al sistema qué intérprete usar. Para ejecutar el script, simplemente escriba su ruta o su nombre de archivo si está en la ruta de búsqueda del comando ( $PATH
). Como cualquier otro programa ejecutable, ya sea un script (tiene una línea shebang) o no (un binario que el núcleo ejecuta por sí solo 1 ), necesita tener permisos de ejecución ( chmod +x path/to/script
). Si por alguna razón tienes un script que no es un programa independiente y quieres ejecutarlo con bash, ejecuta bash path/to/script
, no sh path/to/script
.
1 O con otros medios para transmitir cómo se ejecutará el archivo, como el mecanismo binfmt_misc en Linux.