Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

syntaxe de bash

17 réponses
Avatar
Fauberteau Frédéric
Bonjour,
sur une Mandrake 9.2, j'ai un bash 2.05b.
j'ai voulu lancer un script (que j'ai trouvé sur léa-linux) au démarrage
pour charger les iptables, mais il y a une erreur :
./iptables: line 15: [: -eq: unary operator expected

qui se produit sur cette partie :
echo -n "Application des règles IpTables: "
/etc/firewall.sh
RETVAL=?
[ -eq 0 ] && touch /var/lock/subsys/firewall
echo

Pourriez-vous me dire ce qui cloche, je n'ai pas trouvé dans 'man bash' ...

10 réponses

1 2
Avatar
JKB
Le 06-05-2004, à propos de
syntaxe de bash,
Fauberteau Frédéric écrivait dans fr.comp.os.linux.configuration :
Bonjour,
sur une Mandrake 9.2, j'ai un bash 2.05b.
j'ai voulu lancer un script (que j'ai trouvé sur léa-linux) au démarrage
pour charger les iptables, mais il y a une erreur :
./iptables: line 15: [: -eq: unary operator expected

qui se produit sur cette partie :
echo -n "Application des règles IpTables: "
/etc/firewall.sh
RETVAL=?
[ -eq 0 ] && touch /var/lock/subsys/firewall
echo

Pourriez-vous me dire ce qui cloche, je n'ai pas trouvé dans 'man bash' ...



[ -eq 0 ] && touch /var/lock/subsys/firewall
Le test compare 0 à rien... D'où une certaine perplexité de test
(l'opérateur [ ).

JKB

Avatar
eric_alube
Bonjour,

Bonjour,
sur une Mandrake 9.2, j'ai un bash 2.05b.
j'ai voulu lancer un script (que j'ai trouvé sur léa-linux) au démarrage
pour charger les iptables, mais il y a une erreur :
./iptables: line 15: [: -eq: unary operator expected


Oui, il y a bien une erreur : tu fais un test sur rien :-)


qui se produit sur cette partie :
echo -n "Application des règles IpTables: "
/etc/firewall.sh
RETVAL=?


amha, le test ci -dessous n'est pas bon :

[ -eq 0 ] && touch /var/lock/subsys/firewall


peut-être que :

[ $RETVAL -eq 0 ] && touch /var/lock/subsys/firewall

résoudra ton problème, car il semble que c'est RETVAL qui conditionne la
création de /var/lock/subsys/firewall

En fait, on ne peut pas te répondre comme ça , parce qu'il faut tout ce
qu'il y a avant pour te répondre correctement

echo

Pourriez-vous me dire ce qui cloche, je n'ai pas trouvé dans 'man bash' ...



Pourrais tu s'il te plait nous faire plutôt un :

cat -n ./iptables | head -15

(c'est bien iptables le nom du shell script ? )

...histoire qu'on puisse y voir plus clair ?


Cordialement

--
revp onpuneq

Avatar
eric_alube
J'ai peut-être écrit une bêtise :

[ $RETVAL -eq 0 ] && touch /var/lock/subsys/firewall


Je pense que c'est plutôt :

[ ${#RETVAL} -eq 0 ] && touch /var/lock/subsys/firewall

Si on veut tester la longueur de $RETVAL (pourquoi on ne teste pas avec
-z alors ?)

Mais sans + avoir d'infos, c'est difficile...

Avatar
Fauberteau Frédéric
voilà le résultat de cat -n ./iptables | head -15 :

#!/bin/bash
#
# Script de lancement des iptables

. /etc/init.d/functions

RETVAL=O
# Démarrage du firewall
start ()
{
echo -n "Application des règles IpTables: "
/etc/firewall.sh
RETVAL=?
[ -eq 0 ] && touch /var/lock/subsys/firewall

Je pense que c'est bien RETVAL qu'il faut tester, mais je n'ai jamais
écrit de script bash ... Je l'ai juste recopier, et je voulais essayer
de comprendre.
Merci pour votre aide ;-)
Avatar
eric_alube
voilà le résultat de cat -n ./iptables | head -15 :

#!/bin/bash
#
# Script de lancement des iptables

. /etc/init.d/functions

RETVAL=O
# Démarrage du firewall
start ()
{
echo -n "Application des règles IpTables: "
/etc/firewall.sh
RETVAL=?
[ -eq 0 ] && touch /var/lock/subsys/firewall

Je pense que c'est bien RETVAL qu'il faut tester, mais je n'ai jamais
écrit de script bash ... Je l'ai juste recopier, et je voulais essayer
de comprendre.


Je l'ai trouvé, ton script :-) mais quand je fais un cat -n, moi j'ai ça :

1 #!/bin/bash
2 #
3 # Lancement du script de Firewall
4 # Arnaud de Bermingham
5
6 . /etc/init.d/functions
7
8 RETVAL=0
9
10 # Fonction pour le lancement du firewall
11 start() {
12 echo -n "Application des règles IpTables: "
13 /etc/firewall.sh
14 RETVAL=?
15 [ -eq 0 ] && touch /var/lock/subsys/firewall

[l'option -n de cat permet de numéroter les lignes]

Est-ce que tu pourrais, s'il te plaît, poster le résultat de la commande
ci dessous :

grep RETVAL /etc/firewall.sh

La solution est dedans, je pense...



Merci pour votre aide ;-)



Avatar
Schott
On Thu, 06 May 2004 18:17:30 +0200, Fauberteau Frédéric wrote:

/etc/firewall.sh
RETVAL=?
[ -eq 0 ] && touch /var/lock/subsys/firewall


Ouhlaaaa....

Si RETVAL est censé stocker le code de retour du script /etc/firewall.sh,
la ligne est RETVAL=$? et la suivante qui la teste doit être
[ $RETVAL -eq 0 ] ...

Mais dans ce cas, pourquoi se casser la tête, autant tester directement:
/etc/firewall.sh
[ $? -eq 0 ] && touch ...

et encore mieux, le tout sur une seule ligne:
/etc/firewall.sh && touch ...


man test


Tshaw
Schott
FLLC canal hystérique

Avatar
Fauberteau Frédéric
On Thu, 06 May 2004 18:17:30 +0200, Fauberteau Frédéric wrote:


/etc/firewall.sh
RETVAL=?
[ -eq 0 ] && touch /var/lock/subsys/firewall



Ouhlaaaa....

Si RETVAL est censé stocker le code de retour du script /etc/firewall.sh,
la ligne est RETVAL=$? et la suivante qui la teste doit être
[ $RETVAL -eq 0 ] ...

Mais dans ce cas, pourquoi se casser la tête, autant tester directement:
/etc/firewall.sh
[ $? -eq 0 ] && touch ...

et encore mieux, le tout sur une seule ligne:
/etc/firewall.sh && touch ...


man test


Tshaw
Schott
FLLC canal hystérique
déjà, je comprends pas bien à quoi servent tous ces tests ;-)



Avatar
Fauberteau Frédéric

Est-ce que tu pourrais, s'il te plaît, poster le résultat de la commande
ci dessous :

grep RETVAL /etc/firewall.sh

La solution est dedans, je pense...
Alors, si je fais grep RETVAL /etc/firewall.sh, j'ai rien ;-)

par contre pour grep RETVAL /etc/rc.d/init.d/iptables, j'obtiens ça :
RETVAL=O
RETVAL=?
[ ${#RETVAL} -eq 0 ] && touch /var/lock/subsys/firewall
RETVAL=?
[ ${#RETVAL} -eq 0 ] && rm -f /var/lock/subsys/firewall
RETVAL=?
RETVAL=1

Avatar
Schott
On Fri, 07 May 2004 21:04:56 +0200, Fauberteau Frédéric wrote:


/etc/firewall.sh && touch ...


déjà, je comprends pas bien à quoi servent tous ces tests ;-)


A poser un fichier flag si le script n'a pas planté


Avatar
ericb
Bonjour,



Alors, si je fais grep RETVAL /etc/firewall.sh, j'ai rien ;-)


Ooops...

par contre pour grep RETVAL /etc/rc.d/init.d/iptables, j'obtiens ça :
RETVAL=O


On initialise RETVAL à 0

un echo $RETVAL donnerait 0

Attention, les lignes semblent se suivre, mais cela n'est pas sûr du tout...

RETVAL=?


Ici, RETVAL prend la valeur du dernier code retourné en sortie d'un
shell ou d'une fonction, grâce au symbole "?".

[ ${#RETVAL} -eq 0 ] && touch /var/lock/subsys/firewall


Ici on teste si la longueur** de RETVAL est nulle

Si c'est le cas, le test est réussi et cela signifie que le fichier
/var/lock/subsys/firewall n'existe pas, alors on le crée avec
"touch /var/lock/subsys/firewall".

Sinon, si la longueur de RETVAL n'est pas nulle, le test a échoué, et on
n'exécute pas la création de /var/lock/subsys/firewall

Le rôle de ce fichier "/var/lock/subsys/firewall" est de signaler à
toute application qui vient vérifier son existence, que le firewall est
activé, sinon existe.

Les autres tests, ont un rôle analogue, mais il faudrait préciser mieux
le contexte.


Voila, très rapidement, ce que signifiaient ces test :-)

Pour d'autres questions sur le shell bash (par exemple, mais pas
seulement), il y a la page de man, bien sûr, mais il y a aussi le forum
fr.comp.os.unix sur lequel tu trouveras tout plein d'infos.


Cordialement,

eric bachard



**pour t'amuser , tu peux essayer les commandes suivantes en les
retapant successivement (et en appuyant sur entrée, bien sûr...)

valeur00

echo $valeur

echo ${#valeur}

valeur0

echo ${#valeur}





--

1 2