Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

Attention, une faille de sécurité dans bash a récemment été rapportée, il est recommandé de mettre à jour son système (plus de détails)

#1 Le 08/01/2013, à 00:11

Ric_punk

Ne pas créer le fichier si il existe

Salut à tous

J'ai écrit un petit bout de script pour vérifier si un fichier existe, vérifier son contenu et insérer du texte si ce texte n'est pas présent

if [ -f "fichier" ];then
verification="écrire dans le fichier"
grep -q "$verification" fichier || echo "écrire dans le fichier" >> fichier
echo "le fichier existe";
else echo 'écrire dans le fichier' > fichier;
fi

Est-ce que c'est bon ou pas


Si tu as une demande à faire, explique toi clairement, tu risques d'être incompris...

Hors ligne

#2 Le 08/01/2013, à 00:21

φlip

Re : Ne pas créer le fichier si il existe

Quand tu as essayé ton script, c'était bon ou pas ?
Ou tu demandes sans avoir essayé toi même ? Si oui, pour quelle raison ?

Hors ligne

#3 Le 08/01/2013, à 01:00

Ric_punk

Re : Ne pas créer le fichier si il existe

Oui ça a marché mais je me demandais simplement si il n'y a pas plus simple...


Si tu as une demande à faire, explique toi clairement, tu risques d'être incompris...

Hors ligne

#4 Le 08/01/2013, à 01:43

φlip

Re : Ne pas créer le fichier si il existe

Ça ça te plait mieux ?

verification="écrire dans le fichier" 
[ -z "$(grep -s $verification fichier)" ] && echo "$verification" >> fichier

Dernière modification par φlip (Le 08/01/2013, à 01:59)

Hors ligne

#5 Le 08/01/2013, à 02:58

Ric_punk

Re : Ne pas créer le fichier si il existe

Ah ouais ça a l'air bien plus simple

Merci je vais tester ça avec mes paramètres... smile


Si tu as une demande à faire, explique toi clairement, tu risques d'être incompris...

Hors ligne

#6 Le 08/01/2013, à 04:52

Watael

Re : Ne pas créer le fichier si il existe

finalement, il ne s'agit que d'écrire le même message (verification="écrire dans le fichier") à la fin du fichier quelque soit son contenu, non?
donc

verification="écrire dans le fichier" 
echo "$verification" >> fichier

si le fichier n'existe pas, il est créé.


φlip: le test et la substitution de commande sont inutiles

grep -qs motif fichier && echo "écrire dans le fichier" >> fichier || echo "écrire dans le fichier" > fichier

mais comme je viens de l'explication, cela ne semble même pas nécessaire.

Dernière modification par Watael (Le 08/01/2013, à 04:52)


eval, c'est mal.

Hors ligne

#7 Le 08/01/2013, à 07:22

pingouinux

Re : Ne pas créer le fichier si il existe

Bonjour,
Je propose ceci :

grep -qs "$verification" fichier || echo "$verification" >> fichier

En ligne

#8 Le 08/01/2013, à 08:09

Watael

Re : Ne pas créer le fichier si il existe

Je lisais le code, mais pas la description de Ric_punk :

vérifier son contenu et insérer du texte si ce texte n'est pas présent

du coup, je dirais comme pingouinux.


eval, c'est mal.

Hors ligne

#9 Le 08/01/2013, à 11:20

Ric_punk

Re : Ne pas créer le fichier si il existe

Impec, merci à tous les 2 ça fonctionne parfaitement

En fait je cherchais cette commande parce que j'essaie de me faire un script qui va customiser ma version de linux grâce au script de frafa (http://forum.ubuntu-fr.org/viewtopic.php?id=424373) mais j'ai remarqué que de temps en temps ça bloque, donc si j'ai besoin de relancer le script il faut que celui-ci évite de modifier les fichiers une 2e fois
Les fichiers concernés sont assez nombreux (tous les ppa que j'ajoute + modifications pour ne pas prendre les sources - src) la config du parefeu avec mes règles, création des connexions internet (wifi et ethernet), modification du fichiers sources.list, modifications des fichiers de langue, suppression de la prise en charge de l'ipv6 dans ufw, config du fichier logrotate, vsftpd.conf, etc, etc.....

Merci encore ;-)

Dernière modification par Ric_punk (Le 08/01/2013, à 11:21)


Si tu as une demande à faire, explique toi clairement, tu risques d'être incompris...

Hors ligne

#10 Le 08/01/2013, à 22:15

φlip

Re : Ne pas créer le fichier si il existe

Ok super.
En fait dans mon premier message, je craignais que tu demandes d'essayer ton script sans l'avoir essayé toi-même.

Ensuite, j'ai identifié ce qu'il y avait de superflu dans ton script, à savoir:
1) le test d'existence de "fichier"
2) distinguer la redirection ">" de ">>" inutile ici.

Ça a permis de passer de 6 lignes de scripts à 2 lignes, si on inclut la déclaration de variable "verification".
Et... j'avais testé !

Ensuite, on pouvait effectivement encore enlever quelques caractères, mais ça ne remet pas en cause l'idée initiale.

Hors ligne

#11 Le 09/01/2013, à 00:19

Ric_punk

Re : Ne pas créer le fichier si il existe

Ah ben non, je ne demande pas qu'on teste quelque chose que je n'ai pas testé, soit je cherche en testant et demande de l'aide par la suite soit je demande directement si je n'ai aucune idée de ce que je dois faire...

D'ailleurs je vais faire quelque recherches pour comprendre ce que tu as indiqué, ce qui m'évitera de redemander la même chose plus tard ;-)

Merci


Si tu as une demande à faire, explique toi clairement, tu risques d'être incompris...

Hors ligne

#12 Le 09/01/2013, à 01:20

φlip

Re : Ne pas créer le fichier si il existe

Un petit pense-bête utile pour ne pas dire indispensable => Introduction to if

ps: les plus grosses vacheries que j'ai personnellement rencontrées sont...

1 - les incompatibilités partielles entre /bin/sh et /bin/bash ... et qui évoluent selon les versions (prise de tête garantie).

2 - la subtilité de gestion des 3 guillements suivants: "  '  ` , particulièrement avec la fonction sed utilisée de manière poussée.

Il y a de quoi se casser les dents, mais quand on a plus de dents, c'est qu'on a appris  au moins un minimum....

Dernière modification par φlip (Le 09/01/2013, à 01:30)

Hors ligne

#13 Le 15/01/2013, à 17:26

Ric_punk

Re : Ne pas créer le fichier si il existe

Désolé de la réponse tardive... roll

Merci beaucoup pour le pense bête...

Je peux me casser les dents, pas grave, ce ne sont pas les miennes... big_smile


Si tu as une demande à faire, explique toi clairement, tu risques d'être incompris...

Hors ligne

#14 Le 28/01/2013, à 19:48

Marty69

Re : Ne pas créer le fichier si il existe

Hello !

J'utilise la syntaxe suivante qui fonctionne
grep -qs "$verification" fichier || echo "$verification" >> fichier

Cependant je dois aussi l'utiliser pour insérer une ligne dans le fstab, il me faut donc le faire en mode super utilisateur mais malgré l'utilisation de sudo j'ai un message d'erreur disant que je n'ai pas les droits nécessaires !

Ma ligne de commande :
sudo grep -qs "blablabla" /etc/fstab || sudo echo "blablabla" >> /etc/fstab

Réponse :
bash: /etc/fstab: Permission non accordée

une petite aide ?

Dernière modification par Marty69 (Le 28/01/2013, à 19:50)

Hors ligne

#15 Le 28/01/2013, à 21:42

Sciensous

Re : Ne pas créer le fichier si il existe

Marty69 a écrit :

Hello !

J'utilise la syntaxe suivante qui fonctionne
grep -qs "$verification" fichier || echo "$verification" >> fichier

Cependant je dois aussi l'utiliser pour insérer une ligne dans le fstab, il me faut donc le faire en mode super utilisateur mais malgré l'utilisation de sudo j'ai un message d'erreur disant que je n'ai pas les droits nécessaires !

Ma ligne de commande :
sudo grep -qs "blablabla" /etc/fstab || sudo echo "blablabla" >> /etc/fstab

Réponse :
bash: /etc/fstab: Permission non accordée

une petite aide ?

Un classique (néanmoins pas trop courant wink:

sudo sh -c 'grep -qs "blablabla" /etc/fstab ||  echo "blablabla" >> /etc/fstab'

Hors ligne

#16 Le 28/01/2013, à 22:45

Marty69

Re : Ne pas créer le fichier si il existe

Evidement ça fonctionne wink
merci beaucoup !
Ceci dit pourquoi "sh -c" alors que le reste des lignes de mon script fonctionne bien avec un simple sudo ?

Hors ligne

#17 Le 28/01/2013, à 22:45

Watael

Re : Ne pas créer le fichier si il existe

salut,

sudo -s <<eof
grep -qs "blablabla" /etc/fstab ||  echo "blablabla" >> /etc/fstab
eof

eval, c'est mal.

Hors ligne

#18 Le 29/01/2013, à 11:32

Sciensous

Re : Ne pas créer le fichier si il existe

Marty69 a écrit :

Evidement ça fonctionne wink
merci beaucoup !
Ceci dit pourquoi "sh -c" alors que le reste des lignes de mon script fonctionne bien avec un simple sudo ?

j'espère ne pas dire de bétise, mais c'est à cause des priorités d'interprétation : le sudo pour écrire ne porte en fait que sur le echo et non l'écriture >>
(au passage, le 1er sudo est inutile: grep -qs "blablabla" /etc/fstab || sudo -c 'echo "blablabla" >> /etc/fstab')

PS: n'oublie pas le résolu dans le titre !

Dernière modification par Sciensous (Le 29/01/2013, à 11:33)

Hors ligne

#19 Le 29/01/2013, à 12:26

Marty69

Re : Ne pas créer le fichier si il existe

ok merci pour ces précisions.
PS : je ne suis pas l'initiateur de ce fil, je ne peux pas éditer le premier post.
bonne journée et merci encore

Hors ligne

Haut de page ↑