Sysop.Fr
Catégories

apache

awk

bash

charmap

date

echo

encoding

find

grep

hexdump

irc

iso3166

ls

mysql

od

openssh

printf

python

read

sed

seq

smpp

sort/uniq

tar

tr

ucp

Articles

bash - varibales, test et conditions

1. Variables prépositionnées

$$PID du processus Shell en cours
$?code retour de la dernière commande
${#chaine}taille de la variable $chaine
$@tous les arguments vus comme des chaines séparés
$#nombre d'arguments sur la ligne de commande ou de paramètres de position
$0, $1, $2, etcparamètres de positions, passés à partir de la ligne de commande à un script, passés à une fonction, ou initialisés (set) à une variable
$0 est le nom du script lui-même.
$!identifiant du processus (PID) du dernier job ayant fonctionné en tâche de fond
${u:0:10}sous-chaine de la variable u à partir de l'offset 0 pour une longueur de 10
"$IFS"(Internal Field Separator) est une variable (obligatoirement être placées entre guillemets) spéciale définissant le "séparateur par défaut",
c'est à dire le(s) caractère(s) utilisé(s) pour délimiter les mots dans une chaîne de caractères.
Par défaut, ce séparateur est initialisé à <espace><tabulation><nouvelle ligne>

2. Utilisation les variables

Pour déclarer la variable globale var et lui affecter la valeur 1:
var=1

Pour déclarer la variable locale loc_var et lui affecter la valeur 123:
local loc_var=123

Pour déclarer les variables locales loc_var_name et loc_var_value:
local loc_var_name loc_var_value


Ajouter une variable à une variable éxistante:
root@ubuntu:~# a="Bonjour"
root@ubuntu:~# b=" cher utilisateur"
root@ubuntu:~# c=$a$b
root@ubuntu:~# echo $c
Bonjour cher utilisateur


root@ubuntu:~# if echo "${c}" |grep -q "jour"; then
> echo "vrai"
> else
> echo "non"
> fi
vrai

root@ubuntu:~# if grep -q "jour" <<<"${c}"; then
> echo "vrai"
> else
> echo "faux"
> fi
vrai


root@ubuntu:~# a="Bienvenue"
root@ubuntu:~# a+=" sur ce site"
root@ubuntu:~# echo $a
Bienvenue sur ce site


Extraire une sous-chaîne: ${variable:début:longueur}
root@ubuntu:~# ma_chaine="1234567890"

root@ubuntu:~# ma_sous_chaine="${ma_chaine:0:3}"
root@ubuntu:~# echo ${ma_sous_chaine}
123

root@ubuntu:~# ma_sous_chaine="${ma_chaine:2:3}"
root@ubuntu:~# echo ${ma_sous_chaine}
345

root@ubuntu:~# ma_sous_chaine="${ma_chaine: -4}"
root@ubuntu:~# echo ${ma_sous_chaine}
7890

3. Syntaxe d'un test

if [ condition ]; then
    echo "condition est VRAI"
fi
if [ ! condition ]; then
    echo "condition est FAUX"
fi
command && command_if_true || { command_1_if_false; command_2_if_false; }
if [ condition1 ]; then
    echo "condition1 est VRAI"
elif [ condition2 ]; then
    echo "condition1 est FAUX mais condition2 est VRAI"
else
    echo "condition1 et condition2 sont FAUX"
fi
if [ condition1 ] && [ condition2 ]; then
    echo "condition1 ET condition2 sont VRAIs"
fi
if [ condition1 ] || [ condition2 ]; then
    echo "condition1 OU condition2 est VRAI"
fi
#!/bin/bash
case $user_input in
    [yY][eE][sS]|[yY]) echo "Yes"; break;;
    [nN][oO]|[nN]) echo "No"; exit 1;;
    *) echo "Invalid input..."; continue;;
esac
#!/bin/bash
case "${return_val}" in
    0) instruction_A
        instruction_B
    ;;
    1|2) instruction_C; continue;;
    99) instruction_D; break;;
    *) break;;
esac
#!/bin/bash
case "$1" in
'start')
    echo "Starting application"
    /usr/bin/startpc
    ;;
'stop')
    echo "Stopping application"
    /usr/bin/stoppc
    ;;
'restart')
    echo "Usage: $0 [start|stop]"
    ;;
esac

4. Conditions sur les status

commandA; commandBexécute commandA et ensuite commandB, quelque-soit le succès de commandA
commandA && commandBexécute commandB si et seulement si commandA est réussi (code retour 0)
commandA || commandBexécute commandB si et seulement si commandA est un echec (code retour différent de 0)
commandA && commandB || commandCexécute commandB si et seulement si commandA est réussi (code retour 0) sinon exécute commandC
commandA || (commandB && commandC)exécute commandB et commandC si et seulement si commandA est en echec (code retour different de 0)
Exemple:
root@ubuntu:~# /bin/ls -1 *.txt 1>/dev/null 2>&1 && echo "Ok, continuing" || { echo "Failed, exiting"; exit 1; }


est identique à
if /bin/ls -1 *.txt 1>/dev/null 2>&1; then
    echo "Ok, continuing"
else
    echo "Failed, exiting"
    exit 1
fi
Exemple: Tester le code retour d'une fonction
myfunc() {
    echo "start myfunc()"
    local l_params_array=($@)
    echo "l_params_array=${l_params_array[@]}"

    local l_cmd=${l_params_array[0]}
    echo "l_cmd=${l_cmd}"

    case "${l_cmd}" in
        status)
            echo "myfunc() status"
            if ! my_condition; then
                return 1
            fi
            ;;
        start)
            echo "myfunc() start"
            ;;
        stop)
            echo "myfunc() stop"
            ;;
        * ) echo "ERROR in myfunc(), usage: myfunc {status|start|stop}"; return 1;;
    esac
    return 0
}

if ! myfunc "wrong"; then
    echo "Oops, something went wrong, let's stop now!"
fi

exit 0

5. Conditions sur les objets du système de fichiers

[ -e file ]vrai si file est un fichier
[ -r file ]vrai si file est un fichier ET lisible par le script
[ -s file ]vrai si file est un fichier ET d'une taille supérieure à zéro
[ -w file ]vrai si file est un fichier ET modifiable par le script
[ -x file ]vrai si file est un fichier ET executable par le script
[ -d directory ]vrai si directory est un répertoire
[ -h objet ]vrai si objet est un lien symbolique
[ f1 -nt f2 ]si f1 est plus récent que f2
[ f1 -ot f2 ]si f1 est plus ancien que f2

6. Conditions sur les chaînes

Pour les tests sur les chaînes de caractères, il est recommandé de mettre le nom des variables entre "double quotes"
[ "${variable}" = "toto" ]
[ -z string ]vrai si string est une chaîne vide
[ -n string ]vrai si string N'est PAS une chaîne vide
[ s1 = s2 ]vrai si s1 et s2 sont des chaînes égales
[ s1 != s2 ]vrai si s1 et s2 NE sont PAS des chaînes égales

7. Conditions arithmétiques

[ "${variable}" -eq 0 ]
[ int1 -eq int2 ]vrai si int1 et int2 sont égaux
[ int1 -ne int2 ]vrai si int1 et int2 NE sont PAS égaux
[ int1 -lt int2 ]vrai si int1 est strictement inférieur à int2
[ int1 -le int2 ]vrai si int1 est inférieur ou égale à int2
[ int1 -gt int2 ]vrai si int1 est strictement supérieur à int2
[ int1 -ge int2 ]vrai si int1 est supérieur ou égale à int2