Je voudrais que mon script Bash affiche un message d'erreur si le nombre d'arguments requis n'est pas atteint.
J'ai essayé le code suivant :
#!/bin/bash
echo Script name: $0
echo $# arguments
if [$# -ne 1];
then echo "illegal number of parameters"
fi
Pour une raison inconnue, j’ai obtenu l’erreur suivante :
test: line 4: [2: command not found
Qu'est-ce que je fais de mal ?
Comme toute autre commande simple, [ ... ]
ou test
nécessite des espaces entre ses arguments.
if [ "$#" -ne 1 ]; then
echo "Illegal number of parameters"
fi
Ou
if test "$#" -ne 1; then
echo "Illegal number of parameters"
fi
En Bash, préférez l'utilisation de [[ ]]
à la place car il ne fait pas de séparation de mots et d'expansion de chemin à ses variables que la citation peut ne pas être nécessaire à moins qu'elle ne fasse partie d'une expression.
[[ $# -ne 1 ]]
Il possède également d'autres fonctionnalités comme le regroupement de conditions non citées, la correspondance de motifs (correspondance de motifs étendue avec extglob
) et la correspondance regex.
L'exemple suivant vérifie si les arguments sont valides. Il permet un seul ou deux arguments.
[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]
Pour les expressions arithmétiques pures, l'utilisation de (( ))
à certaines peut encore être meilleure, mais elles sont toujours possibles dans [[ ]]
avec ses opérateurs arithmétiques comme -eq
, -ne
, -lt
, -le
, -gt
, ou -ge
en plaçant l'expression comme un seul argument de chaîne :
A=1
[[ 'A + 1' -eq 2 ]] && echo true ## Prints true.
Cela devrait être utile si vous avez besoin de le combiner avec d'autres fonctionnalités de [[]]
.
Il est également logique de faire sortir le script lorsque des paramètres invalides lui sont passés. Cela a déjà été suggéré dans les commentaires par ekangas mais quelqu'un a édité cette réponse pour avoir -1
comme valeur retournée, alors autant le faire correctement.
-1
bien qu'accepté par Bash comme argument de exit
n'est pas explicitement documenté et n'est pas correct pour être utilisé comme une suggestion commune. 64
est aussi la valeur la plus formelle puisqu'elle est définie dans sysexits.h
avec #define EX_USAGE 64 /* command line usage error */
. La plupart des outils comme ls
retournent également 2
en cas d'arguments invalides. J'avais aussi l'habitude de retourner 2
dans mes scripts mais dernièrement je ne m'en suis plus vraiment soucié, et j'ai simplement utilisé 1
dans toutes les erreurs. Mais plaçons simplement 2
ici car c'est le plus commun et probablement pas spécifique au système d'exploitation.
if [[ $# -ne 1 ]]; then
echo "Illegal number of parameters"
exit 2
fi
Il peut être judicieux d'utiliser des [expressions arithmétiques] (http://wiki.bash-hackers.org/syntax/arith_expr) si vous avez affaire à des nombres.
if (( $# != 1 )); then
echo "Illegal number of parameters"
fi