Erreur de commande introuvable dans l’affectation de variable Bash

J’ai ce script appelé test.sh:

#!/bin/bash STR = "Hello World" echo $STR 

quand je lance sh test.sh je reçois ceci:

 test.sh: line 2: STR: command not found 

Qu’est-ce que je fais mal? Je regarde des didacticiels de base extrêmement basiques / débutants en ligne et voici comment ils disent de déclarer des variables … Je ne suis donc pas sûr de ce que je fais mal.

Je suis sur le serveur Ubuntu 9.10. Et oui, bash est situé dans /bin/bash .

Vous ne pouvez pas avoir d’espaces autour de votre signe “=”.

Lorsque vous écrivez:

 STR = "foo" 

bash essaie d’exécuter une commande nommée STR avec 2 arguments (les chaînes ‘=’ et ‘foo’)

Lorsque vous écrivez:

 STR =foo 

bash essaie d’exécuter une commande nommée STR avec 1 argument (la chaîne ‘= foo’)

Lorsque vous écrivez:

 STR= foo 

bash essaie d’exécuter la commande foo avec STR défini sur la chaîne vide de son environnement.

Je ne suis pas sûr si cela aide à clarifier ou s’il s’agit simplement de l’obscurcissement, mais notez que:

  1. la première commande est exactement équivalente à: STR "=" "foo" ,
  2. la seconde est la même que STR "=foo" ,
  3. et le dernier est équivalent à STR="" foo .

La section pertinente de la spécification du langage sh, section 2.9.1, indique:

Une “commande simple” est une séquence d’affectations de variables et de redirections facultatives, dans n’importe quelle séquence, éventuellement suivie de mots et de redirections, terminée par un opérateur de contrôle.

Dans ce contexte, un word est la commande que bash va exécuter. Toute chaîne contenant = (dans n’importe quelle position autre que le début de la chaîne) qui n’est pas une redirection est une affectation de variable, tandis que toute chaîne qui n’est pas une redirection et ne contient pas = est une commande. Dans STR = "foo" , STR n’est pas une affectation de variable.

Déposez les espaces autour du signe = :

 #!/bin/bash STR="Hello World" echo $STR 

En mode interactif, tout semble bien

 $ str="Hello World" $ echo $str Hello World 

Évidemment ! comme l’a dit Johannes, pas d’espace autour de ‘=’. Dans le cas où il y aurait un espace autour de ‘=’ alors dans le mode interactif, il y aurait des erreurs comme `

Aucune commande ‘str’ trouvée

Lorsque vous définissez une variable, vous n’avez pas besoin d’insérer d’espaces supplémentaires.

Par exemple

 name = "Stack Overflow" // it is not valid, you will get an error saying- "Command not found" 

Donc, supprimez les espaces:

 name="Stack Overflow" 

et ça marchera bien.