Comme toute autre commande simple, [ ... ]
o test
requiert 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
Suggestions
Lorsque vous êtes dans Bash, préférez utiliser [[ ]]
à la place, puisqu'il n'effectue pas le découpage des mots et l'expansion des noms de chemin pour ses variables, la citation peut ne pas être nécessaire, sauf si elle fait partie d'une expression.
[[ $# -ne 1 ]]
Il dispose également d'autres fonctionnalités telles que le regroupement de conditions non citées, le filtrage de motifs (filtrage de motifs étendu avec extglob
) et la correspondance regex.
L'exemple suivant vérifie si les arguments sont valides. Il autorise un seul ou deux arguments.
[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]
Pour les expressions arithmétiques pures, l'utilisation de (( ))
pour certains peuvent encore être meilleures, mais elles sont toujours possibles en [[ ]]
avec ses opérateurs arithmétiques comme -eq
, -ne
, -lt
, -le
, -gt
o -ge
en plaçant l'expression comme un seul argument de type 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 l'outil de gestion de l'information. [[ ]]
également.
Notez que [[ ]]
y (( ))
sont des mots-clés qui ont le même niveau d'analyse syntaxique que if
, case
, while
y for
.
Aussi comme Dave suggéré, les messages d'erreur sont mieux envoyés à stderr afin qu'ils ne soient pas inclus lorsque stdout est redirigé :
echo "Illegal number of parameters" >&2
Sortie du script
Il est également logique de faire en sorte que le script sorte lorsque des paramètres invalides lui sont passés. Cela a déjà été suggéré dans le commentaires por ekangas mais quelqu'un a édité cette réponse pour l'avoir avec -1
comme valeur retournée, alors autant le faire correctement.
-1
bien qu'acceptée par Bash comme un argument pour exit
n'est pas explicitement documenté et ne doit pas être utilisé comme une suggestion commune. 64
est également la valeur la plus formelle puisqu'elle est définie dans le document sysexits.h
con #define EX_USAGE 64 /* command line usage error */
. La plupart des outils comme ls
retourner également 2
sur des arguments non valables. J'avais aussi l'habitude de renvoyer 2
dans mes scripts mais dernièrement je ne m'en souciais plus vraiment et j'ai simplement utilisé 1
dans toutes les erreurs. Mais plaçons 2
ici puisque c'est le plus courant et qu'il n'est probablement pas spécifique au système d'exploitation.
if [[ $# -ne 1 ]]; then
echo "Illegal number of parameters" >&2
exit 2
fi
Références
75 votes
Vous ne devriez pas nommer votre script
test
. C'est le nom d'une commande Unix standard, vous ne voudriez pas la cacher.29 votes
Utilisez toujours des espaces autour de '[' ('[[') ou '(' ('((')) dans les instructions if en bash.
6 votes
Pour ajouter au commentaire de @zoska, vous avez besoin d'un espace avant [ car il est implémenté comme une commande, essayez 'which ['.
1 votes
Un meilleur exemple est donné sur le lien ci-dessous : stackoverflow.com/questions/4341630/
4 votes
@Barmar le nommant sûrement
test
est bien tant qu'il n'est pas sur la PATH ?0 votes
@immibis Oui, c'est vrai. Mais il doit se rappeler que s'il le met dans le PATH, il ne fonctionnera pas. En évitant d'utiliser le nom, on contourne ce problème.
0 votes
Vous souhaitez probablement aussi sortir avec un code de sortie non nul après avoir imprimé un message si le programme est appelé avec un nombre illégal de paramètres. Ce lien suggère que certaines personnes utilisent la commande "exit 64", où 64 signifie "erreur d'utilisation de la ligne de commande". stackoverflow.com/a/1535733/1102730
0 votes
Quelques commentaires. Assurez-vous que vous mettez des espaces entre les crochets. bash est pointilleux à ce sujet. et assurez-vous que #!/bin/bash en haut du fichier, parce que certains systèmes utilisent par défaut l'ancien shell bourne /bin/sh qui manque une partie de la syntaxe du shell bash, mais qui est suffisamment similaire pour vous faire tourner la tête.
0 votes
Ker digital ocean publish