bash: Mauvaise Substitution
#!/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.
Je suis en train de diviser le jobname
en deux: job_201312161447
et 0003
. Il ne donne cette erreur que lorsque j'essaie de l'exécuter sur Ubuntu.
Toute aide sera très appréciée.
7 réponses
Le shell par défaut (/bin/sh
) sous Ubuntu pointe sur dash
, pas sur bash
.
me@pc:~$ readlink -f $(which sh)
/bin/dash
Donc, {si vous[4]}, puis l'exécuter avec ./your_script_file.sh
, ou si vous l'exécutez avec bash your_script_file.sh
, il devrait fonctionner correctement.
L'exécuter avec sh your_script_file.sh
ne fonctionnera pas car la ligne hashbang 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
Votre syntaxe de script est valide bash et bonne.
Causes Possibles de l'échec:
Votre
bash
n'est pas vraiment bash maisksh
ou un autre shell qui ne comprend pas la substitution de paramètre de bash. Parce que votre script semble bien et fonctionne avec bash. Faitesls -l /bin/bash
et vérifiez que c'est vraiment bash et non lié à un autre shell.Si vous avez bash sur votre système, alors vous pouvez exécuter votre script de la mauvaise façon comme:
ksh script.sh
oush script.sh
(et votre shell par défaut n'est pas bash). Puisque vous avez le bon shebang, si vous avez bash./script.sh
oubash ./script.sh
devrait être bien.
Pour les autres qui arrivent ici, ce message apparaît également lors de l'utilisation de la variable env syntaxe de commandes, par exemple ${which sh}
au lieu de le corriger $(which sh)
Essayez d'exécuter le script explicitement en utilisant la commande bash plutôt que de simplement l'exécuter en tant qu'exécutable.
Assurez-vous également de ne pas avoir de chaîne vide pour la première ligne de votre script.
C'est-à-dire assurez-vous#!/bin/bash est la première ligne de votre script.
Les deux - bash ou dash-fonctionnent, mais la syntaxe doit être:
FILENAME=/my/complex/path/name.ext
NEWNAME=${FILENAME%ext}new