OVH Cloud OVH Cloud

script bash : tester le contenu d'un fichier

10 réponses
Avatar
n
Bonjour =E0 tous !
J'ai fais un ptit script de sauvegarde que je veux executer sur mes 3
machines.
Je souhaite donc qu'il teste sur quelle machine il est lanc=E9 pour
faire la sauvegarde en fonction.
J'ai pens=E9 =E0 faire une comparaison avec hostname, mais je d=E9bute en
script, et =E7a marche pas :

if [ hostname =3D "monpc" ];then
echo "on est sur mon pc !"
fi

je me doute bien que ce n'est pas de cette mani=E8re qu'on test le
retour d'une fonction, mais j'ai cherch=E9 rapidement sur gogeuul et
j'ai pas trouv=E9... alors je me suis dit qu'ici tout le monde savais
=E7a ;)

10 réponses

Avatar
Raphaël SEBAN
Bonjour à tous !
J'ai fais un ptit script de sauvegarde que je veux executer sur mes 3
machines.
Je souhaite donc qu'il teste sur quelle machine il est lancé pour
faire la sauvegarde en fonction.
J'ai pensé à faire une comparaison avec hostname, mais je débute en
script, et ça marche pas :

if [ hostname = "monpc" ];then
echo "on est sur mon pc !"
fi

je me doute bien que ce n'est pas de cette manière qu'on test le
retour d'une fonction, mais j'ai cherché rapidement sur gogeuul et
j'ai pas trouvé... alors je me suis dit qu'ici tout le monde savais
ça ;)



Bonjour,

Voici vite fait une correction de ton script ci-dessus :

#! /bin/bash

if [ "$HOSTNAME" = 'localhost' ] ; then
echo "C'est mon PC !"
fi

en script shell il faut toujours respecter les espaces blancs
car il sont essentiels pour l'interpréteur, notamment dans
la clause if, où il faut bien espacer les [ ] de chaque côté,
ainsi que le ';' qu'il faut bien aérer du reste des mentions.

Par ailleurs, l'utilisation de la variable $HOSTNAME (attention
de respecter la casse majuscules / minuscules) implique de se
référer au nom de la machine (qui est très souvent 'localhost'
par défaut), ce qui risque de ne pas résoudre ton problème,
aussi je te conseillerai de te baser plutôt sur la variable
$HOME ou sur le binaire `whoami` pour planifier tes sauvegardes
en fonction du compte utilisateur concerné plutôt qu'en fonction
de la machine, ce qui te permettra de gérer des profils de
sauvegarde beaucoup plus précis.

Exemple :


#! /bin/bash

if [ "`whoami`" = 'moncompte' ] ; then
echo "C'est mon compte utilisateur !"
fi

D'une manière plus générale, n'oublies jamais qu'un bon 'man bash'
dans une console de terminal sera toujours ton meilleur ami ;)

@+++
--
Raphaël SEBAN.
Trucs et bidouilles :
http://lelabobidouille.free.fr/

Avatar
Nicolas George
Raphaël SEBAN wrote in message <45b9b00f$0$6720$:
référer au nom de la machine (qui est très souvent 'localhost'
par défaut)


Seulement dans les configurations grotesques.

Avatar
n
sur mes 3 machines, la commande "hostname" dans un terminal me donne le
nom de la machine, donc sur mon petit réseau, je pense que je vais
pouvoir utiliser cette méthode (parce que en plus, j'ai 2 PC qui ont
le même nom d'utilisateur, donc le "whoami" ne permetterai pas de les
differencier).

En tout cas, merci beaucoup

Fabien

On 26 jan, 08:38, Raphaël SEBAN wrote:



Bonjour à tous !
J'ai fais un ptit script de sauvegarde que je veux executer sur mes 3
machines.
Je souhaite donc qu'il teste sur quelle machine il est lancé pour
faire la sauvegarde en fonction.
J'ai pensé à faire une comparaison avec hostname, mais je débute en
script, et ça marche pas :

if [ hostname = "monpc" ];then
echo "on est sur mon pc !"
fi

je me doute bien que ce n'est pas de cette manière qu'on test le
retour d'une fonction, mais j'ai cherché rapidement sur gogeuul et
j'ai pas trouvé... alors je me suis dit qu'ici tout le monde savais
ça ;)Bonjour,


Voici vite fait une correction de ton script ci-dessus :

#! /bin/bash

if [ "$HOSTNAME" = 'localhost' ] ; then
echo "C'est mon PC !"
fi

en script shell il faut toujours respecter les espaces blancs
car il sont essentiels pour l'interpréteur, notamment dans
la clause if, où il faut bien espacer les [ ] de chaque côté,
ainsi que le ';' qu'il faut bien aérer du reste des mentions.

Par ailleurs, l'utilisation de la variable $HOSTNAME (attention
de respecter la casse majuscules / minuscules) implique de se
référer au nom de la machine (qui est très souvent 'localhost'
par défaut), ce qui risque de ne pas résoudre ton problème,
aussi je te conseillerai de te baser plutôt sur la variable
$HOME ou sur le binaire `whoami` pour planifier tes sauvegardes
en fonction du compte utilisateur concerné plutôt qu'en fonction
de la machine, ce qui te permettra de gérer des profils de
sauvegarde beaucoup plus précis.

Exemple :

#! /bin/bash

if [ "`whoami`" = 'moncompte' ] ; then
echo "C'est mon compte utilisateur !"
fi

D'une manière plus générale, n'oublies jamais qu'un bon 'man bash'
dans une console de terminal sera toujours ton meilleur ami ;)

@+++
--
Raphaël SEBAN.
Trucs et bidouilles :http://lelabobidouille.free.fr/



Avatar
lhabert
"" :

if [ hostname = "monpc" ];then
echo "on est sur mon pc !"
fi



Pour inclure dans une ligne de commande la sortie d'une commande, tu
l'inclus entre « ` ». Ici, cela donne :

if [ x"`hostname`" = xmonpc ]; then

(les x, c'est pour les cas où le hotname commencerait par un « - », ça
pourrait confuser test),

Avatar
Matthieu Moy
(Luc Habert) writes:

Pour inclure dans une ligne de commande la sortie d'une commande, tu
l'inclus entre « ` ». Ici, cela donne :

if [ x"`hostname`" = xmonpc ]; then


Perso, je préfère $(hostname) qui s'imbrique mieux, et qui est sauf
erreur de ma part la plus portable (en restant dans les bourne
shells).

--
Matthieu

Avatar
Stephane Chazelas
2007-01-26, 13:19(+01), Matthieu Moy:
(Luc Habert) writes:

Pour inclure dans une ligne de commande la sortie d'une commande, tu
l'inclus entre « ` ». Ici, cela donne :

if [ x"`hostname`" = xmonpc ]; then


Perso, je préfère $(hostname) qui s'imbrique mieux, et qui est sauf
erreur de ma part la plus portable (en restant dans les bourne
shells).


Non, $(...) est POSIX mais pas Bourne (mais Bourne est un tres
vieux shell, sur tous les Unix de moins de 15 ans, on trouve un
sh POSIX (parfois pas dans /bin, quand /bin/sh est resté un
Bourne shell pour backward compatibility comme sous Solaris)).

Dans les shells POSIX, le "x" n'est pas necessaire.

hostname n'est pas une commande POSIX, "uname -n" l'est.

POSIX:

if [ "$(uname -n)" = monpc ]; then...

Bourne ou POSIX:

case `uname -n` in
monpc) ...
esac
if [ monpc = "`hostname`" ]; then...
if [ "x`hostname`" = "xmonpc" ]; then...

--
Stéphane


Avatar
Matthieu Moy
Stephane Chazelas writes:

Non, $(...) est POSIX mais pas Bourne (mais Bourne est un tres
vieux shell, sur tous les Unix de moins de 15 ans, on trouve un
sh POSIX


Oui, je disais « les bourne shells » par opposition aux C shells.

--
Matthieu

Avatar
Stephane Chazelas
2007-01-26, 18:05(+01), Matthieu Moy:
Stephane Chazelas writes:

Non, $(...) est POSIX mais pas Bourne (mais Bourne est un tres
vieux shell, sur tous les Unix de moins de 15 ans, on trouve un
sh POSIX


Oui, je disais « les bourne shells » par opposition aux C shells.


Oui, mais en l'occurrence $(...) n'est pas Bourne. Il est
reconnu par tous les descendants du Bourne shell, mais pas par
le Bourne shell.

Les shells de la famille csh (csh, tcsh) reconnaissent `cmd args` seulement.

Les shells de la famille rc ont `{cmd args} (ou `cmd) ou encore,
en specifiant le separateur:

``(:){head -n1 /etc/passwd}

(les shells rc-like sont d'ailleurs les seuls qui savent
vraiment retourner l'output d'une commande: ``(){cmd})

tcsh et tous les Bourne-like shells (sauf zsh) expandent les
wildcards. csh, les rc-likes et zsh (sauf en emulation d'autres
shells) n'ont pas ce probleme.


--
Stéphane


Avatar
n
Ba merci à tous, j'ai réussi à faire mon ptit script, ça marche
impécable :D

On 26 jan, 02:50, "" wrote:
Bonjour à tous !
J'ai fais un ptit script de sauvegarde que je veux executer sur mes 3
machines.
Je souhaite donc qu'il teste sur quelle machine il est lancé pour
faire la sauvegarde en fonction.
J'ai pensé à faire une comparaison avec hostname, mais je débute en
script, et ça marche pas :

if [ hostname = "monpc" ];then
echo "on est sur mon pc !"
fi

je me doute bien que ce n'est pas de cette manière qu'on test le
retour d'une fonction, mais j'ai cherché rapidement sur gogeuul et
j'ai pas trouvé... alors je me suis dit qu'ici tout le monde savais
ça ;)


Avatar
n
Ba merci à tous, j'ai réussi à faire mon ptit script, ça marche
impécable :D

Fabien