Problème avec le script Bash: 'declare: not found'

23

J'avais un script qui fonctionnait bien mais quand je l'ai exécuté aujourd'hui, ça dit declare: not found. J'utilise le shell bash et le chemin au début du script est correct.

Deux lignes marquées dans mon script sont les suivantes:

declare -a RESPONSE
RESPONSE=($RESULT)

Il dit également que (c'est inattendu, mais je suppose que cela arrive à cause de la première erreur. Il convient de mentionner le point lorsque je tape dans déclarer directement fonctionne bien.

declare | grep USER spectacles

USER=ashfame
USERNAME=ashfame
           values="$SVN_BASH_USERNAME";

Alors, qu'est-ce qui ne va pas ici?

Ashfame
la source

Réponses:

27

Utilisez-vous à la shplace de bash? sh(lié à dash) ne prend pas en charge le declaremot clé, ni la syntaxe

VAR=(list) 

pour initialiser les tableaux.

enzotib
la source
Ma ligne de shebang est #!/bin/bashseulement. Voulez-vous dire comment je l'exécute? J'ai juste essayé de l'exécuter au fur ./script.shet à mesure. Mais cela ne fonctionne pas comme script.shou sh script.shet je suis à peu près sûr que je n'utilisais que les deux dernières méthodes lors de ma création il y a une semaine. Qu'est-ce qui pourrait expliquer cela?
Ashfame
@Ashfame: il y a peut-être une semaine, il manquait les fonctionnalités spécifiques à bash que vous avez maintenant, donc cela a également fonctionné avec sh script.sh
enzotib
Non, je voulais dire exactement ce script fonctionnait il y a une semaine ou deux semaines. Ou vous vouliez dire qu'une mise à jour aurait pu apporter un changement?
Ashfame
@Ashfame: Je ne sais pas, ce script, comme vous le montrez maintenant, ne peut pas fonctionner avec sh script.sh.
enzotib
11

Je soupçonne que votre ligne "shebang" (la première ligne facultative du fichier) fait référence à la shplace de bash. CA devrait etre

#!/bin/bash

pour les scripts bash. Si la première ligne de votre script est

#!/bin/sh

cela indiquerait alors qu'une coque strictement compatible avec la bourne doit être utilisée; dans le cas d'Ubuntu, dashest utilisé. Dans de nombreuses autres distributions, cela ne pose pas de problème, car elles sont liées /bin/shà /bin/bash; cependant ubuntu établit un lien vers /bin/dashafin de permettre aux scripts système de s'exécuter plus rapidement.

Le declarebuiltin est l'une des bashnombreuses extensions de la spécification de script shell Bourne; dashimplémente simplement cette spécification sans extensions.

intuition
la source
Ma ligne de shebang est #!/bin/bashseulement
Ashfame
@Ashfame: comment exécutez-vous le script? Si vous l'invoquez en tapant simplement le nom du script, la ligne shebang déterminera quel interpréteur l'exécute. Cependant, si vous l'invoquez explicitement via sh thescript.sh, le shshell - ie dashl'interprétera.
intuition
1
@intuited, je le parcourais sh script.sh. Je comprends ce que vous avez dit, mais j'ai lu quelque part qu'avec cette méthode, bashje vais l'interpréter. Pourquoi dashle jouer ici? Est-ce uniquement avec Ubuntu? Peut-être que ce que j'ai lu était pour Linux en général.
Ashfame
2
@Ashfame avec sh scriptvous exécute la commande shavec l'argument script, qui fait lire et exécuter les commandes dans ce fichier. Le shebang n'est pas lu par sh, il commence par un #, il est donc traité comme un commentaire. Si vous exécutez à la place ./script, le noyau lira le shebang, ce qui dans votre cas est #!/bin/bash, et ainsi il s'exécute/bin/bash ./script
geirha
@geirha oui c'est comme ça que je sais que ça marche mais @intuited mention qui dashsera utilisée, donc je dois le clarifier
Ashfame
3

Comment reproduire l'erreur ci-dessus:

J'utilise Ubuntu 14.04 64 bits. Mettez ce code dans un fichier:

#!/bin/sh 
declare -i FOOBAR=12; 
echo $FOOBAR; 

Exécutez-le comme ceci:

el@apollo:~$ ./06.sh 
./test.sh: 2: ./test.sh: declare: not found

Pour le réparer, faites ceci à la place:

#!/bin/bash
declare -i FOOBAR=12;
echo $FOOBAR;

Tirages:

el@apollo:~$ ./06.sh 
12
Eric Leschinski
la source
1

J'ai eu le même problème, puis je me suis souvenu que vous devez attribuer les bonnes autorisations pour exécuter le script shell.

Modifiez l'autorisation du script, par exemple:

chmod 755 script.sh
Edgard Padilla
la source
1

Essayez /bin/bashplutôt d' exécuter votre script en utilisant la ligne de commande si sh(:

Au lieu de :

    sh script.sh

Essayez:

    / bin / bash script.sh
Marcher
la source
1

Sur Ubuntu, vous pouvez avoir un script qui exécute d'autres scripts en lui, que j'ai rencontré.

some_dir/  
        | main.sh  
        | shhh.sh

#!/bin/bash -e

echo "file? $0"
# file? ./main.sh

echo "shell? $SHELL" 
# shell? /bin/bash

# sh shhh.sh
# file? shhh.sh
# shell? /bin/bash
# shhh.sh: 5: shhh.sh: declare: not found

$SHELL shhh.sh
# file? shhh.sh
# shell? /bin/bash
# foo? bar

#!/bin/bash -e

echo "file? $0"
# shhh.sh

echo "shell? $SHELL"
# shell? /bin/bash

declare foo="bar"

echo "foo? $foo"

Tout changer sh some_script.shpour le $SHELL some_script.shréparer.

Rahman Malik
la source