web-dev-qa-db-fra.com

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 tutoriels de script bash 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 Ubuntu Server 9.10. Et oui, bash est situé à /bin/bash.

471
Jake Wilson

Vous ne pouvez pas avoir d'espaces autour de votre signe '='.

Quand tu écris:

STR = "foo"

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

Quand tu écris:

STR =foo

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

Quand tu écris:

STR= foo

bash tente d'exécuter la commande foo avec STR sur la chaîne vide dans son environnement.

Je ne suis pas sûr que cela aide à clarifier ou s'il s'agit simplement d'un obscurcissement, mais notez que:

  1. la première commande est exactement équivalente à: STR "=" "foo",
  2. le second est identique à STR "=foo",
  3. et le dernier est équivalent à STR="" foo.

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

Une "commande simple" est une séquence d'affectations de variables et de redirections facultatives, dans toute séquence, éventuellement suivies de mots et de redirections, terminées 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 une 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 qui ne contient pas = est un commander. Dans STR = "foo", STR n'est pas une affectation de variable.

857
William Pursell

Supprimez les espaces autour du signe =:

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

En mode interactif, tout va 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 a un espace autour de '=', alors dans le mode interactif, les erreurs sont comme suit:

Aucune commande 'str' trouvée

5
Arkapravo

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

Par exemple.

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

Alors supprimez les espaces:

name="Stack Overflow" 

et ça marchera bien.

0
Ravi Solanki

Je sais que cela a été répondu avec une réponse de très haute qualité. Mais, en bref, vous ne pouvez pas avoir d'espaces.

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

N'a pas fonctionné à cause des espaces autour du signe égal. Si tu devais courir ...

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

Ça marcherait

0
Derek Haber