J'ai ce script appelé 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 des tutoriels de script bash extrêmement basiques / débutants en ligne et voici comment 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
.
#!/usr/bin/env bash
au lieu de mettre directement à#!/bin/bash
moins que vous ne soyez absolument sûr de votrebash
présence à/bin
cause de cette réponse: stackoverflow.com/a/21613044/3589567Réponses:
Vous ne pouvez pas avoir d'espaces autour de votre signe «=».
Lorsque vous écrivez:
bash essaie d'exécuter une commande nommée STR avec 2 arguments (les chaînes '=' et 'foo')
Lorsque vous écrivez:
bash essaie d'exécuter une commande nommée STR avec 1 argument (la chaîne '= foo')
Lorsque vous écrivez:
bash essaie d'exécuter la commande foo avec STR défini sur la chaîne vide dans son environnement.
Je ne sais pas si cela aide à clarifier ou s'il s'agit d'une simple obfuscation, mais notez que:
STR "=" "foo"
,STR "=foo"
,STR="" foo
.La section pertinente de la spécification de langage sh, la section 2.9.1 indique:
Dans ce contexte, a
word
est la commande que bash va exécuter. Toute chaîne contenant=
(dans une position autre 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=
est une commande. DansSTR = "foo"
,STR
n'est pas une affectation de variable.la source
FOO-BAR=qux
n'est donc pas une affectation de variable car ceFOO-BAR
n'est pas un nom valide.Déposez les espaces autour du
=
panneau:la source
set foo = bar
une erreur courante dans les fichiers batch de Windows - et là, le langage batch est ridiculisé pour cela ;-)En mode interactif, tout va bien:
Évidemment (!) Comme l'a dit Johannes, pas d'espace autour
=
. Dans le cas où il y a de l'espace=
dans le mode interactif, cela donne des erreurs commela source
STR = "Hello World"
, donc cette réponse ne s'applique pas ici.$
marqueJe sais que cela a été répondu par une réponse de très haute qualité. Mais, en bref, vous ne pouvez pas avoir d'espace.
N'a pas fonctionné à cause des espaces autour du signe égal. Si vous deviez courir ...
Ça marcherait
la source
Lorsque vous définissez une variable, vous n'avez pas besoin de mettre d'espace supplémentaire.
Par exemple
Supprimez donc les espaces:
et cela fonctionnera bien.
la source