lundi 12 juillet 2010

bash: element de script for / sed / while /case

Voici un super site qui explique tout !!!

Voici, un petit script bash , permettant de faire des "svn move" en ne selectionnant que des fichiers différents de *.java et des revisions svn-base

a noter set -x pour aider au debug su script

et la commande find avec regex

Attention, lors de l'utilisation de regex, il est nécessaire d'ajouter le path courant ... comme suit :

find /home/enwoo -regex '.*/*.java'

Voici, le script complet :


function mvResourcesNotJava()
{
set -x
ORI_REP="$1"
DEST_REP="$2"

if [[ ( -e "$ORI_REP" ) ]]
then
#copie de toutes les resources differentes de java, .cvsignore, pom.xml, .svn-base
files=`find "$ORI_REP" \( ! \( -regex '.*/*.svn-base' -o -regex '.*/*.java' -o -regex '.*/.svn.*' -o -regex '.*/*.cvsignore' -o -regex 'pom.xml' \) \) -type f`

for file in ${files}
do
# creation si besoin
if [ ! -e "$DEST_REP" ]
then
addDirInConf "$DEST_REP" "$DEST_REP/.."
fi
# copie de la ressources
svn mv "${file}" "${DEST_REP}"
done
# ajout en gest conf
svn add --force "${DEST_REP}"
svn commit "${DEST_REP}" --message "deplacement de ressources pour maven"
else
echo "les repertoires [$1] n'existe pas"
fi
}



Un autre exemple, ou cette fois on parcours un fichier ligne par ligne ... afin d'utiliser les lignes dans un for


#!/bin/bash

dos2unix liste.txt
STR_REMP=$STR_REMP
SRC_DIR=`echo "$1" | sed -e "s@D:@$STR_REMP@g"`
DST_DIR=`echo "$2" | sed -e "s@D:@$STR_REMP@g"`
if [ "$#" -ne 2 ]
then
echo "le nombre de parametres doit etre egale a 2"
echo "copie les fichiers entre 2 arborescences identiques, via cygwin "
echo "usage : "
echo "ex : $0 D:/ArchCvs/V9 D:/ArchCvs/java"
exit -1
fi

if [[ ! ( -e "$SRC_DIR" || -e "$DST_DIR" ) ]]
then
echo "l'un des repertoires suivants n'existe pas"
echo "$SRC_DIR"
echo "$DST_DIR"
else
while read line
do
#set -x
line=`echo "$line" | sed -e "s@D:@$STR_REMP@g"`
FILE_DST=`echo "$line" | sed -e "s@$SRC_DIR@$DST_DIR@g"`
FILE_DST=`dirname $FILE_DST`
cp -fv $line $FILE_DST
done < liste.txt
exit 0
fi


Voici, un autre exemple tiré de la commande mkdir de cygwin

#!/bin/sh
##
## mkdir.sh -- make directory hierarchy
##
## Based on `mkinstalldirs' from Noah Friedman
## as of 1994-03-25, which was placed in the Public Domain.
## Cleaned up for Apache's Autoconf-style Interface (APACI)
## by Ralf S. Engelschall
##
#
# This script falls under the Apache License.
# See http://www.apache.org/docs/LICENSE


umask 022
errstatus=0
for file in ${1+"$@"} ; do
set fnord `echo ":$file" |\
sed -e 's/^:\//%/' -e 's/^://' -e 's/\// /g' -e 's/^%/\//'`
shift
pathcomp=
for d in ${1+"$@"}; do
pathcomp="$pathcomp$d"
case "$pathcomp" in
-* ) pathcomp=./$pathcomp ;;
?: ) pathcomp="$pathcomp/"
continue ;;
esac
if test ! -d "$pathcomp"; then
echo "mkdir $pathcomp" 1>&2
mkdir "$pathcomp" || errstatus=$?
fi
pathcomp="$pathcomp/"
done
done
exit $errstatus


Voici un petit rappel, des paramètres spéciaux :


$0 Contient le nom du script tel qu'il a été invoqué
$* L'ensembles des paramètres sous la forme d'un seul argument
$@ L'ensemble des arguments, un argument par paramètre
$# Le nombre de paramètres passés au script
$? Le code retour de la dernière commande
$$ Le PID su shell qui exécute le script
$! Le PID du dernier processus lancé en arrière-plan


et les différents tests possibles (ici, un très bon cours):

Opérateur Description Exemple
Opérateurs sur des fichiers
-e filename vrai si filename existe [ -e /etc/shadow ]
-d filename vrai si filename est un répertoire [ -d /tmp/trash ]
-f filename vrai si filename est un fichier ordinaire [ -f /tmp/glop ]
-L filename vrai si filename est un lien symbolique [ -L /home ]
-r filename vrai si filename est lisible (r) [ -r /boot/vmlinuz ]
-w filename vrai si filename est modifiable (w) [ -w /var/log ]
-x filename vrai si filename est exécutable (x) [ -x /sbin/halt ]
file1 -nt file2 vrai si file1 plus récent que file2 [ /tmp/foo -nt /tmp/bar ]
file1 -ot file2 vrai si file1 plus ancien que file2 [ /tmp/foo -ot /tmp/bar ]
Opérateurs sur les chaînes
-z chaine vrai si la chaine est vide [ -z "$VAR" ]
-n chaine vrai si la chaine est non vide [ -n "$VAR" ]
chaine1 = chaine2 vrai si les deux chaînes sont égales [ "$VAR" = "totoro" ]
chaine1 != chaine2 vrai si les deux chaînes sont différentes [ "$VAR" != "tonari" ]
Opérateurs de comparaison numérique
num1 -eq num2 égalité [ $nombre -eq 27 ]
num1 -ne num2 inégalité [ $nombre -ne 27 ]
num1 -lt num2 inférieur ( < ) [ $nombre -lt 27 ]
num1 -le num2 inférieur ou égal ( < =) [ $nombre -le 27 ]
num1 -gt num2 supérieur ( > ) [ $nombre -gt 27 ]
num1 -ge num2 supérieur ou égal ( > =) [ $nombre -ge 27 ]


Rappel des commandes sed utiles :


sed -e 's/enwoo/toto/' => remplacement de la première occurence de enwoo par toto
sed -e 's/enwoo/toto/g' => remplacement de toutes les occurences de enwoo par toto
sed -e 's/enwoo/toto/3' => remplacement de la 3ième occurence de enwoo par toto
sed -e 's@enwoo@toto@3' => remplacement de la 3ième occurence de enwoo par toto mais le séparateur est @ et pas slash (ce qui est très utile lorsque l'on veut remplacer des chemins)


un exemple avec une sortie dans un fichier des remplacements de enwoo par toto (avec w):

echo 'http://monServeurSvn/svn/projetTest/java/com/enwoo' | sed -e 's@enwoo@toto@w res.txt'


on peut combiner les flags :
echo 'http://monServeurSvn/svn/projetTest/java/enwoo/com/enwoo' | sed -e 's@enwoo@toto@gw res.txt'

ce qui donne :
http://monServeurSvn/svn/projetTest/java/toto/com/toto

ou encore :
echo 'http://monServeurSvn/svn/projetTest/java/enwoo/com/enwoo' | sed -e 's@enwoo@toto@2w res.txt'
http://monServeurSvn/svn/projetTest/java/enwoo/com/toto


Une autre commandes utile, la suppression :
sed "/toto/d" monFichier => supprime les lignes contenant enwoo

sed "/toto/!d" monFichier => supprime les lignes ne contenant pas enwoo

Aucun commentaire:

Enregistrer un commentaire