Bash: trucs et astuces : Différence entre versions

De TechWik
Aller à : navigation, rechercher
m
m
Ligne 51 : Ligne 51 :
 
     if [ ${var:=n} = "y" ]; then ...  
 
     if [ ${var:=n} = "y" ]; then ...  
 
     => affecte 'n' par défaut à $var.
 
     => 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 ===
 
=== variables de comportement ===
 
     set -u => sortie en erreur si variable unset. cf man bash, section 'builtin'
 
     set -u => sortie en erreur si variable unset. cf man bash, section 'builtin'

Version du 10 septembre 2016 à 22:45

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) si seulement 2 champs a séparer (ici separateur = ' ' )
   line="myhost 192.168.1.145"
   $ echo ${line% *}
   myhost
   $ echo ${line#* }
   192.168.1.145
 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'