J'essaie toujours de m'en tenir à POSIX sh
au lieu d'utiliser des extensions Bash, car l'un des points majeurs du script est la portabilité (en plus de connecter des programmes, pas de les remplacer).
Dans sh
, il existe un moyen simple de rechercher une condition "is-prefix".
case $HOST in node*)
# Your code here
esac
Compte tenu de l'âge, des arcanes et de la cruauté de sh (et Bash n'est pas le remède: c'est plus compliqué, moins cohérent et moins portable), je voudrais souligner un très bel aspect fonctionnel: alors que certains éléments de syntaxe comme case
sont intégrés , les constructions résultantes ne sont pas différentes de tout autre travail. Ils peuvent être composés de la même manière:
if case $HOST in node*) true;; *) false;; esac; then
# Your code here
fi
Ou encore plus court
if case $HOST in node*) ;; *) false;; esac; then
# Your code here
fi
Ou encore plus court (juste pour présenter !
comme un élément de langage - mais c'est un mauvais style maintenant)
if ! case $HOST in node*) false;; esac; then
# Your code here
fi
Si vous aimez être explicite, créez votre propre élément de langage:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
N'est-ce pas vraiment sympa?
if beginswith node "$HOST"; then
# Your code here
fi
Et comme il ne sh
s'agit essentiellement que de travaux et de listes de chaînes (et de processus internes, à partir desquels les travaux sont composés), nous pouvons même maintenant faire une programmation fonctionnelle légère:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
checkresult() { if [ $? = 0 ]; then echo TRUE; else echo FALSE; fi; }
all() {
test=$1; shift
for i in "$@"; do
$test "$i" || return
done
}
all "beginswith x" x xy xyz ; checkresult # Prints TRUE
all "beginswith x" x xy abc ; checkresult # Prints FALSE
C'est élégant. Ce n'est pas que je recommanderais d'utiliser sh
quoi que ce soit de sérieux - cela casse trop rapidement les exigences du monde réel (pas de lambdas, nous devons donc utiliser des chaînes. Mais l'imbrication des appels de fonction avec des chaînes n'est pas possible, les tuyaux ne sont pas possibles, etc.)