Jump to content

Archived

This topic is now archived and is closed to further replies.

P-A

[Tuto] Les Scripts Bash

Recommended Posts

Humm tu viens de me faire découvrir un bug... merci :D

Alors oui ça marche avec tr -d , mais est-ce mieux de refaire appel à sed (déjà utiliser avant) ou d'appeler tr ? Qu'est-ce qui est le plus léger ?

La ligne que j'aimerai arriver à grepper à chaque fois ressemble à ça : Project: 1850 (Run 25, Clone 106, Gen 0)

Share this post


Link to post
Share on other sites
Alors oui ça marche avec tr -d , mais est-ce mieux de refaire appel à sed (déjà utiliser avant) ou d'appeler tr ? Qu'est-ce qui est le plus léger ?

à mon avis tr est beaucoups plus léger (et rapide)

La ligne que j'aimerai arriver à grepper à chaque fois ressemble à ça : Project: 1850 (Run 25, Clone 106, Gen 0)

RUN=$(grep -i run $1/FAHlog.txt | tail -n 1 | awk {'print $5'} | sed -e "s/,//")
CLONE=$(grep -i clone $1/FAHlog.txt | tail -n 1 | awk {'print $7'} | sed -e "s/,//")
GEN=$(grep -i gen $1/FAHlog.txt | tail -n 1 | awk {'print $9'} | sed -e "s/)//")

RUN=$(grep Run $1/FAHlog.txt | tail -n 1 | tr '(,)' '   ' | awk {'print $4'})
CLONE=$(grep Clone $1/FAHlog.txt | tail -n 1 | tr '(,)' '   ' | awk {'print $6'})
CLONE=$(grep Gen $1/FAHlog.txt | tail -n 1 | tr '(,)' '   ' | awk {'print $8'})

1) à mon avis "grep -i" est plus lent que "grep"

2) on change "(", "," et ")" en espace

4) on utilise un awk avec -F " " (par défaut) et on prend ce qu'on a besoin...

Share this post


Link to post
Share on other sites

Wahou OK je vais tester ça, j'arrive déjà à grepper la ligne que je veux à chaque fois (mauvais pattern pour le grep en fait, "Project:" est beaucoup mieux)

:craint:

edit: ça marche au poil, tu viens de m'apprendre et l'éxistence de tr et sa syntaxe et en plus tu intègres la liste des personnes remerciées, c'est-y pas bô ? :D

et même pas besoin de convertir "(" en espace, ce que je voulais virer c'était juste les virgules et la paranthèse fermante finale :)

Share this post


Link to post
Share on other sites

Ce n'est pas un script bash a vrai dire, c'est plus de la configuration du prompt de bash

Utilisation

rajoutez ca dans /etc/bash.bashrc, ou bien dans chacun de vos ~/.bashrc (mais le mettre sur le systeme entier, ca reste plus pratique).

Si vous l'avez mis dans /etc, il faut virer les export PS1 dans vos fichiers .bashrc respectifs.

# Code couleur de l'host
export PS_HOST_COLOR='\[\e[01;32m\]'

# Code couleur du user (selon si il est root ou pas)
if [ $(id -u) -eq 0 ]
then
	export PS_USER_COLOR='\[\e[01;31m\]'
else
	export PS_USER_COLOR='\[\e[01;34m\]'
fi

export PS1='\007'$PS_USER_COLOR'\u'$PS_HOST_COLOR'@\h:\[\e[01;35m\]\w\[\e[33;01m\]\$\[\e[00m\] '


Je mettrais a jour avec les codes couleurs :)

Si jamais vous savez comment faire un include dans un fichier script bash, ca m'interesse :)

en gros, pour, la config de base, en root, on aura un prompt de cette forme

root@hostname:/root/#

et pour un utilisateur normal

user@hostname:/home/user$

Share this post


Link to post
Share on other sites

Dans un bash ou dans le .bashrc ?

Dans un script bash pour les insculdes, il suffit de faire

$(/path/to/file/script.sh)

Pour le bashrc et la coloration, il y a des centaines d'exemples sur le net plein de gens mettent leur perso, et il y a pas mal de tutos aussi. :google: est votre ami :up:

Share this post


Link to post
Share on other sites

padprobz, le tout est de trouver la bonne commande ...

ensuite pour faire un archivage automatique, tu peux faire un script du style :

[ -d $arcpath ] || mkdir $arcpath
[ -d $arcpath/$year ] || mkdir $arcpath/$year
[ -d $arcpath/$year/$monthyear ] || mkdir $arcpath/$year/$montyear

ou bien:

[ -d $arcpath/$year/$monthyear ] || mkdir -p $arcpath/$year/$montyear

Sinon quelques liens en Anglais pour des sauvegardes incrémentales avec rsync.

http://www.mikerubel.org/computers/rsync_snapshots/

http://www.macosxhints.com/article.php?sto...31024013757927/ (inutile d'utiliser find/cpio, utiliser ls)

A noter qu'il existe une option --link-dest pour rsync qui peut dispenser d'utiliser cp -al.

A+

Share this post


Link to post
Share on other sites
Dans un script bash pour les insculdes, il suffit de faire
$(/path/to/file/script.sh)

je dirais plutôt :

source include

ou (strictement équivalent) :

. include

Share this post


Link to post
Share on other sites

Je l'oublie très souvent alors ca me permettra de la retrouver facilement :

basename fichier.ext .ext

Permet de récuperer "fichier"

Et pour la forme

dirname

ca permet de récuperer le nom du répertoire courant

Share this post


Link to post
Share on other sites

Je déterre un peu ce topic bien interressant...

Je cherche à faire un script qui me permette de lance une série de commande ftp ou ssh dans un script par exemple:

Ca je sais faire

- créer un répertoire local à partir de la date du système (mkdir ...)

- se déplacer dedans (cd ...)

- se connecter à un serveur ftp ou ssh (ftp ... ou ssh ...)

Mais après je bloque, comment continuer le script pour récupérer des fichiers sur le ftp se déplacer dasn les répertoire ou lancer des commandes dans la sessions ssh ??? (commandes ftp ou ssh pas forcement que de copie de fichiers)

Est-ce que c'est faisable, ou est-ce qu'il faut que je me rabatte vers un autre langage de script plus évolué (python ...)

Share this post


Link to post
Share on other sites

Salut

pour le ftp tu peux fournir un fichier contenant les commandes à executer en passant je ne sais plus quel argument, mais c'est possible :) .

Share this post


Link to post
Share on other sites

et ssh tu peux passer en argument les commandes à exécuter, genre

ssh lorinc@grossescochones.com ls ~/XXX/*.jpeg

:transpi:

Share this post


Link to post
Share on other sites
et ssh tu peux passer en argument les commandes à exécuter, genre

ssh lorinc@grossescochones.com ls ~/XXX/*.jpeg

:craint:

Je te reconnais bien la :transpi:

Salut

pour le ftp tu peux fournir un fichier contenant les commandes à executer en passant je ne sais plus quel argument, mais c'est possible :) .

c'est pas @ ?

Share this post


Link to post
Share on other sites

Il y a aussi lftp qui gère les commandes à lancer directement sur la ligne de commande, exemple : lftp -u user,pass ftp.groscochons.org -c "cd /groins; mirror -R .; exit"

Sinon, il y a toujours ce bon vieux expect.

Share this post


Link to post
Share on other sites

sleep x

avec x un nombre de secondes

Aussi, sleep supporte le paramètre s, m, h, d.

Tu peux écrire sleep 5s (pour 5 secondes) ou sleep 5h (pour 5 heures)

Mais je répète, c'est écrit dans man sleep :iloveyou:

Il y a aussi lftp qui gère les commandes à lancer directement sur la ligne de commande, exemple : lftp -u user,pass ftp.groscochons.org -c "cd /groins; mirror -R .; exit"

Sinon, il y a toujours ce bon vieux expect.

Moi j'utilise ncftp (+ ncftpget et ncftpput) qui est pas mal non plus. C'est pratiquement pareil à lftp.

Share this post


Link to post
Share on other sites

Je suppose que ça dépend du client FTP utilisé alors qui doit alors être capable de lancer un script FTP dasn le script :cap:

Share this post


Link to post
Share on other sites

Salut

Je suis en train de finir un script, mais j'ai un soucis de syntaxe avec une boucle :


echo "combien de comptes souhaitez vous ajouter ?"
	read i


		while [ $i != 0 ]
			   do 
			echo "creation du compte n°"   #ici numero du compte
			echo "quelle est le nom de l'utilisateur ?"
			echo "donnez un mot de passe "
			i=='expr $i - 1'

		done

En fait c'est a la fin que çà bloque, je voudrais augmenter la valeur de $i a chaque tous de boucle, mais une erreur de syntaxe bloque mon affaire.

Si quelqu'un pouvais m'aider ça serais super :) .

a+

Share this post


Link to post
Share on other sites

echo "combien de comptes souhaitez vous ajouter ?"
read i

 while [ "$i" -ne "0" ]
 do
echo "creation du compte n°"   #ici numero du compte
echo "quelle est le nom de l'utilisateur ?"
echo "donnez un mot de passe "
((i=i-1))
done

Compatible avec le bourne shell historique pour les machines qui n'ont pas bash (/bin/sh) :yes:

Ou pour pas se faire chier

for j in `seq $i`; do...done

(Ou avec $() si c'est bash/ksh/zsh only sans soucis de rétrocompatibilité)

Share this post


Link to post
Share on other sites
echo "combien de comptes souhaitez vous ajouter ?"
read i

 while [ "$i" -ne "0" ]
 do
echo "creation du compte n°"   #ici numero du compte
echo "quelle est le nom de l'utilisateur ?"
echo "donnez un mot de passe "
((i=i-1))
done

Compatible avec le bourne shell historique pour les machines qui n'ont pas bash (/bin/sh) :yes:

salut

Merci beaucoup :).

Quand j'aurais un peu de temps je donnez le reste du script, c'est a dire ce week end, c'est pour creer des htacces :)

a+

Share this post


Link to post
Share on other sites

humm, je sais pas trop où je dois mettre ca, j'hésitais avec le topic des exercices ....

enfin, j'ai un peu de temps donc j'ai décidé de me mettre sérieusement à l'écriture de scripts

j'ai un peu joué avec zenity, c'est plutot sympa :yes:

donc un petit exemple tout simple de ce que j'ai fait. On peut sans doute améliorer...

#!/bin/sh

URL="$(zenity --entry \
 --title="Enregister le flux" \
 --text="Saisir le lien vers le flux :")"
FILENAME="$(zenity --entry \
 --title="Enregister le flux" \
 --text="Saisir le nom du fichier (chemin complet)"

mplayer -noframedrop -dumpfile $FILENAME -dumpstream $URL  | zenity --text-info --title "Capture du Flux -- Merci de patienter;)"$

c'est tout simple le script demande l'url du flux puis le nom de fichier pour l'enregistrement.

bon c'est vraiment pas grand chose mais c'est marant de faire des scripts avec de jolies boites de dialogue gtk+ ;)

puis accessoirement ca peut etre util pour certains. A priori ca capture aussi bien le real que le média player. La conversion viendra pluls tard, j'ai pas encore réussi à me décider sur le format de capture ;)

Voilà, un message, pour les idiots comme moi qui ne connaissaient pas :transpi:

Share this post


Link to post
Share on other sites

Tu as aussi dialog, Xdialog et ssh-askpass / gnome-askpasspour les passphrases :yes:

Share this post


Link to post
Share on other sites

bone je ne dois pas etre encore bien réveillé...

je voudrais utiliser ca http://www.tldp.org/LDP/Bash-Beginners-Gui...sect_07_01.html

pour vérifier si des fichiers existent....

mais impossible d'arriver à écrire le test, j'ai essayé :

if [ (-e /tmp/outvid.avi) -a (! (-e /tmp/outaud.ogg)) ]

je souhaite que ca renvoie vrai, si /tmp/outvid.avi existe et

/tmp/outaud.ogg n'existe pas ....

mais ca ne marche poa :(

si je mets les parenthèses, j'ai droit à une erreur sur les parenthèses et si je les mets pas, il me sort une erreur su le -e ( "syntax error near unexpected token `-e' ")

Share this post


Link to post
Share on other sites
bone je ne dois pas etre encore bien réveillé...

je voudrais utiliser ca http://www.tldp.org/LDP/Bash-Beginners-Gui...sect_07_01.html

pour vérifier si des fichiers existent....

mais impossible d'arriver à écrire le test, j'ai essayé :

if [ (-e /tmp/outvid.avi) -a (! (-e /tmp/outaud.ogg)) ]

je souhaite que ca renvoie vrai, si /tmp/outvid.avi existe et

/tmp/outaud.ogg n'existe pas ....

mais ca ne marche poa :(

si je mets les parenthèses, j'ai droit à une erreur sur les parenthèses et si je les mets pas, il me sort une erreur su le -e ( "syntax error near unexpected token `-e' ")

Ça ça marche :

if [ -e /tmp/outvid.avi -a ! -e /tmp/outvid.ogg ]

Mais bon globalement c'est pas très facile à lire...

Moi j'utiliserais des trucs plutôt du genre :

if [ -e /tmp/outvid.avi ] && [ ! -e /tmp/outvid.ogg ]

Share this post


Link to post
Share on other sites

Ça ça marche :

if [ -e /tmp/outvid.avi -a ! -e /tmp/outvid.ogg ]

ben t'as du bol, j'y ai tourné dans tous les sens ca a jamais voullu avec le "!" faudra que j'éclaircisse ce mistère). Du coup j'ai évité les "!" et ca marche...

bon en tout ca, le script est quasiment fini, il reste juste à ajuster les choix au niveaux des taux de compression... à part ca ca marche du tonerre :fete:

Share this post


Link to post
Share on other sites

×
×
  • Create New...