Forum Clubic

Vos scripts bash ou autre - qui vous sert tous les jours

Comme étant un utilisateur de la ligne de commande, j’aime bien me créer quelques scripts bash simple qui m’évite de me retaper x fois les mêmes commandes

Je vous propose mon script pour faire des screenshots :


#!/bin/bash
sleep 5 
path="$HOME/screenshot/"
scr="screenshot"
thu="thumb"
dd=`date +%F_%R`

import -window root -quality 100 -silent $path$scr$dd.png
convert $path$scr$dd.png -resize 320x200 $path$thu$dd.png

j’attend les votres :slight_smile:

bon apparement mon topic ne plait à personne :frowning:

:smiley: . En fait, je ne fais des scripts que quand j’ai besoin d’un truc précis et je ne passe generalement pas par u nfichier, mais juste en ligne de commande. C’est des trucs assez con du genre, recuperer le debit reseaux avec ifconfig et des cut/tail/head de partout :smiley: (je sais, torsmo et companie le font, c’est pour ca que je dis que c’est con :ane: ).
La plupart de mes scripts sont fais pour demarrer des jeux avec cedega (genre je rentre dans le repertoire, je lance cedega et je resors du repertoire). Bref, rien de bien interessant :confused:

moi j’ai juste un petit script pour encoder du flac /shn en ogg, c’est pas tres propre amon avis mais bon :

#! /bin/bash
# Usage script PATH FORMAT

REP=$1
FORMAT=$2

if  [[ -z $1 || -z $2 ]]
then
	echo "Erreur!"
	exit 1
fi

if [[ -e $REP ]]
then
cd $REP
else 
echo "$REP n'existe pas!"
exit 1
fi

for i in *.$FORMAT 
	do
        if [[ "$FORMAT" == "flac" ]]
        then 
	flac -d "$i" 
	fi
	if [[ "$FORMAT" == "shn" ]]
	then 
	shntool conv $i	
	fi
done

for i in *.wav 
do 
	oggenc -q 8 "$i"
done

rm -rf *.flac *.wav *.shn

Y aurait des conditions a rajouter pour gerer toutes les erreurs possibles mais j’ai la flemme :stuck_out_tongue:

Je ne script presque plus en bash. Je le fais en python tout simplement parce que python est beaucoup plus lisible que bash (surtout pour un non spécialiste qui devra relire mes scripts…).
Ce n’est pas un troll !!!. Tout ce qui m’intéresse, c’est de faire un code réutilisable par le maximum de personnes. Avec la tonne de modules python dispo “c’est que du bonheur” :wink:

+1 :super:

+1 pour python même si je l’utilise pourt des choses un peu plus complexes (un serveur pour le freeplayer qui controle VLC, travail en cours)
sinon un semblant de script bash que j’utilise le plus c’est : for i in *; do …; done

Pour revenir à python j’y prends serieusement gout, c’est une joie de coder dans ce langage même si les debuts sont un peu laborieux ça semble quand même vachement plus intuitif que le shell.
Mais quand même, monter un serveur web, faire du regex et telnet en un script de quelques lignes en quelques heures par un grand debutant, ça poutre

bah justement je ne suis pas raciste ce topic a pour vocation de ne pas exclure les autres langages de scripts :slight_smile:
et si vous en avez en python bah :smiley: à vos souris

#! /bin/sh

LOGIN=sboube@brouette.com        
MDP=0123456789
HOST=adresse_de_mon_serveur...

function FAKE_ADD {
	#$1 est l'adresse locale
	RANDOM=$(date +%N)
	local ADD
	local i
	for i in $(seq 1 4); do
  local "NB$i"
  let "NB$i = $RANDOM >> 7"
  ADD="$ADD$((NB$i))."
	done
	ADD="${ADD%%.}"

	#une chance sur 2^32 de ne pas tomber sur la meme adresse...
	while [ "$ADD" == "$1" ]; do
  ADD=""
  for i in $(seq 1 4); do
  	let "NB$i = $RANDOM >> 7"
  	ADD="$ADD$((NB$i))."
  	echo "$i"
  done
  ADD="${ADD%%.}"
	done
	echo "$ADD"
}

function TEST_SVR {
	local REP
	REP=$(ping -c 1 -w 2 "$1" |
       grep "transmitted" |
       sed -e 's/\(.*\),\(.*\),\(.*\),\(.*\)/\1\2/g')
	if [ "$REP" == "1 packets transmitted 1 received" ]; then
  return 0
	else
  return 1
	fi
}

function MAJ_ADD {
	local REP
	local ERR
	local _HOST

	REP=$(curl -s "http://dynupdate.no-ip.com/dns?username=$LOGIN&password=$MDP&hostname=$HOST&ip=$1")
	ERR=$(echo $REP | sed -e 's/\(.*\):\([0-1]*\)/\2/g')
	_HOST=$(echo $REP | sed -e 's/\(.*\):\([0-9]*\)/\1/g')

	case $ERR in
  #pour les codes erreurs, voir [url=http://www.no-ip.com/integrate/response]http://www.no-ip.com/integrate/response[/url]
  0 ) echo "MAJ inutile $HOST pointe deja vers $1";;
  1 ) echo "MAJ achevee $HOST pointe maintenant vers $1";;
  2 ) echo "HOST invalide";;
  3 ) echo "MDP invalide";;
  4 ) echo "LOGIN invalide";;
  5 ) echo "Trop de requetes envoyees, MAJ bloquees pendant une heure";;
  6 ) echo "Compte bloque, cause violation de clause";;
  7 ) echo "ADRESSE IP invalide, $1";;
  8 ) echo "Hostname bloque";;
  9 ) echo "Hote configure comme lien vers un autre site...????";;
  99 ) echo "Client desactive";;
  * ) echo "Code erreur inconnu, valeur : $ERR";;
	esac
	
	#utile? pas sûr...
	if [ "$_HOST" != "$HOST" ]; then
  echo "ATTENTION $HOST != $_HOST, mauvaise redirection!"
  exit 2
	fi
}

#DEBUT PROG PRINCIPAL
echo -n "Test des serveurs : "
if TEST_SVR checkip.dyndns.org && TEST_SVR dynupdate.no-ip.com; then
	echo "Serveurs OK"

	OPTION=0
	LOCAL_ADDRESS=$(curl -s checkip.dyndns.org |
  	grep "Current IP Address: " |
  	sed -e 's/\(.*\): \([0-9]*\).\([0-9]*\).\([0-9]*\).\([0-9]*\)\(.*\)/\2.\3.\4.\5/g')

	while getopts ":lahft-:" opt; do
  case $opt in
  	l | t )	OPTION=1;;
  	a )     OPTION=2;;
  	f )	OPTION=3;;
  	h )	OPTION=4;;
  	? | - ) case $OPTARG in
    true | local ) OPTION=1;;
    address )      OPTION=2;;
    fake | false ) OPTION=3;;
    help | * )     OPTION=4;;
       esac;;
  esac
	done

	if [ $OPTION -eq 1  ]; then
  echo "adresse detectee : $LOCAL_ADDRESS"
  MAJ_ADD $LOCAL_ADDRESS
	fi
	if [ $OPTION -eq 2 ]; then
  #$2 contient dans ce cas l'adresse!
  echo "adresse transmise : $2"
  MAJ_ADD $2
	fi
	#option FAKE par defaut
	if  [ $OPTION -eq 3 ] || [ $OPTIND -lt 2 ]; then
  ADDRESS=$(FAKE_ADD $LOCAL_ADDRESS)
  echo "adresse creee : $ADDRESS"
  MAJ_ADD $ADDRESS
	fi
	if [ $OPTION -eq 4 ]; then
  echo "-a/--address X.X.X.X : forcer a une adresse precisee"
  echo "-l|t/--local/--true : forcer a l'adresse locale"
  echo "-h/--help : aide"
  echo "-f/--fake/--false et choix par default : casser le lien reel"
	fi
	exit 0
else
	echo "Serveur(s) DOWN, ABANDON"
	exit 1
fi

Bon, question à cent balles, que fait donc cette machine à café??? :ane: ben en fait c’est relatif à mon topic… celui-çi http://www.clubic.com/forum/index.php?showtopic=292763
Donc, voilà ça met l’adresse du site no-ip à jour, et ça permet de casser le lien pour les fanas de sécurité lorsqu’on en a plus besoin…! :wink:
Bon, vous me direz que mettre les login et mdp dans le code, y’a mieux côté sécurité… Mais, bon c’est un bon début, je pense…même si on aurait pu faire plus simple et moins usine à gaz je pense! :wink:

je peux proposer celui là aussi en trois parties, qui passe mes contacts d’un format thunderbird… vers le format vcf… c’est pour l’ipod :miam:

couper.sh (coupe le fichier .ldif avec tous les contacts en un contact par fichier, et les renomme contactIPODXXXX.ldif dans ce cas précis là…)


#! /usr/bin/awk -f

BEGIN {
	nbfiches = 0
	RS=""
	FILE = ""
}

{
	FILE = ENVIRON["LDIFAMILYNAME"] nbfiches ".ldif"
	print $0 > FILE
	nbfiches++
}

END {
	print "Nombre de fiches détectées = " nbfiches
}

voici proc.sh… il s’occupe de passer un fichier ldif en vcf… Restriction : ce fichier ldif ne doit contenir qu’un seul contact!!!


#! /bin/sh
#$1 represents the .ldif filename


if [ -n "$1" ]; then
	#works even if the filename has no extension
	FILE=${1%%.ldif}
	LDIFFILE="$FILE.ldif"
	VCFFILE="$FILE.vcf"

	#extraction of data from LDIFFILE
	FIRSTNAME=$(sed -e '/givenName: /!d;s/givenName: //g' < "$LDIFFILE")
	NAME=$(sed -e '/sn: /!d;s/sn: //g' < "$LDIFFILE")
	MOBILE=$(sed -e '/mobile: /!d;s/mobile: //g' < "$LDIFFILE")
	TEL=$(sed -e '/homePhone: /!d;s/homePhone: //g' < "$LDIFFILE")
	WORKTEL=$(sed -e '/telephoneNumber: /!d;s/telephoneNumber: //g' < "$LDIFFILE")
	MAIL=$(sed -e '/^mail: /!d;s/^mail: //g' < "$LDIFFILE")
	SECONDMAIL=$(sed -e '/^mozillaSecondEmail: /!d;s/^mozillaSecondEmail: //g' < "$LDIFFILE")
	ADDRESS=$(sed -e '/^homePostalAddress: /!d;s/^homePostalAddress: //g' < "$LDIFFILE")
	LOCALITY=$(sed -e '/^mozillaHomeLocalityName: /!d;s/^mozillaHomeLocalityName: //g' < "$LDIFFILE")
	ZIPCODE=$(sed -e '/^mozillaHomePostalCode: /!d;s/^mozillaHomePostalCode: //g' < "$LDIFFILE")

	#no NAME, no FIRSTNAME => invalid Vcard!
	if [ -z "$FIRSTNAME" ] && [ -z "$NAME" ]; then
  echo "[W] : Invalid FIRSTNAME & NAME in $LDIFFILE"
  awk '{print "[W] >> " $0}' < "$LDIFFILE"
  exit
	fi

	#construction of VCFFILE
	echo "begin:vcard" > "$VCFFILE"
	echo "version:3.0" >> "$VCFFILE"
	echo "n:$NAME $FIRSTNAME" >> "$VCFFILE"

	if [ -n "$MAIL" ]; then
  echo "url;type=work:$MAIL" >> "$VCFFILE"
	fi

	if [ -n "$MOBILE" ]; then
  echo "tel;type=cell:$MOBILE" >> "$VCFFILE"
	fi

	if [ -n "$TEL" ]; then
  echo "tel;type=home:$TEL" >> "$VCFFILE"
	fi

	#attention au cas particulier de note, une seule ligne est possible dans vcf
	#on va donc additionner les chaines...
	declare NOTE
	unset NOTE
	#SECONDMAIL WORKTEL NOTE sont à mettre dans note: ...
	if [ -n "$SECONDMAIL" ]; then
  NOTE="2nd mail: $SECONDMAIL "
	fi
	if [ -n "$WORKTEL" ]; then
  NOTE="$NOTE2nd tel: $WORKTEL"
	fi
	if [ -n "$NOTE" ]; then
  echo "note:$NOTE" >> "$VCFFILE"
	fi

	#si adresse valide... alors l'ajouter
	if [ -n "$ADDRESS" ] && [ -n "$ZIPCODE" ] && [ -n "$LOCALITY" ]; then
  echo "adr;type=home:;;$ADDRESS $ZIPCODE $LOCALITY" >> "$VCFFILE"
  echo "label;type=home:$ADDRESS $ZIPCODE $LOCALITY" >> "$VCFFILE"
	fi

	echo "end:vcard" >> "$VCFFILE"
fi

et ldif2vcf.sh… l’utilitaire général de conversion… :slight_smile:


#! /bin/sh
export LDIFAMILYNAME="contactIPOD"
declare FILE="$1"

if [ -n "$FILE" ] && [ "${FILE##*.}" == "ldif" ] || [ "${FILE##*.}" == "LDIF" ] && [ -e "$FILE" ]; then

	echo "DECOUPAGE DE $FILE..."
	couper.sh < "$FILE"


	for i in "$LDIFAMILYNAME"*.ldif; do

  echo "TRAITEMENT de $i..."
  proc.sh "$i"

  echo " \ DESTRUCTION de $i..."
  rm -f "$i"

	done
else
	echo "Syntaxe : ${0##*/} FILE.ldif"
fi

export -n LDIFAMILYNAME

Bon, je pense que c’est mieux, plus stable… et plus clair!!! :slight_smile:
En plus, j’avais oublié un cas que le programme précédent ne gerait pas… :bounce:
@+

ils sont sympas tes scripts CedeRhum :slight_smile:

Merci Swife ! :wink: :hello:
:bounce:
en tous les cas, je trouve ce topic intéréssant, et utile si on veut apprendre le bash ou se perfectionner!
Bonne idée swife!

j’avait oublier celui là, je m’en sert pour mater la TV avec mplayer donc :slight_smile:

#!/bin/sh
function tv () {
device="/dev/video0"
driver="v4l2"
norme="SECAM"
liste="france"
chaines="32-TF1,35-France_2,60-France_3,21-Canal_plus,38-Arte,63-M6"
taille=":width=768:height=576"
options="-vf kerndeint=:::1:1,scale=320:240"

mplayer tv:// -tv device=${device}:norm=${norme}:input=0:driver=${driver}:chanlist=${liste}:channels=${chaines}:${taille} ${options}
}

function webcam () {
mplayer tv:// -tv input=0:device=/dev/v4l/video1:driver=v4l:width=320:height=240 -vf scale=640:480,mirror
}

case $1 in
	wc)webcam;;
	tv)tv;;
	*)tv;;
esac

pour ceux que ça interesse, j’ai completé et corrigé l’utilitaire de conversion de ldif en vcf… voir plus haut! :slight_smile:
:pt1cable: en plus ça marche! :ane:
bye

Oh ils m’intéressent bien tes scripts Cederhum :oui:
Je testerai ça incessamment sous peu :slight_smile:

Si on fait des modifs aux utilitaires mis à dispo, on fait suivre? :hello:

je serais d’avis que oui
au contraire faite vous plaisir et participé :slight_smile:

Un petit script de conversion mp3 ou ogg


#!/bin/bash

# convertis des fichiers musicaux au format mp3 ou ogg
# argument 1 le format de convertion
# le script doit être dans le même répertoire que les fichiers à convertir

if [ $# -lt 1 ]; then
   echo -e "Usage: toconvert 'extention de convertion'\ntoconvert mp3"
   exit
fi

ext=$1

function toconvert () {
    
   if [ ! -f "$1" ]; then

     echo "Fichier $1 n'existe pas"
  
   else
   
    file=`echo $1 | cut -d '.' -f1` 
    mplayer -ao pcm:file="${file}.wav" "$1"
   
   if [ ${2} = "mp3" ]; then
      lame -h -b 192 "${file}.wav" "${file}.${2}"
   fi

    if [ ${2} = "ogg" ]; then
      oggenc "${file}.wav" -b 256 "${file}.${2}"
   fi

    rm -f "${file}.wav"

  fi

}

for file in *
do
 toconvert "$file" "$ext"
done
exit


UPDATE_contact.sh

#! /bin/sh
export LDIFAMILYNAME="contactIPOD"
export DETECTIONCARD="begin:vcard"
declare LDIFILE="$1"

#is $1 really LDIFILE?
if [ -n "$LDIFILE" ] && [ "${LDIFILE##*.}" == "ldif" ] || [ "${LDIFILE##*.}" == "LDIF" ] && [ -e "$LDIFILE" ]; then
	echo "$LDIFILE to be cut in $LDIFAMILYNAME[0-9].vcf, work in progress..."

	#translation from LDIF into VCF, in order to cut standard output in vcf files...
	#DETECTIONCARD is the pattern
	#converting into vcf stream | detection of VCF card, and writing 
	ldif2vcf2.sh < "$LDIFILE" | awk 'BEGIN{RS=ENVIRON["DETECTIONCARD"]; VCFILE=""} NF!=0{VCFILE = ENVIRON["LDIFAMILYNAME"] (NR-1) ".vcf"; print VCFILE " being created..."; print ENVIRON["DETECTIONCARD"] $0 > VCFILE }'

	if [ "$?" != "0" ]; then
  echo "An error occured, exiting..."
  exit 1
	fi
	echo "done!"
	exit 0
else
	echo "Syntax : `basename $0` FILE.ldif"
	echo "Beware not to share the same family name with old vcf files; no one precaution"
	echo "is taken, so files will be overwritten."
	echo "Beware of not using letters with accents..."
	exit 1
fi

export -n LDIFAMILYNAME
export -n DETECTIONCARD

ldif2vcf2.sh

#! /usr/bin/awk -f

#if newline = "+n" therefore, "\n" is added in the end of the line...
function PRINT(addedstring, newline) {
	ENTRY=ENTRY addedstring
	(newline == "+n")?ENTRY=ENTRY "\n":ENTRY}

function INIT_VAR() {
	DELETE=""
	ENTRY=""
	ZIPCODE=""
	CITY=""
	ADDRESS=""
	NOTE=""}

BEGIN{
	INIT_VAR()}

/objectclass: groupOfNames/ {DELETE="OK"}

/^cn:/ {if ( ! $2 ) {$2="NOFIRSTNAME"
       $3="NONAME"}
	#DELETE? I hesitated...if that's what you want, set DELETE to "OK"
	PRINT("begin:vcard\nversion:3.0\nn:" $2 ";" $3 ";;;\nfn:" $3 " " $2, "+n")}

/^xmozillanickname:/ {PRINT("nickname:" $2, "+n")}

/^mail:/ {PRINT("url;type=work:" $2, "+n")}

/^mozillaSecondEmail:/ {NOTE="2nd mail: "$2}

/^homePhone:/ {PRINT("tel;type=home:" $2, "+n")}

/^mobile:/ {PRINT("tel;type=cell:" $2, "+n")}

/homePostalAddress:/ {for ( i = 2; i<=NF; i++)
  ADDRESS = ADDRESS $i " "}

/mozillaHomeLocalityName:/ {for ( i = 2; i<=NF; i++)
  CITY = CITY $i " "}

/mozillaHomePostalCode:/ {for ( i = 2; i<=NF; i++)
  ZIPCODE = ZIPCODE $i " "}

#if NOTE not empty, so add "," in the end; else nothing's done!
/^custom1:/ {NOTE?NOTE=NOTE "; ":NOTE
	for ( i = 2; i<=NF; i++)
  NOTE = NOTE $i " "}

#End of the record...so:
(NF==0) {if ( ADDRESS && ZIPCODE && CITY ) {
  PRINT("adr;type=home:;;" ADDRESS ZIPCODE CITY, "+n")
  PRINT("label;type=home:" ADDRESS ZIPCODE CITY, "+n")}

	if ( NOTE ) {
  PRINT("note:" NOTE, "+n")}

	PRINT("end:vcard", "-n")
	
	if ( ! DELETE ) { #write on the standard output, the whole card...
  print ENTRY}

	INIT_VAR()} #prepare to start again...

END{exit 0}

… c’est super rapide!!! chez moi presque immediat pour une cinquantaine de fiches! (J’ai ajouté au passage la prise en compte des surnoms, et les noms apparaissent mieux dans la liste de contacts!)

changements substanciels!!! :slight_smile: