User Tools

Site Tools


informatique:linux:programmation_shell

This is an old revision of the document!


programmation langage

Programmation Shell

  • . $CONFIG_FILE ⇒ permet de faire un include (notez bien le point + espace “. ”)

Les "$"

Ce sont des variables liées au contexte du script.

  • $0 est le nom du script
  • $1 $2, $3, etc les arguments du script. On peut les décaler grâce à la commande shift ($2 devient $1, $3 devient $2, etc)
  • $* est la liste de tous les arguments
  • $# renvoie le nombre d'argument du script
  • $$ renvoie le pid du script courant
  • $! renvoie le pid de la dernière commande
  • $? renvoie le retour (code d'erreur par exemple) de la dernière commande

Les variables

  • IFS=“\n” (Internal Field Separator) le séparateur de champ est “ENTER” (utilisée par la commande read)

Les fonctions

read

read toto permet de demander une saisie clavier à l'utilisateur.

Pour afficher un texte avant la saisie on utilise -p ; et on peut récupérer plusieurs saisie d'un seul coup :

read -p "Quel est le nombre indique sur votre CB ? Et le cryptogramme visuel de derriere ?" CARD_NUMBER CRYPTO

Expressions arithmétiques

Pour faire un calcul il faut l'encadrer de $((calcul)) ou $[calcul]

echo 1+1=$((1+1))

La fonction puissance s'écrit ** :

echo 2^5=$((2**5))

Pour incrémenter une variable : plusieurs possibilités :

  • z=`expr $z + 1`
  • z=$(($z+1))
  • z=$((z+1)) (entre doubles parenthèses, le $ est optionnel)
  • (( z += 1 ))

Instructions conditionnelles

if

test expr

ou

if [ expr ]
  then
  else
fi

Exemple sur une seule ligne (-n renvoie TRUE si la chaine n'est pas vide) :

if [ -n "" ]; then echo "1"; else echo "0"; fi
  0

NB : Pour tester des conditions multiples, on doit encadrer les tests avec un double crochet : programmation_shell

if [[ TRUE && TRUE || FALSE ]]
then
  echo "TRUE"
else
  echo "TRUE QUAND MÊME !"
fi

Les conditions multiples sans parenthèses sont lues dans l'ordre d'apparition (gauche à droite), ici cela équivaut à : (TRUE ET TRUE) OU FALSE. Donc TRUE quand même.

Expression sur les fichiers

  • -e <file> : existe
  • -f file : existe et non répertoire
  • -d file : existe et est un répertoire
  • -s file : existe et est de taille non nulle
  • -r file : existe et droit en lecture
  • -w file : existe et droit en écriture
  • -x file : existe et droit d'exécution

Chaînes de caractères

  • str1 = str2
  • str1 != str2
  • -z str : vrai si chaîne de longueur nulle
  • -n str : vrai si chaîne de longueur non nulle

Nombres, comparaison

  • n1 -eq n2 égaux
  • n1 -ne n2 non égaux
  • n1 -gt n2 plus grand que
  • n1 -ge n2 plus grand ou égal
  • n1 -lt n2 plus petit que
  • n1 -le n2 plus petit ou égal

Opérateurs

  • ! unaire de négation
  • -a et logique
  • -o ou logique
  • ( expr ) paranthésage
  • \( et \) sinon interprétées par le shell

case

Test plusieurs possibilités de <chaîne> (~ifs imbriqués).

case <chaîne> in
 motif1) commande(s) ;;
 motif2) commande(s) ;;
 ..
esac

for

Exemples :

for (( i = 1; i <= 5; i++ ))
  do
  echo $i
done

Ou en une seule ligne de commande :

for i in serveur1 serveur2 serveur3; do ssh $i "(uname -r)"; done

Divers

en vrac

  • lire un fichier ligne par ligne
while read line
do
  echo $line
done < fic.txt

ou sur une seule ligne :

while read n; do echo $line; done < fic.txt
  • commande rsh
rsh -4 -n $serveur $commande > /dev/null 2>&1
  • commande ping limitée à 3 envois avec un timeout de 0.05s
ping -c3 -w 0.05 soekris-${cpt} >/dev/null 2>$1
retour=$?
  • attente d'un SIGUSR1 (30) pour terminer le script :
trap "echo 'Exiting..' ; exit 0" 30

Substitution de chaine

Pour n'afficher qu'une partie d'une chaine (une sous-chaine donc), on utilise la syntaxe ${tst:<offset>:<length>}. L'offset c'est l'origine et length c'est le longueur de la chaine affichée. Par exemple pour afficher la sous-chaine “tata” de “titi tata toto” on utilisera :

test="titi tata toto"
echo ${test:5:4}
 tata

(on affiche les 4 caractères à partir du n°5).

Remplacement de chaine

Pour remplacer “toto” par “tata” dans la chaine “test” :

test="titi tata toto"
echo ${test//toto/tata}
 titi tata tata

notez bien le double slash (/).

Liens

informatique/linux/programmation_shell.1263465114.txt.gz · Last modified: 2013/10/14 20:54 (external edit)