Bash: trucs et astuces : Différence entre versions

De TechWik
Aller à : navigation, rechercher
m
m (manipuler des chaines de caractères)
Ligne 32 : Ligne 32 :
 
     IFS=$OIFS    # restituer le séparateur originel
 
     IFS=$OIFS    # restituer le séparateur originel
  
   2) si seulement 2 champs a séparer (ici separateur = ' ' )
+
   2) récupérer le début ou la fin (ici separateur = ' ' )
     line="myhost 192.168.1.145"
+
     line="myhost 192.168.1.145 abcdefg 123456"
 +
 
 +
    # enlever le dernier champ
 
     $ echo ${line% *}
 
     $ echo ${line% *}
 +
    myhost 192.168.1.145 abcdefg
 +
 +
    # conserver le premier champ
 +
    $ echo ${line%% *}
 
     myhost
 
     myhost
 +
 +
    # enlever le premier champ
 
     $ echo ${line#* }
 
     $ echo ${line#* }
     192.168.1.145
+
     192.168.1.145 abcdefg 123456
 +
 
 +
    # conserver le dernier champ
 +
    $ echo ${line##* }
 +
    123456
  
 
   3) affecter les différents termes d'une ligne (cf IFS) à un tableau
 
   3) affecter les différents termes d'une ligne (cf IFS) à un tableau

Version du 9 janvier 2017 à 18:26

Fonctions utiles

Conversions

 # conversion  netmask => cidr
 # ex: mask2cidr 255.255.128.0 --> 17
 # suppose qu'il n'y a plus de "255." après un octet non-255
 mask2cidr ()
 {
   local x=${1##*255.}
   set -- 0^^^128^192^224^240^248^252^254^ $(( (${#1} - ${#x})*2 )) ${x%%.*}
   x=${1%%$3*}
   echo $(( $2 + (${#x}/4) ))
 }
 # conversion cidr => netmask 
 # ex: cidr2mask 17 --> 255.255.128.0
 cidr2mask ()
 {
   set -- $(( 5 - ($1 / 8) )) 255 255 255 255 $(( (255 << (8 - ($1 % 8))) & 255 )) 0 0 0
   [ $1 -gt 1 ] && shift $1 || shift
   echo ${1-0}.${2-0}.${3-0}.${4-0}
 }

manipuler des chaines de caractères

 # split chaine de caracteres:
 1)IFS:
   OIFS=$IFS
   string="ABCDE-123456"
   IFS=- # use "local IFS=-" inside the function
   set $string
   echo $1 # >>> ABCDE
   echo $2 # >>> 123456
   IFS=$OIFS     # restituer le séparateur originel
 2) récupérer le début ou la fin (ici separateur = ' ' )
   line="myhost 192.168.1.145 abcdefg 123456"
   # enlever le dernier champ
   $ echo ${line% *}
   myhost 192.168.1.145 abcdefg
   # conserver le premier champ
   $ echo ${line%% *}
   myhost
   # enlever le premier champ
   $ echo ${line#* }
   192.168.1.145 abcdefg 123456
   # conserver le dernier champ
   $ echo ${line##* }
   123456
 3) affecter les différents termes d'une ligne (cf IFS) à un tableau
   line="myhost 192.168.1.145 is a good host"
   $ termes=($line)
   $ echo ${termes[0]}
   myhost
   $ echo ${termes[4]}
   good

manipuler des variables

 # variable avec valeur par defaut
   if [ ${var:=n} = "y" ]; then ... 
   => affecte 'n' par défaut à $var.

manipuler les lignes d'un fichier: exemple conversion d'un dossier mp3 => wav

 # chercher lister les fichiers mp3 
 find . -name "*.mp3"  > /tmp/lst
 # lire la liste dans un tableau (1 enregistrement par ligne)
 IFS=$'\n' read -d  -r -a files < /tmp/lst
 while [ $i -lt ${#files[@]} ]; do
   fout=` echo ${files[$i]} | sed "s/.mp3/.wav/"`; 
   lame --decode "${files[$i]}" "../wav/$fout";
   let i=i+1;
 done

variables de comportement

   set -u => sortie en erreur si variable unset. cf man bash, section 'builtin'