#!/bin/bash
jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
Ce script bash me donne une mauvaise erreur de substitution sur Ubuntu. Toute aide sera grandement appréciée.
string
bash
ubuntu
substitution
Arindam Choudhury
la source
la source
cut
?cut -d_ -f1,2 <<< "$jobname"
etcut -d_ -f3 <<< "$jobname"
faites-lesh script.sh
une erreur "Mauvaise substitution".Réponses:
Le shell par défaut (
/bin/sh
) sous Ubuntu pointe versdash
, pasbash
.Donc, si vous l'
chmod +x your_script_file.sh
exécutez avec./your_script_file.sh
, ou si vous l'exécutez avecbash your_script_file.sh
, cela devrait fonctionner correctement.L'
sh your_script_file.sh
exécuter avec ne fonctionnera pas car la ligne de hachage sera ignorée et le script sera interprété pardash
, ce qui ne prend pas en charge cette syntaxe de substitution de chaîne.la source
/bin/bash
donc votre réponse ne correspond pas?! Où lisez-vous qu'il utilise/bin/sh
oush script.sh
?bad substitution
et j'essaie simplement de rassembler des informations, mais cette question n'aide pas car elle contient trop peu d'informations.J'ai eu le même problème. Assurez-vous que votre script n'a pas
en haut de votre script. Au lieu de cela, vous devez ajouter
la source
#!bin/bash
etsh script.sh
, cela m'a toujours donné le message d'erreur. Puis./script.sh
fonctionne.#!/bin/bash
corrigera également la substitution Bad .#!
ligne n'est utilisée que lorsque vous exécutez directement votre script. Si vous utilisezsh script.sh
la ligne est complètement ignorée.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 bon$(which sh)
la source
La syntaxe de votre script est bash valide 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 des paramètres de bash. Parce que votre script a l'air 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 exécutez peut-être votre script dans le mauvais sens comme:
ksh script.sh
oush script.sh
(et votre shell par défaut n'est pas bash). Puisque vous avez un bon shebang, si vous avez un coup./script.sh
ou çabash ./script.sh
devrait aller.la source
/bin/bash
(non/bin/sh
) jamais été lié à un shell différent.Essayez d'exécuter le script explicitement en utilisant la commande bash plutôt que de l'exécuter simplement en tant qu'exécutable.
la source
sh script
etbash script
... ma suggestion :)Assurez-vous également que vous n'avez pas de chaîne vide pour la première ligne de votre script.
c'est à dire assurez-vous que
#!/bin/bash
c'est la toute première ligne de votre script.la source
Pas pertinent pour votre exemple, mais vous pouvez également obtenir l'
Bad substitution
erreur dans Bash pour toute syntaxe de substitution que Bash ne reconnaît pas. Cela pourrait être:bash -c '${x }'
bash -c '${x;-}'
bash -c '${x@Q}'
avant Bash 4.4.Si vous avez plusieurs substitutions dans la même expression, Bash peut ne pas être très utile pour identifier l'expression problématique. Par exemple:
la source
Bad substitution
donc j'ai pensé inclure le cas que nous avons rencontré. (C'était@Q
dans Bash 4.3 caché dans une longue expression multi-lignes.)@Q
ajout debash-4.4
.Les deux - bash ou dash - fonctionnent, mais la syntaxe doit être:
la source
On dirait que "+ x" cause des problèmes:
la source
J'ajoutais deux fois un signe dollar dans une expression avec des accolades en bash:
au lieu de
la source
J'ai constaté que ce problème est soit causé par la réponse marquée, soit vous avez une ligne ou un espace avant la déclaration bash
la source