Bloc-Notes sur BASH
- v1 - Ajout des expressions régulières (2008-07-30 13:50)
Lecture d'un fichier ligne à lignes
Pour lire un fichier provenant de l'entrée standard :
while read line;
do
echo "une ligne : $line"
done
Maintenant, la commande while/done est un bloc de code, vous vous souvenez. Donc il est possible de l'utiliser comme une commande de manière un peu plus intéressante.
cat fichier_source.txt
| {
while read line;
do
echo "une ligne : $line"
done } | grep "une_chaîne" > fichier_resultat.txt
Mes accolades ne servent ici à rien, c'est juste pour rendre le code un peu plus clair.
Définition d'un tableau
tableau
[1]=
"un"
tableau
[2]=
"deux"
for i
in `seq ${#tableau[@]}` ;
do
echo "${tableau[$i]}"
done
Expression régulières
Pour matcher des expression régulières, il n'est absolument pas nécessaire de passer systématiquement par awk ou perl, le code suivant marche très bien :
line="hello(ceci est un message bien sympa)"
if [[ $line =~ hello\((.*)\) ]] ; then
echo "Phrase complète : '$BASH_REMATCH'"
echo "Le premier groupe matché : '${BASH_REMATCH[1]}'"
fi
Les codes
$? ......... code de retour de la dernière commande
$! ......... PID de la dernière commande
$# ......... Nombre d'arguments passé au script
$1 $2 etc... Un paramètre passé par l'appelant
$* ......... L'ensemble des arguments passé par l'appelant
$@ ......... La même chose mais chaque paramètre est entre double quotes
$0 ......... Le nom et chemin (non développé) invoqué par l'appelant
$$ ......... PID du script lui-même
Référencement indirect
L'idée est de pouvoir atteindre le contenu d'un variable, par exempte MA_VARIABLE, non pas de manière directe, mais à travers la lecture du contenu d'une autre variable qui contient son nom :
MA_VARIABLE=12
echo "Accès directe : $MA_VARIABLE"
NOM_DE_MA_VARIABLE=MA_VARIABLE
echo "Accès indirecte : ${!NOM_DE_MA_VARIABLE}"
Conditions
-d si le répertoire existe
-e si le fichier existe
-f si le fichier (pas un répertoire ou fichier de périphérique: /dev/sda1...)
-r si le fichier peut être lu
-w si le fichier peut être écrit
-x si le fichier peut être exécuté
-L si le fichier est un lien symbolique
-z si la chaine de caractère est nulle
-n si la chaine de caractère n'est pas nulle
-eq s'ils sont équivalents (nombre)
-neq s'ils ne sont pas équivalents
= ou == si les chaines de caractère ou nombre sont égaux
!= s'ils ne sont pas égaux
-lt est plus petit que
-gt est plus grand que
-le est plus petit ou égale
-ge est plus grand ou égale
-a ou && est plus grand ou égale
-o ou || est plus grand ou égale
Debuggage
Pour debugger un programme bash il faut juste le lancer ainsi
Connaître le fichier réel qui se cache derrière un lien symbolique
> un_fichier
ln -s un_fichier un_lien
echo $
(readlink -nf un_lien
)
un_fichier
Taille d'une chaîne
La base, commaître la longueur d'une chaîne :
chaine="hello les amis"
echo "longueur:${#string}"
Splitter une chaîne selon un caractère unique
Cas classique, splitter le nom et la valeur d'une chain variable=valeur :
paire="variable=valeur"
echo "Le nom est : ${paire%=*}"
echo "La valeur est : ${paire#*=}"
Télécharger et décompressser en une seule passe
wget http:
//ftp.drupal.org
/files
/projects
/skymod
-5.x
-1.x-dev.
tar.gz -O -
| tar -zxv
Remplacement d'une chaîne par une autre
target=${file/.svgz/.svg.gz}
Poster un nouveau commentaire