Bash

De wikilivois
Sauter à la navigation Sauter à la recherche


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

  1. !/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

Tête de GNU 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.