Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 :

terminal a écrit :

./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 smile.

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 ? neutral 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.

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 ?

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 :

terminal a écrit :

./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 :

terminal a écrit :

./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 smile


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}]

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.

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 ?

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 smile

Dernière modification par tiramiseb (Le 19/08/2015, à 17:56)

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