MagPI 10 Page 18

De Le French MagPi
Aller à : Navigation, rechercher

Le tableau ci-dessous présente les tests logiques qui peuvent être appliqués aux variables :

Syntaxe Explication
-z chaîne Vrai si la chaîne est vide
-n chaîne Vrai si la chaîne n'est pas vide
var1 == var2 Vrai si égal
var1 != var2 Vrai si différent

Les comparaisons logiques d'égalité et de différence peuvent aussi être utilisées avec des jokers, pour tester si une sous-chaîne est présente dans une autre chaîne.

#!/bin/bash
str1="Raspberry"
str2="berry"
if [[ $str1 == "$str2"* ]]; then
  echo "$str1 commence par $str2"
fi
if [[ $str1 == *"$str2" ]]; then
  echo "$str1 se termine par $str2"
fi
if [[ $str1 == *"$str2"* ]]; then
  echo "$str1 contient $str2"
fi

La boucle 'for'

Bash fournit nombre de structures de boucles familières. La boucle for est le plus souvent utilisée avec des fichiers ou des variables en entrée :

#!/bin/bash
# Une chaîne avec des valeurs séparées par des espaces
list="a b c"
# affiche chaque caractère de la variable 'list'.
for l in $list; do
  echo $l
done

On peut aussi l'écrire en une seule ligne comme suit :

list="a b c"; for l in $list; do echo $l; done

Où les retours à la ligne du script sont remplacés par des points-virgules. La variable contenant la liste peut être remplacée par un fichier :

#!/bin/bash
# Remplit un fichier avec des chaînes
echo "Pomme Orange" > list # Vide et concatène
echo "Poire" >> list # Concatène
# affiche chaque mot du fichier source.
for l in $(<list); do
  echo $l
done

Cet exemple utilise la redirection d'un fichier source pour lire chaque mot. Bash sépare les mots à l'aide de caractères espace ou retour à la ligne.

La boucle for supporte aussi la syntaxe des itérations du C :

#!/bin/bash
# Affiche tous les nombres de 1 à 10
for (( i=1; i<=10; i++ )); do
  echo $i
done

On notera que la variable i n'est pas préfixée par un signe dollar dans les parenthèses (()) de la boucle for. C'est une exception de ce type de boucle for.

Commandes d'évaluation

Une commande peut être évaluée en l'écrivant à l'intérieur de $(). Par exemple :

 dir_list=$(ls)

Remplit la variable dir_list avec le texte renvoyé par la commande ls. La syntaxe $() peut être utilisée directement comme variable. Cela peut s'avérer utile dans une boucle :

#!/bin/bash
for file in $(ls *.txt); do
  gzip $file
done

Cet exemple compresse avec gzip tous les fichiers texte du répertoire de travail.

Les commandes d'évaluation peuvent être imbriquées :

touch /tmp/t1 # Crée un fichier vide
$(basename $(ls /tmp/t1)) # Nom du fichier sans le répertoire

Il peut aussi inclure des variables :

file=/tmp/t1
$(basename $(ls $file))

Les commandes peuvent comporter des opérateurs tubes :

files_to_gzip=$(ls * | grep -v .gz)

Cette commande exclut les fichiers dont le nom termine par ".gz". L'opérateur tube "|" passe la sortie standard d'une commande à l'entrée standard de la suivante.

Challenge

Écrire un programme pour compresser avec gzip tous les fichiers du répertoire courant. Ce programme ne doit pas compresser les fichiers dont le nom se termine par ".gz". La solution de ce problème sera donnée dans le prochain tutoriel.

Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Boîte à outils