#1 Le 04/10/2013, à 20:11
- nolem
Apprentissage - Pourquoi ce script bash ne fonctionne pas ?
Bonjour,
Je m'intéresse depuis peu au bash. Donc j'apprends le langage. Je sais à peine faire un hello world et faire des calcul. Donc vous comprenez que je commence à peine. Ma question est simple : Pourquoi cette structure de contrôle ne fonctionne pas ? Pourquoi ma syntaxe est fausse ?
#!/bin/bash
a="ok"
if[ $a="ok" ]
then
echo "oko"
else
echo "koo"
fi
message erreur :
./test.sh: ligne 5: if[ ok=ok ] : commande introuvable
./test.sh: ligne 6: Erreur de syntaxe près du symbole inattendu « then »
./test.sh: ligne 6: `then'
Merci d'apporter vos lumières sur le sujet .
Bon dev
Pourquoi choisir Linux ? - conférence Richard Stallman
---------------------------------------------
ASUS X73S/K73SV - Ubuntu 12.04 (Gnome Shell) - OpenSuse 13.1 (Gnome Shell)
ASUS X101CH - Ubuntu Mate 14.04
Hors ligne
#2 Le 04/10/2013, à 20:15
- pingouinux
Re : Apprentissage - Pourquoi ce script bash ne fonctionne pas ?
Bonsoir,
L'espace sert de séparateur, et est obligatoire dans cette commande :
if [ "$a" = "ok" ]
Hors ligne
#3 Le 05/10/2013, à 14:23
- compte supprimé
Re : Apprentissage - Pourquoi ce script bash ne fonctionne pas ?
Le '=' en bash n'est pas une affectation ? Faudrait le remplacer par '==' pour que le script fasse ce à quoi tu t'attends !
#4 Le 05/10/2013, à 14:35
- bruno
Re : Apprentissage - Pourquoi ce script bash ne fonctionne pas ?
En bash on peut utiliser un simple = pour comparer des chaînes de caractères.
http://abs.traduc.org/abs-fr/ch07s03.html
#5 Le 05/10/2013, à 20:59
- tiramiseb
Re : Apprentissage - Pourquoi ce script bash ne fonctionne pas ?
Le "=", dans ce cas, est un argument de la commande "[" (ou "test")...
C'est d'ailleurs pour ça qu'il faut des espaces : car ce sont des arguments d'une commande.
On n'est pas dans le même cas qu'un langage classique où l'attribution et le test utilisent des opérateurs différents.
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#6 Le 07/10/2013, à 15:36
- nolem
Re : Apprentissage - Pourquoi ce script bash ne fonctionne pas ?
Salut,
En faisant la modif :
if [ "$a" = "ok" ]
ça ne fonctionne pas. J'ai toujours le même message d'erreur.
J'ai du mal avec cette syntaxe.
@Sga64 : J'ai essayé aussi. J'ai eu la même réflexion que toi (je suis dév. en JS et en PHP).
Pourquoi choisir Linux ? - conférence Richard Stallman
---------------------------------------------
ASUS X73S/K73SV - Ubuntu 12.04 (Gnome Shell) - OpenSuse 13.1 (Gnome Shell)
ASUS X101CH - Ubuntu Mate 14.04
Hors ligne
#7 Le 07/10/2013, à 15:49
- tiramiseb
Re : Apprentissage - Pourquoi ce script bash ne fonctionne pas ?
Es-tu sûr d'utiliser la bonne espace (pas d'espace insécable, etc) ?
L'erreur est-elle vraiment EXACTEMENT la même, à l'espace près ?
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#8 Le 07/10/2013, à 17:45
- PDemong
Re : Apprentissage - Pourquoi ce script bash ne fonctionne pas ?
Je plussois tiramiseb, c'est bizarre que tu aies encore un problème en rajoutant les espaces dans ta condition "if"...
Pour info, quand tu fais un test d'une condition en utilisant des crochets, tu utilises en fait la commande unix "test". Donc pour en avoir la syntaxe, tu fais simplement la commande "man test", et tu y liras qu'effectivement, pour comparer 2 strings, on utilise un seul "=".
Hors ligne
#9 Le 09/10/2013, à 10:08
- nolem
Re : Apprentissage - Pourquoi ce script bash ne fonctionne pas ?
Salut,
J'ai pas eu trop le temps de me plonger dans l'étude de Bash ces deux derniers jours. Cependant, ce problème est persistent. Je comprends pas pourquoi cette structure de contrôle ne fonctionne pas. Je fais des espaces simples. J'ai essayé ce script sur plusieurs distro (dans une vm). Le même message d'erreur revient :
#!/bin/bash
a="ok"
b="ok"
if[ "$a"="$b" ]
then
echo "oko"
else
echo "koo"
fi
ou
#!/bin/bash
a="ok"
b="ok"
if[ "$a"="$b" ];then
echo "oko"
else
echo "koo"
fi
ou
#!/bin/bash
a="ok"
b="ok"
if[ ${a}=${b} ];then
echo "oko"
else
echo "koo"
fi
message erreur :
./test.sh: line 6: if[ ok=ok ]: command not found
./test.sh: line 7: syntax error near unexpected token `then'
./test.sh: line 7: `then'
Si j'enlève le "then", j'ai ce message d'erreur :
./test.sh: line 6: if[ ok=ok ]: command not found
oko
./test.sh: line 8: syntax error near unexpected token `else'
./test.sh: line 8: `else'
Est ce que quelqu'un peut essayer le script et me dire si ça fonctionne chez lui ? Normalement, ça ne devrait pas fonctionner puisque j'ai essayé ce code sur plusieurs environnements.
Merci de m'aiguiller et bon dev
Pourquoi choisir Linux ? - conférence Richard Stallman
---------------------------------------------
ASUS X73S/K73SV - Ubuntu 12.04 (Gnome Shell) - OpenSuse 13.1 (Gnome Shell)
ASUS X101CH - Ubuntu Mate 14.04
Hors ligne
#10 Le 09/10/2013, à 10:18
- tiramiseb
Re : Apprentissage - Pourquoi ce script bash ne fonctionne pas ?
Je comprends pas pourquoi cette structure de contrôle ne fonctionne pas
pingouinux te l'a expliqué dans le message #2 : LES ESPACES NE SONT PAS OPTIONNELS.
===> if{espace}[{espace}"$a"{espace}={espace}"$b"{espace}]
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#11 Le 09/10/2013, à 10:19
- tiramiseb
Re : Apprentissage - Pourquoi ce script bash ne fonctionne pas ?
Par ailleurs, c'est bizarre que dans le message d'erreur il inclut l'espace pour le nom de la commande, je me demande si c'est bien une espace simple que tu as mis et non, par exemple, une espace insécable : cette dernière n'est pas traitée comme un espace par le shell.
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#12 Le 09/10/2013, à 10:21
- tiramiseb
Re : Apprentissage - Pourquoi ce script bash ne fonctionne pas ?
Et en #7, je t'ai demandé si avec :
if [ "$a" = "ok" ]
... l'erreur est exactement la même qu'avant, au caractère (espace compris) près.
Tu n'y as pas répondu.
Comment veux-tu qu'on t'aide si tu ne réponds pas à nos questions et si tu ne lis pas nos réponses ?
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#13 Le 19/08/2015, à 13:19
- cpt_aimless
Re : Apprentissage - Pourquoi ce script bash ne fonctionne pas ?
Bonjour,
Je tombe par hasard sur ce post et pour aiguiller sur ce genre de problème qui peut-être récurrent.
La source du soucis peut provenir tout implement de l'encodage du fichier bash : préféré un fichier encodé iso-8859-15 plutot qu'UTF8.
Exemple (Créer un fichier UTF8 build2.sh puis ecrire le script suivant et l'enregistrer ) :
subp=all
if [ "${subp}" == "buildroot" ] || [ "${subp}" == "all" ]
then
echo "test ok"
fi
Le retour dans le shell sera :
./build2.sh: ligne 2 : [: « ] » manquant
./build2.sh: ligne 2: [ : commande introuvable
Si vous modifiez le format d'encodage de ce même ficheir en iso-8859-15, l'erreur sera alors :
./build2.sh: ligne 2 : [: « ] » manquant
./build2.sh: ligne 2: $'\240[' : commande introuvable
Pour le coup, on constate le problème d'encodage ou d'interprétation du source bash, remplacez le $\240 par un espace, et hop ça tourne !
@+
Hors ligne
#14 Le 19/08/2015, à 17:55
- tiramiseb
Re : Apprentissage - Pourquoi ce script bash ne fonctionne pas ?
cpt_aimless: dans ton cas, il est extrêmement probable qu'au lieu de taper :
« espace puis Alt Gr - 5 » pour faire " ["...
tu as tapé :
« Alt Gr - espace puis 5 »
(autrement dit, tu as appuyé un peu trop vite sur le Alt Gr).
Alt Gr - espace, c'est pour l'espace insécable (code ASCII 240 en octal, d'où le "\240").
Le changement d'encodage permet d'afficher le code ASCII sous forme octale :
./build2.sh: ligne 2: $'\240[' : commande introuvable
... mais dans la première occurrence de l'erreur, la chose était déjà visible :
./build2.sh: ligne 2: [ : commande introuvable
... on voit bien deux espaces entre "ligne 2:" et "[" : l'espace de présentation du message d'erreur, et l'espace insécable que tu as tapée avant le "[".
Bash n'a aucun souci avec UTF-8.
Ce n'est pas un problème d'encodage, c'est une faute de frappe
Dernière modification par tiramiseb (Le 19/08/2015, à 17:56)
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#15 Le 19/08/2015, à 23:47
- MicP
Re : Apprentissage - Pourquoi ce script bash ne fonctionne pas ?
Avec l'encodage ISO8859-15, l'espace insécable utilise un seul octet,
mais en UTF-8, l'espace insécable utilise deux octets, ce qui donne : Octal 302 240 ou hexa c2 a0
Quoi qu'il en soit, tant que l'espace séparateur n'est pas un vrai espace (hexa 20), la ligne de commande ne pourra pas être interprétée.
=======
Avec un espace insécable (hexa c2 a0) avant le premier "[" :
michel@debG53SW:~$ echo 'if [ "${subp}" == "buildroot" ] || [ "${subp}" == "all" ]' | hexdump -C
00000000 69 66 c2 a0 5b 20 22 24 7b 73 75 62 70 7d 22 20 |if..[ "${subp}" |
00000010 3d 3d 20 22 62 75 69 6c 64 72 6f 6f 74 22 20 5d |== "buildroot" ]|
00000020 20 7c 7c 20 5b 20 22 24 7b 73 75 62 70 7d 22 20 | || [ "${subp}" |
00000030 3d 3d 20 22 61 6c 6c 22 20 5d 0a |== "all" ].|
0000003b
michel@debG53SW:~$
=======
Avec un espace (hexa 20) avant le premier "["
michel@debG53SW:~$ echo 'if [ "${subp}" == "buildroot" ] || [ "${subp}" == "all" ]' | hexdump -C
00000000 69 66 20 5b 20 22 24 7b 73 75 62 70 7d 22 20 3d |if [ "${subp}" =|
00000010 3d 20 22 62 75 69 6c 64 72 6f 6f 74 22 20 5d 20 |= "buildroot" ] |
00000020 7c 7c 20 5b 20 22 24 7b 73 75 62 70 7d 22 20 3d ||| [ "${subp}" =|
00000030 3d 20 22 61 6c 6c 22 20 5d 0a |= "all" ].|
0000003a
Donc, avec un simple espace :
michel@debG53SW:~$ cat aef
subp=all
if [ "${subp}" == "buildroot" ] || [ "${subp}" == "all" ]
then
echo "test ok"
fi
michel@debG53SW:~$ . ./aef
test ok
michel@debG53SW:~$
Dernière modification par MicP (Le 19/08/2015, à 23:48)
Hors ligne