Bash: trucs et astuces : Différence entre versions
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) | + | 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
Sommaire
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'