Bash : Bourne-again shell


Pour les curieux ...

Hello World

echo Hello World !
---
echo -n Hello
echo World !
---
MSG="Hello World"
echo $MSG
---
MSG1="Hello"
MSG2="World !"
echo $MSG1 $MSG2

Shebang

Spécifier quel interpréteur utiliser
#!/bin/bash
et, pour rendre le fichier exécutable
chmod a+x mon_script.sh
l'exécution
./mon_script.sh

Un script de backup

#!/bin/bash
tar -zcvf ~/backup-$(date +'%d-%m-%Y').tar.gz /un_dossier/
Nous aurons alors un fichier back-11-11-2006.tar.gz dans notre dossier personnel

Redirection1

ps aux | grep bash > opened_shell.txt

Redirection 2

Il existe 3 descripteurs d'entrée sortie sous *NIX
# on ne veut pas de stderr
./programme 2>/dev/null 
#stdout et stderr affichées, et dans logs.txt
#tee redirige dans un fichier
#et affiche sur la sortie standard
./programme 2>&1 | tee logs.txt

Pipe

grep $USER /etc/passwd | sed 's/:/, /g'

Blocs conditionnels

if [ -f un_fichier ]; then
	echo un_fichier existe;
fi
if [ 3 -lt $VAR ]; then
	echo $VAR plus grand que 3;
else
	echo $VAR plus petit que 3;
fi

Boucle

CPT=0
while [ $CPT -lt 10 ]; do
	echo $CPT
	let CPT+=1
done
Trivial

EX1 : Nombre de connectés

ps h -aef|awk '{print $1}' | sort | \
uniq -c | awk '{print $2" has "$1" process"}'

EX2 : Utilisateurs d'un groupe

echo -n "GROUP: "
read GROUP
echo "`ps h -f -G $GROUP | awk '{print $1}' | \ 
 sort -u | wc -l` user(s) of grp $GROUP connected"

EX3 : Ajouter "foobar" au .bash_login des users bash

for i in `grep '/bin/bash$' /etc/passwd | \ 
 cut -d: -f6`; do echo "echo foobar" >> "$i/.bash_login";
done

EX4 : Trouver et lister les fichiers de plus de 20k

find / -size +20k -exec ls -l {} \;

EX5 : Trouver les dossiers mails d'anciens utilisateurs

for i in /var/mail/*;
do grep -q `basename $i` /etc/passwd;
  if [ $? -eq 1 ];
  then 
    echo `basename $i`;
  fi;
done