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' ...

7 réponses

1 2
Avatar
ericb
Bonjour,

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


amha, ce commentaire n'apporte pas d'information.


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



Très bonne idée en effet. Mais quand on explique ça à quelqu'un qui dit
ne pas connaître grand chose, alors on explique comment ça fonctionne.
En disant, par exemple, que $? contient le dernier code retourné.

Dans ce cas

1) l'utilisation de $? est moins lisible que $RETVAL, car la variable
testée est identifiable directement, sans avoir à se taper le contenu du
script qui nous retourne RETVAL.

2) Cela ne marche pas si on veut récupérer une chaine de caractères

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


Le but est juste d'utiliser un script déjà écrit, pas de le réécrire.


Cordialement

--
eric bachard


Avatar
Fauberteau Frédéric
valeur00

echo $valeur

echo ${#valeur}

valeur0

echo ${#valeur}
j'avoue que ça permet de comprendre pas mal de chose, ces commandes ...

Merci pour toutes ces explications, je ne verrais plus bash de la même
manière ;-)

Avatar
Schott
On Sat, 08 May 2004 18:11:14 +0200, ericb wrote:


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



Ouhlaaaa....


amha, ce commentaire n'apporte pas d'information.


Certes. Mais ces 2 lignes ne peuvent fonctionner, en particulier le test
sur du rien [ -eq 0 ].

Très bonne idée en effet. Mais quand on explique ça à quelqu'un qui
dit ne pas connaître grand chose, alors on explique comment ça
fonctionne. En disant, par exemple, que $? contient le dernier code
retourné.


man bash et même man sh


Dans ce cas

1) l'utilisation de $? est moins lisible que $RETVAL, car la variable
testée est identifiable directement, sans avoir à se taper le contenu
du script qui nous retourne RETVAL.


Sauf qu'avec la syntaxe utilisée (RETVAL=?), $RETVAL contient la chaîne
de caractère "?", pas le code de retour du script /etc/firewall.sh alors
que c'est manifestement le but recherché.

2) Cela ne marche pas si on veut récupérer une chaine de caractères


Si on passe une chaîne de caractère à test pour la comparer à un
entier (-eq 0 dans le cas qui nous intéresse), ça ne marchera pas.


Le but est juste d'utiliser un script déjà écrit, pas de le
réécrire.


Ben si, puisque la question initiale est de savoir pourquoi le script ne
marche pas. Et donc ma proposition script && pose du flag me parait
intéressante car 1/ elle marche, 2/ elle est élégante et que c'est une
bonne habitude à prendre.


Tshaw
Schott
FLLC canal hystérique



Avatar
Schott
On Sat, 08 May 2004 20:18:18 +0000, Fauberteau Frédéric wrote:

Merci pour toutes ces explications, je ne verrais plus bash de la même
manière ;-)


Je me permets de te suggérer man bash. Tu auras une foultitude d'infos
aussi intéressantes.

Tshaw
Schott
FLLC Canal hystérique

Avatar
ericb
On Sat, 08 May 2004 18:11:14 +0200, ericb wrote:


Certes. Mais ces 2 lignes ne peuvent fonctionner, en particulier le test
sur du rien [ -eq 0 ].



Oui, tout le monde l'a vu.

man bash et même man sh


Je n'ai jamais trouvé cette réponse "man truc" constructive, mais ce
n'est que mon humble avis et je vais tenter d'illustrer :

si on cherche une occurrence, dans la page de man de bash, on fait :
/occurence +<ENTRÉE>
Et la première trouvée apparait surlignée.. n pour "next" c'est à dire
l'occurence suivante. Refaire "/" permet d'en chercher une autre, ou
flèche haut/bas permet de retrouver l'historique des occurences cherchées.


1) l'utilisation de $? est moins lisible que $RETVAL, car la variable
testée est identifiable directement, sans avoir à se taper le contenu
du script qui nous retourne RETVAL.


Sauf qu'avec la syntaxe utilisée (RETVAL=?), $RETVAL contient la chaîne
de caractère "?", pas le code de retour du script /etc/firewall.sh alors
que c'est manifestement le but recherché.


Nous sommes d'accord là-dessus. Après refléxion, je pense que RETVAL=$?
est la solution à ce problème.


2) Cela ne marche pas si on veut récupérer une chaine de caractères


Si on passe une chaîne de caractère à test pour la comparer à un
entier (-eq 0 dans le cas qui nous intéresse), ça ne marchera pas.


Oui, tout à fait -eq ne peut pas attendre une chaine de caractère.

Et donc ma proposition script && pose du flag me parait
intéressante car 1/ elle marche,


Oui elle marche...et [ $RETVAL -eq 0 ] aussi :-)

2/ elle est élégante et que c'est une
bonne habitude à prendre.


Je ne suis pas tout à fait d'accord. À parler de bonne habitude, je
préfère raisonner en termes de modularité (qui sous entend lisibilité,
maintenabilité, portabilité, extensibilité et réutilisabilité).
Ici un shell script appelle un autre shell script, et malgré la
simplicité de l'exemple qui pourra sembler inadaptée à certains, sur le
fond, je pense que l'utilisation de [ $RETVAL -eq 0 ] est préférable à
[ $? -eq 0 ]

Bien sur, cela peut se discuter :-)



Cordialement

--
revp onpuneq


Avatar
Schott
On Sun, 09 May 2004 00:26:24 +0200, ericb wrote:


Je n'ai jamais trouvé cette réponse "man truc" constructive, mais ce
n'est que mon humble avis et je vais tenter d'illustrer :


Et pourtant... quoi de mieux que de lire la doc?

Je ne suis pas tout à fait d'accord. À parler de bonne habitude, je
préfère raisonner en termes de modularité (qui sous entend lisibilité,
maintenabilité, portabilité, extensibilité et réutilisabilité).


Ben justement. commande1 && commande2 && commande3 améliore à mon sens
la lisibilité dans le sens où cela permet de regrouper sur une même
ligne une séquences de commandes formant un ensemble logique, une action
complète. C'est de plus une syntaxe des plus courantes en shell.


fond, je pense que l'utilisation de [ $RETVAL -eq 0 ] est préférable à
[ $? -eq 0 ]


Je ne suis pas d'accord. D'une part parce que $? n'est pas du tout
équivoque, c'est le code de retour de la dernière commande exécutée,
d'autre part parce que passe par des variables intermédiaires c'est
utiliser plus de mémoire, consommer plus de ressources d'une manière
générale. Et c'est une très mauvaise habitude de ne pas économiser ses
ressources.

Tshaw
Schott
Front de Libération de la Ligne de Commande, canal hystérique

Avatar
Bernard Déléchamp

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


On peut aussi préférer, pour cause de lisibilité peut-être plus évidente
et intituive, l'équivalent avec if :

if /etc/firewall.sh ; then
touch ...
autre action...
fi

et, pour inverser le test :

if ! /etc/firewall.sh ; then


--
Le directeur est rentré chez lui, l'école verrouillée.

1 2