Table des matières
Bash
Lien:
Les bases
Un scripte Bash devient executable si on en première ligne:
#!/bin/sh
ou
#!/bin/bash
et qu'on fait:
$ bash mon_scripte.sh
ou
$ chmod a+x mon_scripte.sh $ ./mon_scripte.sh
Variables
Declarer
Syntaxe: variable=chaine
IFACE=eth0 COMMENT="Interface reseau" echo $COMMENT $IFACE
Ou pour eviter les ambuiguités:
echo ${COMMENT} ${IFACE}
Sortie:
Interface reseau eth0
Extraire sous-chaine
Syntaxe: ${variable:debut:longueur}
COMMENT="Interface reseau" echo ${COMMENT:10} echo ${COMMENT:5:4}
Sortie:
reseau face
Motif
* | n'importe quelle _chaine_ de caracteres |
? | n'importe quelle caractere |
[] | liste de caractère |
\* pour * ou \? pour ? ou \\
pour \
Elimination du début (préfixe)
Le plus petit:
Syntaxe: ${variable#motif}
echo ${COMMENT#Inter} echo ${COMMENT#*a} echo ${COMMENT#???e} echo ${COMMENT#[A-Z][a-z]} echo ${COMMENT}
Sortie:
face reseau ce reseau rface reseau terface reseau Interface reseau
Le plus long: Syntaxe: ${variable##motif}
echo ${COMMENT##*a}
Sortie:
u
redirection
Lien: http://doc.async.com.br/abs-0.3/HTML/io-redirection.html
Lire , line a line, la sortie (stdout) d'une commande:
digitemp_DS2490 -q -t 0 -o 2 | while read line; do echo "> $line" done
regex
#!/bin/sh ARG="$1" if [[ "$ARG" =~ "^([[:alnum:]]*)=([[:digit:]]*)$" ]]; then echo "${BASH_REMATCH[1]}" echo "${BASH_REMATCH[2]}" fi
Avec gnu bash ⇐ 3.1, test:
$ ./t option=1234 option 1234
Le problème, sous Lenny, ca ne fonctionnera plus a cause des “quote”… il faut les virer.
Quand ce n'est pas possible (a cause des espaces par exemple), il faut mettre le regex dans une variable.
Donc, ecrire sans “quote” :
... if [[ "$ARG" =~ ^([[:alnum:]]*)=([[:digit:]]*)$ ]]; then ...
$ sh --version GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu) Copyright (C) 2007 Free Software Foundation, Inc.
Delimiteurs
Lien: http://www.debianadmin.com/delimiters-in-bash.html
Exemple:
#!/bin/sh cat /etc/passwd | while read line; do IFS=":" read username pass auid agid agroup ahome ashell <<EOF $line EOF echo "username=" $username echo "ashell=" $ashell done unset IFS
#!/bin/sh
IFS=":" read first_name last_name <<< "$( echo 'hello:ducon' )" echo "1: $first_name" echo "2: $last_name" unset IFS
Output du dernier exemple:
1: hello 2: ducon
LOCK
Realiser un LOCK sur un scripte…
Lien: http://bash-hackers.org/wiki/doku.php/howto/mutex
Pour resumer: la seule solution portable est d'utiliser “mkdir”
Voir aussi “trap” pour supprimer le “lock”
TRAP
Comment traper les signaux, ou simplement la sortie du script…
awk
/etc/passwd
cat /etc/passwd | awk -F':' '{ printf("%s => %s uid:%s\n", $7, $1 , $3 ) }'