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.

78
demandé sur Shubham 2013-12-16 20:01:20

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.

130
répondu Vanni Totaro 2013-12-16 16:44:24

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
38
répondu Guest 2014-04-24 19:39:26

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 semble bien et fonctionne avec bash. Faites ls -l /bin/bash et vérifiez que c'est vraiment bash et non lié à un autre shell.

  2. Si vous avez bash sur votre système, alors vous pouvez exécuter votre script de la mauvaise façon 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 être bien.

17
répondu P.P. 2013-12-16 16:35:11

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)

10
répondu Nacho Coloma 2016-08-17 09:33:52

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.

4
répondu Pale Blue Dot 2013-12-16 16:18:56

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.

1
répondu wizurd 2016-04-05 18:23:16

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

FILENAME=/my/complex/path/name.ext
NEWNAME=${FILENAME%ext}new
0
répondu Hagen 2016-03-10 10:03:32