Cette page explique succinctement pourquoi il est mieux de l’écrire ainsi!
Ah, oui, au fait … si tu décides de le publier aux autres, il ne te faut pas oublier de mentionner l’installation de l’outil iperf qui n’est généralement pas installé par défaut !
Un exemple de test de dépendances tel que je les implémente dans mes scripts, celui-ci interrompt le script avec un message si l’une des commandes [mono]innoextract[/mono] ou [mono]fakeroot[/mono] est introuvable dans le $PATH de l’utilisateur :
# Contrôle des dépendances
for dep in innoextract fakeroot; do
if [ -z $(which $dep) ]; then
echo "$dep est introuvable."
echo "Installez-le avant de lancer ce script."
exit 1
fi
done
À ajouter bien sûr en début de script, avant invocation de ces commandes.
iperf="$(which iperf)"
if [[ -n ${iperf} ]]; then ... fi
Ton exemple est intéressant, mais pareil, je préfère mettre les différentes commandes dans un tuple, puis appeler le tuple comme dans ta boucle, tel que :
declare -a APPS=('innoextract' 'fakeroot' 'iperf')
# Contrôle des dépendances
for dep in "${APPS[@]}"; do
if [ -z "$(which "${dep}")" ]; then
echo -e "${dep} est introuvable. \n Installez-le avant de lancer ce script. \n"
exit 1
fi
done
L’avantage du tuple, pour moi, est que c’est plus simple à gérer pour enlever/ajouter une commande, plutôt que dans la boucle ‘for’ …
PS : au fait, si je n’ai pas donné d’exemple à-propos du test, c’était surtout pour qu’il cherche par lui-même …
Maintenant, il a deux exemples, assez similaires qui lui montrent comment … et lui font comprendre aussi, qu’en dev, il y a souvent plusieurs façons de faire
Une méthode intéressante que ce “tuple”, qu’en bon autodidacte je ne connaissais pas. Merci pour la rapide explication, il ne se passera sûrement pas longtemps avant que je ne lui trouve un usage dans mes projets shell.
À moins que ce ne soit une fonction typique de bash incompatible avec le shell POSIX ?
RAhhh, crétin, je viens de remarquer un abus de language de ma part …
Le terme ‘tuple’ est emprunté au Python (tsss…), dans le cas de Bash, c’est un tableau
Après, je ne vois pas en quoi ce ne serait pas “Posix Compliance” …
Mais, sur cette question, je ne suis vraiment pas calé du tout !
[quote=“PengouinPdt”]Après, je ne vois pas en quoi ce ne serait pas “Posix Compliance” …
Mais, sur cette question, je ne suis vraiment pas calé du tout ![/quote]
Et bien le plus simple reste sûrement que j’essaye avant de revenir faire mon rapport.
[mono]Syntax error: “(” unexpected[/mono]
C’est bien un “bashisme”, dash n’est pas capable de l’interpréter sous cette forme.
Merci PengouinPdt, ne conaissant pas encore le bash j’ai fait au plus basique ! mais je vois tres bien tes amélioration ! on passe du basique à quelquechose de simple mais optimisé !
Ca fait quand méme du bien de coder de temps en temps
ps: la prochaine fois je tacherais de faire mieux et de le poster correctement (en n’oubliant pas l’install par exemple !)
C’est bien un “bashisme”, dash n’est pas capable de l’interpréter sous cette forme.[/quote]
En effet, c’est un bashisme.
Tu peux donc l’écrire ainsi :
#!/bin/sh
set -- innoextract fakeroot iperf
# Contrôle des dépendances
for dep in "$@"; do
if [ -z "$(which "${dep}")" ]; then
printf "%s est introuvable. \n Installez-le avant de lancer ce script. \n" "${dep}"
exit 1
fi
done
Quel dommage que les variables de type tableau n’existent pas en POSIX … ou je n’ai vraiment pas trouvé comment faire !
Puisqu’en effet, set réinitialise les variables spéciales … donc avant d’initialiser, tu test le nombre d’arguments passés, et s’il y en a, tu les attribues à une variable …
Je prends des notes, cette discussion est franchement enrichissante et devrait me permettre d’améliorer efficacement mes nombreux scripts shell.
Pour les curieux, un aperçu des scripts sur lesquels je travaille ces temps-ci peut se trouver par ici : dotslashplay.it/scripts/fr/
(certificat auto-signé,
SHA1 : 08:7A:58:99:48:DF:C1:2D:F8:80:C3:3B:0F:B1:B9:76:F4:D6:89:E1
MD5 : 6F:72:65:0F:5E:B5:BC:84:6F:10:6B:26:BF:87:3B:8A)
nb_args="$#"
i=1
if [ -n "$nb_args" ]; then
for arg in "$@"; do
export arg$i="${arg}"
i=$(($i+1))
done
fi
unset i
printf "1: %s \n" "${arg1}"
set -- innoextract fakeroot iperf
printf "1: %s - ${arg1} \n" "$1"
Et, pour le fun, se rendre compte que c’est faisable avec la syntaxe HEREDOC, et une belle boucle while - “so, too much? it’s up to you!” :
deps="innoextract
fakeroot
iperf"
while read -r cmd; do
printf "Checking $cmd ...\n"
if ! command -v "$cmd"; then
printf "Error: $cmd not found\n"
else
printf "Success: $cmd found\n"
fi
printf "\n"
done <<EOF
$deps
EOF
Cette dernière n’est pas de moi, je viens de la trouver ici(cf, en fin de page) !