105 votes

Tableaux associatifs : erreur "declare : -A : option non valide"

J'ai écrit un script qui utilise des tableaux associatifs dans bash (v 4).

Cela fonctionne bien sur ma machine locale qui utilise 4.1.5(1)-release .

Sur la machine de production, en utilisant 4.1.0(1)-release la ligne suivante, qui déclare le tableau assoc, échoue :

declare -A uniqjars

avec le message :

/script.sh: line 11: declare: -A: invalid option
declare: usage: declare [-afFirtx] [-p] [name[=value] ...]

J'avais l'impression qu'il s'agissait d'une fonctionnalité générale de bash 4 ?

Dans le manuel de bash sur la machine de production, il est question de l'utilisation de -A Je suppose donc qu'il debe travail.

Les tableaux associatifs sont créés à l'aide de declare -A _name_ .

Je peux confirmer que le script utilise la bonne version de bash en imprimant la valeur de echo 'bash -version .

Que pourrais-je faire de mal ?

9voto

Tyler Points 1422
  1. Vérifiez l'interpréteur de commandes que vous utilisez avec cette commande :

    echo $SHELL

    Par exemple, il pourrait dire /bin/bash

  2. Exécuter --version sur ce point $SHELL :

    /bin/bash --version

    Il peut en résulter quelque chose comme GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)

    Si elle est antérieure à la version 4, vous devrez la mettre à jour.

  3. Vérifiez si vous disposez déjà d'un shell bash avec la version 4. Essayez d'exécuter :

    bash --version

    Si c'est le cas, il vous suffit de remplacer votre shell par défaut par ce shell.

    Pour ce faire, vous pouvez utiliser les commandes suivantes :

    sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'
    sudo chsh -s /usr/local/bin/bash

    La première ajoute le shell aux shells autorisés. La seconde modifie votre shell par défaut.

3voto

anubhava Points 172509

L'ancienne version de BASH ne prenait pas en charge declare -A syntaxe de déclaration des tableaux. Je suggère d'utiliser l'une ou l'autre de ces deux formes pour déclarer les tableaux dans bash afin de le rendre compatible avec les anciennes versions de bash de votre système de production :

arr=( '10' '20' '30' )
echo ${arr[@]}

ou

arr[0]=10
arr[1]=20
arr[2]=30
echo ${arr[@]}

3voto

Mihey Mik Points 562

Rien de ce qui précède ne m'a aidé, alors j'ai ouvert le fichier /etc/shells et j'ai changé la ligne - /bin/bash a /usr/local/bin/bash et l'a ensuite rechargé avec source /etc/shells et maintenant je peux profiter des nouvelles possibilités de la v4 de bash

1voto

Selon la commande :

help declare
declare: declare [-aAfFgilnrtux] [-p] [name[=value] ...]
  Set variable values and attributes.

Declare variables and give them attributes.  If no NAMEs are given,
display the attributes and values of all variables.
Options which are set attributes:
  -a        to make NAMEs indexed arrays (if supported)
  -A        to make NAMEs associative arrays (if supported)

Notez que les minuscules "-a" et les majuscules "-A" sont "(si supporté)". De plus, si vous regardez le message d'erreur affiché pour déclarer l'utilisation :

/script.sh: line 11: declare: -A: invalid option
declare: usage: declare [-afFirtx] [-p] [name[=value] ...]

Les options données sont "[-afFirtx]" indiquant d'utiliser un "-a" minuscule mais pas de "-A" majuscule. Comparez cela à la chaîne d'utilisation de la commande help. Il semble que ce ne soit pas supporté sur la machine en question.

0voto

Khanan Points 1

Essayez d'utiliser un autre système. Sur mon Mac :

$ which bash
/usr/local/bin/bash

Ainsi, ce script s'exécute correctement et produit "Hello World" :

#!/usr/local/bin/bash
declare -A assoc
assoc[hello]="Hello World"
echo ${assoc[hello]}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X