web-dev-qa-db-fra.com

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. Toute aide sera grandement appréciée.

107
Arindam Choudhury

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.

160
Vanni Totaro

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
51
Guest

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).

19
Nacho Coloma

Votre syntaxe de script est valide bash et bonne.

Causes possibles de l'échec:

  1. 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.

  2. 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.

19
P.P.

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.

6
Pale Blue Dot

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.

2
wizurd

Les deux - bash ou dash - fonctionnent, mais la syntaxe doit être la suivante:

FILENAME=/my/complex/path/name.ext
NEWNAME=${FILENAME%ext}new
0
Hagen