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.
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 ?).
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 ?).
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 ?).
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
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»
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
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, ..."
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, ..."
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, ..."
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
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.
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
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
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.
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
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
Stephane Chazelas <cette.adresse@est.invalid> wrote in message news:<slrncgi13u.r8.stephane.chazelas@spam.is.invalid>...
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.
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.