Structures de contrôle

If

NOP

Expressions booléennes

exit status

Commande test

Crochets

Chaîner les tests

Grouper des commandes

Doubles crochets

true et false

Doubles parentheses


Condition ternaire

Switch

Permet d’exécuter un bloc de code uniquement lorsque la valeur d’une variable correspond à un motif donné.

case $1 in
  "Chien" | "Chat" | "Souris")
    echo "C'est un animal"
    ;;
  "Bob")
    echo "C'est Bob"
    ;;
  *)
    echo "Je ne sais pas ce que c'est"
    ;;
esac
case $var in
  [0-9]*)
    echo "$var est un nombre."
    ;;
  [a-zA-Z]*)
    echo "$var est un mot."
    ;;
  *)
    echo "$var n'est ni un nombre ni un mot."
    ;;
esac
#!/bin/sh -
option="$1"
fichier="$2"

case $option in
  -d) [ -d $fichier ] &&
    echo "Repertoire: ’$fichier’";;
  -f) [ -f $fichier ] &&
    echo "Fichier: ’$fichier’";;
  -x) [ -x $fichier ] &&
    echo "Executable: ’$fichier’";;
  [*])
    echo "Un *";;
  *)
    echo "Option non traitee"
  exit 1;;
esac

test

Chaîne de caractères

[ -z STRING ]Vide (longueur zéro)
[ -n STRING ]Non vide (longueur non zéro)
[ STRING1 = STRING2 ]Égalité
[ STRING1 != STRING2 ]Non égalité
[ STRING1 < STRING2 ]Dans un tri alphabétique, STRING1 vient avant STRING2
[ STRING1 > STRING2 ]Dans un tri alphabétique, STRING1 vient après STRING2
$ empty=""
$ var="value"

$ [ -z "$undefined" ] && echo "yes" || echo "no"
yes
$ [ -z "$empty" ] && echo "yes" || echo "no"
yes
$ [ -z "$var" ] && echo "yes" || echo "no"
no

$ [ -n "$undefined" ] && echo "yes" || echo "no"
no
$ [ -n "$empty" ] && echo "yes" || echo "no"
no
$ [ -n "$var" ] && echo "yes" || echo "no"
yes
if [ -n "$1" ]; then
  if [ ! -r "$1" ]; then
    echo "Could not read file \"$1\"" >&2
    exit 1
  fi
  echo "Input from file \"$1\""
else
  echo "Input from stdin"
fi

Fichiers

[ -e "/home/$USER" ]Existe
[ -d "/etc" ]Est un répertoire
[ -f "/etc/passwd" ]Est un fichier régulier
[ -h "/bin/sh" ]Est un lien symbolique
[ -b "/dev/sda2" ]Est un périphérique de type bloc
[ -c "/dev/ttyS1" ]Est un périphérique de type caractère
[ -p "/dev/fd/0" ]Est un périphérique de type pipe
[ -S "/var/run/docker.sock" ]Est un socket
[ -x FILE ]Est executable
[ -r FILE ]Est accessible en lecture
[ -w FILE ]Est accessible en écriture
[ -s FILE ]Taille > 0 octets
[ -g FILE ]A le flag setgid
[ -u FILE ]A le flag setuid
[ -k FILE ]A le flag sticky bit
[ FILE1 -nt FILE2 ]1 est plus récent que 2 (newer than)
[ FILE1 -ot FILE2 ]1 est plus ancien que 2 (older than)
[ FILE1 -ef FILE2 ]Même fichier (equal file)
[ -N FILE ]A une date d'accès inférieure ou égale à la date de modification
[ -U FILE ]L'utilisateur en cours est propriétaire du fichier
[ -G FILE ]L'utilisateur en cours fait partie du groupe propriétaire du fichier
# Vérifier si file1.txt existe
if [ -e file1.txt ]; then
  echo "File exists"
fi
$ touch test1 test2
$ [ test1 -ef test2 ] && echo "yes" || echo "no"
no
# test3 est un lien symbolique vers test1 = même fichier
$ ln -s test1 test3
$ [ test1 -ef test3 ] && echo "yes" || echo "no"
yes
$ touch test
# Juste crée: accès < modification
$ [ -N test ] && echo "yes" || echo "no"
yes
$
# Juste lu: accès < modification
$ cat test
$ [ -N test ] && echo "yes" || echo "no"
yes
$
# Juste modifié: accès < modification
$ echo "Hello World" > test
$ [ -N test ] && echo "yes" || echo "no"
yes
$
# Date d'accès modifiée: accès > modification
$ touch -a test
$ [ -N test ] && echo "yes" || echo "no"
no
$
# Date de création modifiée: accès < modification
$ touch test
$ [ -N test ] && echo "yes" || echo "no"
yes

Arithmétique

[ NUM -eq NUM ]Égalité
[ NUM -ne NUM ]Non égalité
[ NUM -lt NUM ]Inférieur à
[ NUM -le NUM ]Inférieur ou égal à
[ NUM -gt NUM ]Supérieur à
[ NUM -ge NUM ]Supérieur ou égal à
ls -d /nop

if [ $? -eq 0 ]; then
  echo "Last command succeeded"
else
  echo "Last command failed"
fi

Logique

[ ! EXPR ]Non
[ EXPR1 -a EXPR2 ]Et
[ EXPR1 -o EXPR2 ]Ou
if [ -f "/usr/bin/netscape" -a -f "/usr/share/doc/HTML/index.html" ]; then
  netscape /usr/share/doc/HTML/index.html &
fi