610 votes

Déclaration de variable de script bash basique - commande non trouvée

Cela semble être une question si simple que je suis gêné de lui demander:

test.sh

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

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

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

Qu'est-ce que je fais mal? Je regarde en ligne des tutoriels bash / basiques bash scripting en ligne et c'est ainsi qu'ils disent de déclarer des variables ... Donc je ne suis pas sûr de ce que je fais mal.

Je suis sur Ubuntu Server 9.10. Et oui, bash est situé à / bin / bash.

1076voto

William Pursell Points 56211

Vous ne pouvez pas avoir des 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 de caractères "=foo')

Lorsque vous écrivez:

STR= foo

bash essaie d'exécuter la commande foo avec STR ensemble de la chaîne vide dans son environnement.

Je ne sais pas si cela aide à clarifier ou si il est simple de dissimulation, mais note que:

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

La section pertinente du sh langue spec, la section 2.9.1 états:

Un "simple commande" est une séquence de variables en option des affectations et des redirections, dans n'importe quel ordre, suivie éventuellement par des mots et des redirections, terminé par un opérateur de contrôle.

Dans ce contexte, une word est la commande bash va exécuter. Toute chaîne de caractères contenant = (dans une autre position qu'au 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 d' = est une commande. En STR = "foo", STR n'est pas une affectation de variable.

178voto

Joey Points 148544

Déposer les espaces autour de l' = signe:

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

12voto

Jim Points 678

C'est aussi une bonne idée pour utiliser des accolades autour de vos variables de référencement.

Donc:

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

devient:

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

Il est plus explicite moyen de faire référence à des variables plus tard. Il est nécessaire si vous imprimez une variable texte. Voici un exemple simplifié:

#!/bin/bash 
# list all the report files for January in a directory
REP_MONTH=January
ls ./$REP_MONTH.rpt

Le code ci-dessus va donner une erreur car il n'y a pas de variable $REP_MONTH.la rpt. Toutefois, si vous utilisez la syntaxe complète (accolades) avec la variable, votre intention est claire et peut être interprétée sans erreur.

#!/bin/bash 
# list all the report files for January in a directory
REP_MONTH=January
ls ./${REP_MONTH}.rpt

Les accolades d'identifier clairement le bash variable dans la commande de construire.

8voto

Arkapravo Points 1008

Dans le mode interactif ! tout semble parfait

:~$ str="Hello World"

:~$ echo $str

Hello World

De toute évidence ! comme Johannes dit, pas d'espace autour de '='. Dans le cas où il y a tout l'espace autour de"=", puis dans le mode interactif, il donne des erreurs comme"

Aucune commande 'str' n'a été trouvé

1voto

damphat Points 2907

J'ai lu toutes les réponses, mais il y a encore une chose à noter:

STR= bonjour

STR=bonjour ls

La 1ère ligne de commande exécuter "bonjour", mais PAS de jeu de STR "".

Le 2e ligne exécution de la commande "ls" mais PAS de jeu de STR pour "bonjour".

Laisser utiliser echo $STR pour chaque étape pour voir le résultat.

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