Bash
- http://www.gnu.org/software/bash/manual/bashref.html
- http://abs.traduc.org/abs-3.0-fr/
- http://cli.asyd.net/home/
sh -x script liste toutes les étapes du script
Expression "rationnelles"
. 1 caractère quelconque * 0+ caractère de la regexp qui précède [] regroupe un ensemble da caractères / caractère d'échapemment des caractères spéciaux ^ correspond à une ligne si la chaîne est située au début $ en fin de ligne {} nombre d'occurences
Variables
Affectation directe : variable=valeur
read : prend la ligne suivante de l'entrée et l'assigne à une variable
Substitution de la sortie d'une commande : variable=`commande`
Paramètres de la ligne de commande ($0, $1, $2, ...)
$# = nombre de paramètres (naturellement modifié par shift)
$* = tous les paramètres (utilisé avec shift permet de récupérer la fin)
$?Le statut de sortie d'une commande est représenté par la variable $?
$$ est le n° de processus
local a; définit une variable locale a
${variable:-defaut} équivaut à variable si elle est définie, défaut sinon.
$(date +%Y%m%d)
1 fd pour stdout
2 fd pour stderr
grep da * 1>&2 stdout -> stderr
${variable#motif} est remplacé par la valeur de la variable de laquelle on ôte la chaîne initiale la plus courte qui corresponde au motif.
${variable##motif} sert à éliminer le plus long préfixe correspondant au motif transmis
${#string} : longueur de la variable string
Tableaux
Arrive avec bash2
${tableau[$n]} #c'est la valeur n du tableau
${tableau[*]} et ${table[@]} = liste de ts les membres du tableau
${#tableau[$n]} = longueur de la valeur n
${#tableau[@]}= nombre de membre
Structures de contrôle
case
case $var in var1) commande1; commmande2;; var2) commande;; *) commande;; esac
if
if [ ];then else elif [ ];then fi
if [ ] ; then => non if [ 0 ] ; then => oui
Pour le script suivant $DEBUG=1 => debug $DEBUG=0 => no_debug
if [ "$DEBUG" = "1" ] ; then echo "debug" else echo "no_debug" fi
for
for i in quelque*chose ;do prog($i) done
for i in $( ls ) ;do for i in `seq 1 10`;
while
while do done
while [ $counter -lt 10 ]; do let counter=counter+1 done
test
# fichiers (OK si) valeurs numériques (à mettre entre valeurs) -f existe + ordinaire -e = -d répertoire -ne != -r existe + lisible -ge >= -s existe + non vide -gt > -w existe + modifiable -le <= -x existe + exécutable -lt <
[ -z ${home_size[$uid]} ] && home_size[$uid]=0
Si la valeur n'existe pas, elle est mise à 0.
fonctions
function nom_fonction { code }
inclusion de fichier
. nom_fichier
commandes
read FN LN
echo $FN $LN
sed
http://sed.sourceforge.net/sed1line.txt
$>sed -i 's/to_be_replaced/replaced/g' /tmp/dummy # -i permet d'effectuer le changement ds le fichier, sinon l'affiche
$>sed s/'\\'/'\/'/g fichier.txt pour remplacer les \\ par des //
cat /etc/mysusar/hosts/home.conf | sed -n -e 's/^hostname \(.*\)/\1/p'
sed '/DPT=138/d' /var/log/gw/2005/02/26/firewall.log supprime les lignes avec le port 138
sed '/DPT=138/!d' /var/log/gw/2005/02/26/firewall.log supprime les lignes ss le port 138
awk
(cf paragraphe correspondant à la fin)
grep
http://pegasus.rutgers.edu/~elflord/unix/grep.html
grep "test de grep" /tmp/dummy -c donne le nombre d'occurences grep -v "xxxx" /tmp/dummmy affiche les lignes qui ne contiennent pas xxxxxx grep "alpha\|beta" fichier.text (recherche alpha ou beta)
getopts
getopts optstring name [args] while getopts "abc:d:";do case $option in a) b) c) var="$OPTARG";; esac done
cut
mail_size[$uid]=$(echo $i | cut -d ":" -f 2)
wc
(compte lignes, mots et octets)
tr
echo \"test\" | tr -d '"' pour supprimer les "
sort
sort +4 -r -n -t ":" /tmp/balsize2.$$ ps -e -o comm,rss,bsdtime | awk '{print $1":"$2":"$3}' | awk -F ":" '{print $1":"$2":"$3*60+$4}' | sort -k 3 -r -n -t ":"
bc
(permet des calculs mathématiques)
bc -l permet de faire des calculs avec des réels scale précise le nombre de décimales echo "scale=2;`commande`*3" | bc -l
expr
(calculs simple)
`expr $val1 + $val2` voir aussi $(( ))
tput
(initialise un terminal ou requête dans une base terminfo)
wc
donne le nombre de mots, lignes et caractères dans un fichier
args
transforme des données arrivant dans un flux du type pipeline en information sur une ligne de commande
#>find . -name '*.c' | xargs grep ipv6_getsockopt
copier le fichier zina_category dans tous les repertoires
#>find -type d -print0 | xargs -0 -i -t cp zina_category {}
tee
lit les données sur son entrée standard et les copies sur sa sortie standard, tout en envoyant une copie supplémentaire dans tous les fichiers dont le nom lui est fourni en argument.
permet de sonder le passage de données dans un pipeline.
#>commmande1 > tee /dev/tty | commande2 > capture
shift
trap & kill
réception et envoi de signaux
awk
script constitué de lignes de la forme motif { action } motif => expression rationnelle ex: $1~/tcp/ (tcp ds le 1er champ de la ligne) action => print,printf
Tableaux tableau associatif t["un"]=1 - fonction delete permet de supprimer élément du tableau tableau multidimensionnel => astuce SUBSEP t[i,j]=3
Structures de contrôle if (condition) { } else if () { } else {}
while (condition){} for (i=0;i<max;i++){} $>awk '/test/ {print}' /tmp/dummy quand awk trouve 'test' il exécute 'print' $>awk '/test/ {i=i+1} END {print i}' /tmp/dummy $>ls -al $file | awk '{print $3}' # donne les utilisateurs d'une liste de fichiers exemple avec awk -F délimiteur (ici :) for i in $(cat /etc/passwd | awk -F : '{print $1 ":" $3}');do
uid=$(echo $i | cut -d ":" -f 2) ... done Pour récupérer le uptime d'une machine via snmp $>snmpget -v 1 -Oqn -c public 127.0.0.1 .1.3.6.1.2.1.25.1.1.0 | awk '{print $2};' | awk -F ":" '{printf "%.2f",$1+$2/24+$3/1440 };'
Exemples
Vérification du montage
- !/bin/bash
mount /mnt/DNS-320
res="off"; res=`mount | grep DNS-320 | cut -d " " -f 2`; if [ "$res" = "on" ]; then
echo "DNS-320 ON" rsync -rvv --size-only /home/chris/Musique/* /mnt/DNS-320/Musique/ | grep -v uptodate rsync -rvv --size-only /home/chris/Videos/films/* /mnt/DNS-320/films/ | grep -v uptodate rsync -rvv --size-only /home/chris/Photos/* /mnt/DNS-320/Photos/ | grep -v uptodate umount /mnt/DNS-320
else
echo "DNS-320 OFF"
fi
Copyright
© 2007-2012 Christophe de Livois
Vous avez l'autorisation de copier, distribuer et/ou modifier ce document suivant les termes de la GNU Free Documentation License, Version 1.2 ou n'importe quelle version ultérieure publiée par la Free Software Foundation; sans section invariante, sans page de garde, sans entête et sans page finale. Pour plus d'informations consulter le site de l'APRIL. |