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

[sh, plutôt bash 2.05b] : Pb expression conditionnelle

7 réponses
Avatar
rtroadec
Bonjour,

Je reste stanké sur un problème d'expression conditionnelle. J'ai
écrit un petit script qui me permet de lancer ou non une commande
suivant si le 1er argument est l'adresse IP d'une interface ou le nom
de la station. Si le premier argument est l'adresse IP d'une interface
réseau de la station ou le nom de la station, alors je n'exécute pas
la commande et j'affiche un message d'erreur, sinon je lance la
commande avec le 1er argument.

Il semble qu'à la ligne 22, mon test ne se passe pas correctement,
j'ai 0 au lieu de 1 dans RES quand je lance mon script avec comme
paramètre le nom de ma station ou L'IP d'une interface locale.

Voici le script :

1 #! /bin/sh
2
3 # Script shell pour prévenir le lancement de VNC viewer avec
4 # pour paramètre le nom de sa propre machine
5
6 #=================================================
7 # Recup. adresses IP des interfaces de la station
8 #=================================================
9 IP_ADDRS=`/sbin/ifconfig | grep inet | awk '{ print $2 }' | sed
's/addr://'`
10
11 #=================================================
12 # Met la variable RES à 0 ou 1 selo le 1er arg
13 # RES=1 si le 1er arg correspond à une @IP d'une
14 # interface locale ou au nom de la station
15 # RES=0 sinon
16 #=================================================
17 if [ $# -gt 0 ]; then
18 for entry in $IP_ADDRS; do
19 echo "Hostname : "$HOSTNAME
20 echo "Current entry : "$entry
21 echo "Arg to test : "$1
22 if [ \($entry = $1\) -o \($HOSTNAME = $1\) ]; then
23 RES=1
24 else
25 RES=0
26 fi
27 echo "Result : "$RES
28 printf '\n'
29 done
30 else
31 printf '%s\n' "Error : I need at least one argument"
32 fi
33
34 #===============================================
35 # Action à faire selon $RES
36 # $RES égal à 1 : Affichage msg erreur
37 # $RES ègal à 0 : OK, on lance vncviewer
38 #===============================================
39 if [ $RES -eq 1 ]; then
40 printf '%s\n' "Can't launch VNCviewer"
41 printf '%s\n' "You specified your host name (or its IP
address) as argument"
42 elif [ $RES -eq 0 ]; then
43 /usr/bin/vncviewer $1 &
44 fi
45

Qu'ai-je fais de mal pour que le test ligne 22 ne marche pas ?
Merci de votre aide.

Regis

7 réponses

Avatar
Stephane Chazelas
2004-07-29, 05:58(-07), Targeur fou:
[...]
22 if [ ($entry = $1) -o ($HOSTNAME = $1) ]; then
[...]


if [ "x$entry" = "x$1" ] || [ "x$HOSTNAME" = "x$1" ]; then
if [ "x$entry" = "x$1" -o "x$HOSTNAME" = "x$1" ]; then
if [ ( "x$entry" = "x$1" ) -o ( "x$HOSTNAME" = "x$1" ) ]; then

--
Stephane

Avatar
Stephane Chazelas
2004-07-29, 05:58(-07), Targeur fou:
[...]
9 IP_ADDRS=`/sbin/ifconfig | grep inet | awk '{ print $2 }' | sed
's/addr://'`
[...]


awk peut faire tout ce que que grep ou sed peuvent faire. Donc,
un grep ou un sed dans un pipeline ou il y a deja awk est en
general inutil (quelqu'un connait-il un moyen memotechnique pour
savoir s'il faut un e ou pas a la fin de util ou facil ?).

IP_ADDRS=`/sbin/ifconfig | awk '/inet/ {print substr($2, 6)}'`

--
Stephane

Avatar
Sebastien Kirche
On 29 Jul 2004, Stephane Chazelas wrote:

awk peut faire tout ce que que grep ou sed peuvent faire. Donc,
un grep ou un sed dans un pipeline ou il y a deja awk est en
general inutil (quelqu'un connait-il un moyen memotechnique pour
savoir s'il faut un e ou pas a la fin de util ou facil ?).


Oui : *toujours* un 'e'. Il n'y a pas de «facil» ou «util»

Sébastien Kirche

Avatar
Remi Moyen
On Thu, 29 Jul 2004, Stephane Chazelas wrote:

inutil (quelqu'un connait-il un moyen memotechnique pour
savoir s'il faut un e ou pas a la fin de util ou facil ?).


Simple. En français, il en faut toujours un.
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."

Avatar
Stephane Chazelas
2004-07-29, 05:58(-07), Targeur fou:
Je reste stanké sur un problème d'expression conditionnelle. J'ai
écrit un petit script qui me permet de lancer ou non une commande
suivant si le 1er argument est l'adresse IP d'une interface ou le nom
de la station. Si le premier argument est l'adresse IP d'une interface
réseau de la station ou le nom de la station, alors je n'exécute pas
la commande et j'affiche un message d'erreur, sinon je lance la
commande avec le 1er argument.
[...]


Note que 127.0.0.1 s'ecrit aussi 127.1 ou 127.0.0x001 ou
2130706433, voire meme des fois 127...1

La facon la plus naturelle de l'ecrire etant 127.1 puisque c'est
un reseau de classe A.

--
Stephane

Avatar
Stephane Chazelas
2004-07-29, 05:58(-07), Targeur fou:
[...]
17 if [ $# -gt 0 ]; then
[...]


Petite regle a connaitre, faut prendre l'habiture de mettre des
quotes autour des variables:

if [ "$#" -gt 0 ]; then

Parce que $# sans quotes, ca serait un peu l'equivalent en perl
de map(glob, split($IFS_regexp, $#)) au lieu de $#. C'est a dire
que le shell fait du word splitting et du globbing dessus et
transforme une variable vide (ou pleine de blanks) en pas
d'argument du tout.

Ici, ca ne posera pas de probleme a moins qu'IFS ne contienne
des blancs.

18 for entry in $IP_ADDRS; do


Quand on a besoin de ne pas mettre de quotes (comme ici pour
beneficier du word splitting), il est bon de desactiver les
autres mechanismes induits par l'absence de quotes. Ici "set -f"
pour desactiver le globbing (encore que dans ce cas precis,
IP_ADDRS ne devrait pas contenir de characters comme "*" ou "?"
ou "[").

Dans la plupart des cas, mettre "set -f" au debut du script ne
mange pas de pain (remettre "set +f" ponctuellement pour le cas
peu probable ou on voudrait utiliser le globbing).

19 echo "Hostname : "$HOSTNAME


echo est inadapté pour afficher des chaines arbitraires, parce
qu'il fait des transformations. Donc, quand il y a un "$var"
dans les arguments d'echo, c'est sujet a probleme. C'est pour ca
qu'on recommande de ne plus utiliser echo mais printf a la place
(ou print en ksh ou zsh).

printf 'Hostname: %sn' "$HOSTNAME"


31 printf '%sn' "Error : I need at least one argument"


Les messages d'erreurs, on les ecrit generalement sur la sortie
d'erreur, pas sur la sortie standard.

printf >&2 '%sn' "Error : I need at least one argument"

En anglais, il n'y a pas d'espace avant les signes de
ponctuation.

Ici, on pouvait a la limite utiliser "echo" parce qu'on connait
a l'avance les arguments qu'il recoit et on sait qu'ils ne
seront pas transformes par echo.

--
Stephane

Avatar
rtroadec
Stephane Chazelas wrote in message news:...

Bonjour,

Un grand merci pour tes corrections et conseils avisés. J'ai changé
mon script en conséquence et ça marche très bien. Je vais désormais
essayer de prendre les bonnes habitudes quand il m'arrivera de
programmer en shell, surtout au niveau du quoting.

Salutations

Regis