Aller au contenu

[Tuto] Les Scripts Bash


P-A

Messages recommandés

les quotes simples sont des... ......... ........... simple quotes (ok caynul :zarb: )

les autres renvoyoient le résultat de la commande qu'elles contiennent :

VARIABLE = cat `ls fichier[0123456789]` | grep coucou

est en fait la même chose que

VAR2=$(ls fichier[0123456789])

VARIABLE=cat $VAR2 | grep coucou

mouaif, je suis moyennement convaincu par mon exemple. en fait ` a le même effet que $() , c'est à dire renvoyer le résultat de la commande qu'elle encadre :-D

merci, donc j'ai pas tout perdu de mes cours de bash ^^

Lien vers le commentaire
Partager sur d’autres sites

  • Réponses 101
  • Créé
  • Dernière réponse

Bon, allez, tant que j'y suis...

comment enregistrer la télé avec ma carte BT848 (et sans doute beaucoup d'autres :))

#!/bin/sh

if [ ! -n "$1" ]; then
       echo "You must specify a channel!"
       exit
fi

rm -i audio.wav video.avi video.yuv
mkfifo -m 660 video.yuv
cat video.yuv | yuv2lav -o video.avi &
arecord -f cd audio.wav &
mplayer -quiet -tv driver=v4l2:device=/dev/video0:normid=2:chanlist=france:amode=1:channels=21-fr2,24-fr3,27-TF1,34-fr5,60-M6 tv://$1 -noframedrop -vo yuv4mpeg:file=video.yuv
killall arecord

(il faut pas oublier de mettre "Capture" et "Aux" en capture dans alsamixer...sinon c'est raté pour arecord)

et pour lire :

#!/bin/sh
mplayer video.avi -audiofile audio.wav -delay -0.2 -vf pp=lb

Bon, ça servira pas forcément à tout le monde, mais bon, ça montre au moins les possibilités de mkfifo (j'avais essayé avec mplayer -vo jpeg... ben c'est pas facile à gérer, 2 millions de fichiers jpeg :fou: )

Des scripts bash, j'en fait plein, si j'en ai d'autres intéressants, j'essairais de les poster... mais bon, je vais sûrement oublier :chinois: )

Lien vers le commentaire
Partager sur d’autres sites

Merci TFC69 pour ton petit script de rippage :fou:

si il y a d'autres amateurs de bash, postez vos petits scripts egalement ça serait bien d'avoir une bonne petite base de donnée de scripts pour les inpactiens :chinois:

Le seul script bash un tant soit peu évolué que j'ai fait, ct un script de ripping de cd audio avec notre prof. Mais la red hat qu'on avait (8 je crois :o ) ne m'enregistrait pas les données sur ma clé usb au umount ... Donc j'ai tout perdu :roll:

Et de toute facon, je pense que celui de TFC est mieux :)

Lien vers le commentaire
Partager sur d’autres sites

dans ~/bin?

euh...

cvscedega? :pleure:

J'ai aussi un script qui permet de démarrer un nouveau serveur X avec l'appli de son choix (et éventuellement de changer les touches "&é"'(-è_çà" en "1234567890", pour jouer à ut2004), mais bon, il est trop simple...

Lien vers le commentaire
Partager sur d’autres sites

dans ~/bin?

euh...

cvscedega? :D

J'ai aussi un script qui permet de démarrer un nouveau serveur X avec l'appli de son choix (et éventuellement de changer les touches "&é"'(-è_çà" en "1234567890", pour jouer à ut2004), mais bon, il est trop simple...

En gros, tu lances un jeu, ca se met dans un autre terminal, c ca ?

Si oui, ca m'interesse :mdr: M'en fous si c simple ^^Du coup, avec CTRL + ALT + F7..F12, on peut revenir a son desktop, c ca ?

Lien vers le commentaire
Partager sur d’autres sites

Pour retailler des images à la volée qui sont dans le repertoire courant.

#!/bin/sh
#Script pour retailler des images jpg a la volee en 640x480
for i in `ls *.jpg`;
do
       resolution=`identify $i | grep [0-9]*x[0-9]* -o`
       h_res=`echo $resolution | grep [0-9]* -o`
       v_res=`echo $resolution | grep [0-9]*$ -o`
       if [ $h_res -lt $v_res ]; then
               echo Traitement de $i
               convert -resize 480x640 $i `echo $i | sed s/".jpg"/"_resized.jpg"/`
       else
               echo Traitement de $i
               convert -resize 640x480 $i `echo $i | sed s/".jpg"/"_resized.jpg"/`
       fi
done

Pour archiver les logs :

#!/bin/bash
CHEMIN="/var/log"
kill -SIGTERM `cat /var/run/syslogd.pid`                                #Termine syslogd
if [ -d $CHEMIN/archives ]; then
       echo Archivage des logs
else
       mkdir $CHEMIN/archives
fi
if [ "$#" = "1" ]; then
       mkdir $CHEMIN/archives/$1
       for i in $CHEMIN/*
       do
               if [ -f $i ]; then                                      #si le fichier courant est un fichier (et non un dossier)
                       cp $i $CHEMIN/archives/$1/                      #copie du log vers le dossier créé dans archives
                       rm -f $i                                        #Suppression de l'original
               elif [ -d $i ]; then                                    #si le fichier courant est un dossier
                       if [ "$i" = "$CHEMIN/archives" ]; then          #Si c'est le dossier archives on n'y touche pas
                               echo Compression en cours...
                       else
                               cp -r $i $CHEMIN/archives/$1/           #on copie vers le dossier crée dans archives
                               for k in $i/*                           #On supprime les fichier à l'intérieur des repertoires
                               do
                                       rm -f $k
                               done
                       fi
               fi
       done
       cd $CHEMIN/archives
       tar -czf $1.tar.gz $1
       rm -Rf $1
else
       echo Utilisation : cleanlog mois-jj-yyyy
fi
syslogd

Ces deux scripts sont loins d'être parfait et peuvent être optimisés mais je suis pas un expert en programmation bash et j'avais besoin d'une solution rapidement.

Un exemple d'amélioration pour le premier pourrait être de fournir le format de sortie de l'image sur la ligne de commande (on les récupère par $1 et $2 il me semble)

Have fun :)

Lien vers le commentaire
Partager sur d’autres sites

En gros, tu lances un jeu, ca se met dans un autre terminal, c ca ?

Si oui, ca m'interesse :mdr: M'en fous si c simple ^^Du coup, avec CTRL + ALT + F7..F12, on peut revenir a son desktop, c ca ?

ben ça démarre un nouveau serveur X (genre ça marche pas avec les ATI :chinois: )

en gros...

X :1
export DISPLAY=:1
<programme ou $1 ou n'importe>

Lien vers le commentaire
Partager sur d’autres sites

ben ça démarre un nouveau serveur X (genre ça marche pas avec les ATI :mdr: )

en gros...

X :1
export DISPLAY=:1
<programme ou $1 ou n'importe>

En effet, j'ai essayé, et ca a crashé mon serveur X (quake3)

Fatal server error:
Caught signal 11.  Server aborting

ou bien crashé tout court avec ut2004 avec un segmentation fault :(

Ca vient d'ou ce probleme ? Hardware qui gere pas ? Ou pilote ?

Chuis decuuuuu :(

Lien vers le commentaire
Partager sur d’autres sites

Pour ceux qui utilisent nautilus, il faut savoir qu'il y a moyen d'ajouter des scripts dans le répertoire "~/.gnome2/nautilus-scripts"

Ils apparaissent ensuite lors du clic droit sur un élément...

Voici par exemple un script qui permet d'ouvrir une console dans le répertoire sélectionné (ou le répertoire courant si l'élément sélectionné est un fichier) :

#!/bin/sh

NEWTERM="gnome-terminal"

BASE=`pwd` # repertoire courant
FILES=0 # aucun fichiers du repertoire courant selectionne

for uri in $NAUTILUS_SCRIPT_SELECTED_URIS # pour chaque selection
do
       uri=`echo $uri | sed 's.file://..' | sed 's.%20. .'` # on transforme l'uri en path (attention en reseau;))
       if [ -d $uri ] # si c'est un dossier
       then
               pushd $uri #on rentre dans le dossier
                       $NEWTERM & # et on lance le term
               popd # on revient
       else
               if [ $base=`dirname $uri` ] # si le fichier est dans le repertoire courant
               then
                       FILES=1 # on ouvrira un term dans le rep courant
               fi
       fi
done

if [ $FILES -eq 1 ] # si FILES est a 1
then
       $NEWTERM & # on ouvre un term dans le rep courant
fi

C'est commenté, donc ça devrait permettre à ceux qui veulent comprendre de voir plus ou moins comment ça marche...

La ligne "#!/bin/sh", c'est pas utilisé par nautilus, mais ça met la couleur dans vim, donc voilà :chinois:

Donc au final, il est possible de choisir des fichiers/dossier, et ce script ouvrira un term pour chaque dossier, plus un term dans le dossier courant si il y a des fichiers sélectionnés...

EDIT : et pas oublier de mettre le script dans ~/.gnome2/nautilus-scripts, chez moi je l'ai nommé "terminal" et surtout le mettre en +x :)

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bonjour à tous ! j'espère que c'est le bon endroit pour poster mon message, je n'ai pas osé ouvrir un nouveau post...

Voila je souhaiterais manipuler les dates sous BASH et je ne sais pas trop comment faire... Y a t'il des commandes qui permettent de faire ça et lesquelles ??

En fait, je souaiterais récupérer le mois en cours (sur 2 chiffre) et l'année (sur 4 chiffre)

Par exemple 2005-04 pour avril 2005 ou 2002-12 pour décembre 2002 !!

Voila, c'est surement tout bête mais je suis pas super fort dans le domaine... :francais:

Lien vers le commentaire
Partager sur d’autres sites

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

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

#!/bin/sh
#script d'archivage (à mettre dans la crontab, à lancer juste avant minuit;)
year=`date +'%Y'`
monthyear=`date +'%Y%m'`
arcpath="/var/archives"

# créer le répertoire
# la version sale :
# mkdir $arcpath/$year >/dev/null 2>&1
# la version propre :
[ -d $arcpath ] || mkdir $arcpath
[ -d $arcpath/$year ] || mkdir $arcpath/$year
[ -d $arcpath/$year/$monthyear ] || mkdir $arcpath/$year/$montyear

# les commandes d'archivages ...
# exemple (archivage manuel des logs de squid)
squid -k logrotate
awk -f /usr/local/bin/split_squid_logs.awk /var/log/squid/access.log.0 >> $arcpath/$year/$monthyear/squid.mylog

Lien vers le commentaire
Partager sur d’autres sites

  • 4 semaines après...
  • 2 semaines après...
  • 4 mois après...

:yes::dd:

Alors voilà mon premier script bash, c'est basique (pas de boucles ou de tests) mais ça me sort ce que je veux.

Qu'en pensez-vous, tant sur le font que sur la forme ?

#!/bin/bash

# fah2conky by nonas (nonas@rediffmail.com)
# v0.4 2005 sep 18
# Folding@Home
# Retrieve information from unitinfo.txt and psummary.txt
# You need to create psummary.txt :
# rm psummary.html & rm psummary.txt & wget http://vspx27.stanford.edu/psummary.html && html2text psummary.html > psummary.txt
#
# This script is released under GNU-GPL v2
# http://www.gnu.org/copyleft/gpl.html
#####
# Usage : fah2conky.sh unitinfo.txt psummary.txt
# Just modify the output to get what you want. Enjoy;)


### unitinfo.txt & psummary.txt
UNITINFO=$1
PSUMMARY=$2

### data from unitinfo.txt
NAME=$(grep Name $1 | sed -e "s/Name: //")
PROGRESS=$(grep % $1 | cut -c 11-14 | sed -e "s/[ ][ ]*$//")
DL_TIME=$(grep Download $1 | sed -e "s/Download time: //")
DUE_TIME=$(grep Due $1 | sed -e "s/Due time: //")

### data from psummary.txt
NUMBER=$(grep $NAME $2 | cut -c 1-4 | sed -e "s/[ ][ ]*$//")
SERVER_IP=$(grep $NAME $2 | cut -c 9-23 | sed -e "s/[ ][ ]*$//")
ATOMS=$(grep $NAME $2 | cut -c 61-67 | sed -e "s/[ ][ ]*$//")
PREF_DAYS=$(grep $NAME $2 | cut -c 68-77 | sed -e "s/[ ][ ]*$//")
DEADLINE=$(grep $NAME $2 | cut -c 78-86 | sed -e "s/[ ][ ]*$//")
CREDIT=$(grep $NAME $2 | cut -c 87-93 | sed -e "s/[ ][ ]*$//")
FRAMES=$(grep $NAME $2 | cut -c 94-100 | sed -e "s/[ ][ ]*$//")
CORE=$(grep $NAME $2 | cut -c 101-110 | sed -e "s/[ ][ ]*$//")

echo "Name: $NAME, #$NUMBER, $CREDIT points, $CORE, $PROGRESS, IP: $SERVER_IP, Atoms: $ATOMS, Pref_days: $PREF_DAYS, Dead: $DEADLINE, Frames: $FRAMES, DL_T: $DL_TIME, DUE_T: $DUE_TIME."

Je sais bien que le coup des cut c'est pas très propre, c'est pourquoi j'espère que psummary.html aura toujours la même tronche :iloveyou:

J'ai pas voulu mettre la création de psummary.txt dedans car c'est un script qui est amené à être appelé toutes les 10 minutes en gros et le fichier psummary.html change assez rarement ... enfin j'espère ^_^

Pour les updates si y'a ça sera là : http://nitrotoxine.free.fr/www/scripts/conkyfah/

Merci à ce tuto, aux exos bash de lorinc et à google mon fidèle ami :byebye:

EDIT: mouahaha c'est trop moche, Inpact- KoinKoin (le plus gros plieur de la team INpact) m'a envoyer une version amélioer avec des awk. Ben oui forcement avec awk c'est beaucoup beaucoup plus propre, ça permettra même de s'adapter plus facilement à un nouveau psummary.html. Donc je vais bosser ça. Merci à lui ! :yes:

Lien vers le commentaire
Partager sur d’autres sites

re-:up:

Bon voilà la dernière version, avec des awk, toujours pas de tests pour vérifier la syntaxe, ça alourdirai beaucoup.

Normalement ça fonctionne même pour les WorkUnit ayant des espaces dans leu nom.

Si vous avez des idées d'amélioration ou que vous voyez des bugs, n'hésitez pas ;)

#!/bin/bash

# fah2conky by nonas (nonas@rediffmail.com) - Merci à Inpact- KoinKoin et theocrite;)
# v0.8  - 2005 sep 24
# Retrieve information from Folding@Home files (unitinfo.txt, FAHlog.txt and psummary.txt)
# You need to create psummary.txt :
# rm psummary.html & rm psummary.txt & wget http://vspx27.stanford.edu/psummary.html && html2text psummary.html > psummary.txt
#
# This script is released under GNU-GPL v2 
# http://www.gnu.org/copyleft/gpl.html
#
#####
# Usage : fah2conky.sh path/client_folder/ path/psummary.txt
# Just modify the output to get what you want. Enjoy;)


### client folder & psummary.txt
FAH_DIR=$1
PSUMMARY=$2

### data from unitinfo.txt
NAME="$(grep Name $1/unitinfo.txt | sed -e "s/Name: //")"
PROGRESS=$(grep % $1/unitinfo.txt | awk {'print $2'} | sed -e "s/%//")
DL_TIME="$(grep Download $1/unitinfo.txt | sed -e "s/Download time: //")"
DUE_TIME="$(grep Due $1/unitinfo.txt | sed -e "s/Due time: //")"

### data from psummary.txt
NUMBER=$(grep "$NAME" $2 | awk {'print $1'})
SERVER_IP=$(grep "$NAME" $2 | awk {'print $2'})
ATOMS=$(grep "$NAME" $2 | awk {'print $(NF-7)'})
PREF_DAYS=$(grep "$NAME" $2 | awk {'print $(NF-6)'})
DEADLINE=$(grep "$NAME" $2 | awk {'print $(NF-5)'})
CREDIT=$(grep "$NAME" $2 | awk {'print $(NF-4)'})
FRAMES=$(grep "$NAME" $2 | awk {'print $(NF-3)'})
CORE=$(grep "$NAME" $2 | awk {'print $(NF-2)'})
CONTACT="$(grep "$NAME" $2 | awk {'print $NF'})"

### data from FAHlog.txt
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/)//")
PERF_FRACTION=$(grep performance $1/FAHlog.txt | tail -n 1 | awk {'print $5'})

echo -e "Name: "$NAME",\nNumber: $NUMBER,\nCredit: $CREDIT,\nCore: $CORE,\nProgress: $PROGRESS%,\nIP: $SERVER_IP,\nNumber of Atoms: $ATOMS,\nPref_days: $PREF_DAYS,\nDeadline: $DEADLINE,\nNumber of Frames: $FRAMES,\nDownload_time: "$DL_TIME",\nDue_time: "$DUE_TIME",\nRun: $RUN,\nClone: $CLONE,\nGen: $GEN,\nContact: "$CONTACT",\nPerformance fraction: $PERF_FRACTION."

Un petit script pour mettre à jour psummary.html (ou le créer) (merci à Inpact- KoinKoin pour le code ;))

#!/bin/bash

rm psummary.html & rm psummary.txt
wget=`which wget`
if [ "x" = "x$wget" ]; then
echo "wget is not installed on your system, can't retrieve psummary.html."
exit 1
fi
html2text=`which html2text`
if [ "x" = "x$html2text" ]; then
echo "html2text is not installed on your system, can't convert psummary.html to psummary.txt"
exit 1
fi
$wget http://vspx27.stanford.edu/psummary.html && $html2text psummary.html > psummary.txt

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.


×
×
  • Créer...