#!/bin/bash
jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
Ce script bash me donne Mauvaise substitution erreur sur Ubuntu. Toute aide sera grandement appréciée.
Le shell par défaut (/bin/sh
) sous Ubuntu pointe vers dash
, pas bash
.
me@pc:~$ readlink -f $(which sh)
/bin/dash
Donc, si vous chmod +x your_script_file.sh
et que vous l'exécutez avec ./your_script_file.sh
, ou si vous l'exécutez avec bash your_script_file.sh
, cela devrait fonctionner correctement.
L'exécuter avec sh your_script_file.sh
ne fonctionnera pas car la ligne de hachage sera ignorée et le script sera interprété par dash
, qui ne prend pas en charge cette syntaxe de substitution de chaîne.
J'ai eu le même problème. Assurez-vous que votre script n'a pas
#!/bin/sh
en haut de votre script. Au lieu de cela, vous devriez ajouter
#!/bin/bash
Pour les autres qui arrivent ici, ce message exact apparaîtra également lors de l’utilisation de la syntaxe de la variable env pour les commandes, par exemple ${which sh}
au lieu du correct $(which sh)
.
Votre syntaxe de script est valide bash et bonne.
Causes possibles de l'échec:
Votre bash
n'est pas vraiment bash mais ksh
ou un autre Shell qui ne comprend pas la substitution de paramètre de bash. Parce que votre script a l'air bien et fonctionne avec bash. Faites ls -l /bin/bash
et vérifiez que c'est vraiment bash et pas sym-lié à un autre shell.
Si vous avez bash sur votre système, alors vous exécuterez peut-être votre script dans le mauvais sens, comme: ksh script.sh
ou sh script.sh
(et votre shell par défaut n’est pas bash). Puisque vous avez le bon Shebang, si vous avez bash ./script.sh
ou bash ./script.sh
devrait aller.
Essayez d'exécuter le script de manière explicite en utilisant la commande bash plutôt que de simplement l'exécuter en tant qu'exécutable.
Assurez-vous également que vous n'avez pas de chaîne vide pour la première ligne de votre script.
c’est-à-dire que #!/bin/bash est la toute première ligne de votre script.
Les deux - bash ou dash - fonctionnent, mais la syntaxe doit être la suivante:
FILENAME=/my/complex/path/name.ext
NEWNAME=${FILENAME%ext}new