#!/bin/bash
jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
Este script bash me da un error de sustitución incorrecto en Ubuntu. Cualquier ayuda será muy apreciada.
fuente
#!/bin/bash
jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
Este script bash me da un error de sustitución incorrecto en Ubuntu. Cualquier ayuda será muy apreciada.
El shell predeterminado ( /bin/sh
) en Ubuntu apunta a dash
, no bash
.
me@pc:~$ readlink -f $(which sh)
/bin/dash
Entonces, si usted chmod +x your_script_file.sh
y luego lo ejecuta ./your_script_file.sh
, o si lo ejecuta bash your_script_file.sh
, debería funcionar bien.
Ejecutarlo sh your_script_file.sh
no funcionará porque la línea hashbang se ignorará y el script será interpretado por dash
, lo que no admite esa sintaxis de sustitución de cadenas.
/bin/bash
para que su respuesta no encaje? ¿Dónde lees que está usando /bin/sh
o sh script.sh
?
bad substitution
y solo estoy tratando de recopilar información, pero esta pregunta no ayuda porque tiene muy poca información.
Yo tuve el mismo problema. Asegúrese de que su guión no tenga
#!/bin/sh
en la parte superior de tu guión. En cambio, deberías agregar
#!/bin/bash
#!bin/bash
y sh script.sh
, todavía me dio el mensaje de error. Entonces ./script.sh
funciona.
#!/bin/bash
también reparará la sustitución incorrecta .
#!
línea se usa solo cuando ejecuta su script directamente. Si usa sh script.sh
la línea se ignora por completo.
Para otros que lleguen aquí, este mensaje exacto también aparecerá cuando se use la sintaxis de la variable env para los comandos, por ejemplo, en ${which sh}
lugar de la correcta$(which sh)
La sintaxis de su script es válida bash y buena.
Posibles causas de la falla:
Your bash
no es realmente bash pero ksh
o algún otro shell que no comprende la sustitución de parámetros de bash. Porque tu script se ve bien y funciona con bash. Haga ls -l /bin/bash
y compruebe que sea realmente bash y no esté vinculado a ningún otro shell.
Si tiene bash en su sistema, entonces puede estar ejecutando su script de manera incorrecta como: ksh script.sh
o sh script.sh
(y su shell predeterminado no es bash). Ya que tienes un shebang adecuado, si tienes bash ./script.sh
o bash ./script.sh
deberías estar bien.
/bin/bash
(no /bin/sh
) alguna vez estuvieran vinculados a un shell diferente.
Intente ejecutar el script explícitamente usando el comando bash en lugar de solo ejecutarlo como ejecutable.
sh script
y bash script
... mi sugerencia :)
Además, asegúrese de no tener una cadena vacía para la primera línea de su secuencia de comandos.
es decir, asegúrese de que #!/bin/bash
sea la primera línea de su secuencia de comandos.
No es relevante para su ejemplo, pero también puede obtener el Bad substitution
error en Bash para cualquier sintaxis de sustitución que Bash no reconozca. Esto podría ser:
bash -c '${x }'
bash -c '${x;-}'
bash -c '${x@Q}'
antes de Bash 4.4.Si tiene múltiples sustituciones en la misma expresión, Bash puede no ser muy útil para identificar la expresión problemática. P.ej:
$ bash -c '"${x } multiline string
$y"'
bash: line 1: ${x } multiline string
$y: bad substitution
Bad substitution
así que pensé en incluir el caso con el que nos encontramos. (Estaba @Q
en Bash 4.3 escondiéndose en una larga expresión de varias líneas.)
Ambos, bash o dash, funcionan, pero la sintaxis debe ser:
FILENAME=/my/complex/path/name.ext
NEWNAME=${FILENAME%ext}new
Parece que "+ x" causa problemas:
root@raspi1:~# cat > /tmp/btest
#!/bin/bash
jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
root@raspi1:~# chmod +x /tmp/btest
root@raspi1:~# /tmp/btest
root@raspi1:~# sh -x /tmp/btest
+ jobname=job_201312161447_0003
/tmp/btest: 4: /tmp/btest: Bad substitution
Estaba agregando un signo de dólar dos veces en una expresión con llaves en bash:
cp -r $PROJECT_NAME ${$PROJECT_NAME}2
en vez de
cp -r $PROJECT_NAME ${PROJECT_NAME}2
He descubierto que este problema es causado por la respuesta marcada o tiene una línea o espacio antes de la declaración de bash
cut
?cut -d_ -f1,2 <<< "$jobname"
ycut -d_ -f3 <<< "$jobname"
hacerlosh script.sh
, aparece un error de "Mala sustitución".