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 l'erreur suivante:
test: line 4: [2: command not found
Qu'est-ce que je fais mal?
test
. C'est le nom d'une commande Unix standard, vous ne voudriez pas la masquer.test
bien tant qu'il n'est pas sur le CHEMIN?Réponses:
Comme toute autre commande simple,
[ ... ]
outest
nécessite des espaces entre ses arguments.Ou
Suggestions
Lorsque vous êtes dans Bash, préférez utiliser à la
[[ ]]
place car il ne fait pas de fractionnement de mot et d'expansion de nom de chemin à ses variables que la citation peut ne pas être nécessaire sauf si elle fait partie d'une expression.Il possède également d'autres fonctionnalités telles que le regroupement de conditions sans guillemets, la correspondance de modèles (correspondance de modèles étendue avec
extglob
) et la correspondance d'expressions régulières.L'exemple suivant vérifie si les arguments sont valides. Il permet un seul argument ou deux.
Pour pures expressions arithmétiques, en utilisant
(( ))
à certains peuvent encore être mieux, mais ils sont encore possibles dans[[ ]]
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:Cela devrait être utile si vous devez également le combiner avec d'autres fonctionnalités de
[[ ]]
.Quitter le script
Il est également logique de quitter le script lorsque des paramètres non valides lui sont transmis. Cela a déjà été suggéré dans les commentaires par ekangas mais quelqu'un a édité cette réponse pour l'avoir
-1
comme valeur retournée, donc je ferais aussi bien de le faire correctement.-1
bien qu'accepté par Bash comme argument, ilexit
n'est pas explicitement documenté et ne peut être utilisé comme suggestion courante.64
est également la valeur la plus formelle car elle est définiesysexits.h
avec#define EX_USAGE 64 /* command line usage error */
. La plupart des outils commels
reviennent également2
sur des arguments invalides. J'avais aussi l'habitude de revenir2
dans mes scripts mais dernièrement je ne m'en souciais plus vraiment, et j'utilisais simplement1
dans toutes les erreurs. Mais plaçons-nous2
ici car c'est le plus courant et probablement pas spécifique au système d'exploitation.Références
la source
[
s'agit que d'une autre commande, c'est-à-dire, essayezwhich [
.[
est un intégré, tandis que[[
est un mot-clé. Dans certains obus plus anciens,[
n'est même pas intégré. Des commandes comme[
naturellement coexistent en tant que commande externe dans la plupart des systèmes, mais les commandes internes sont priorisées par le shell, sauf si vous contournez aveccommand
ouexec
. Consultez la documentation du shell sur la façon dont ils évaluent. Prenez note de leur différence et de la façon dont ils peuvent se comporter différemment dans chaque coquille.Il pourrait être judicieux d'utiliser des expressions arithmétiques si vous avez affaire à des nombres.
la source
[ ... ]
lorsque cela fonctionne bien et qu'aucune opération de fantaisie n'est nécessaire?$(( ))
ne sont pas fantaisistes et devraient être implémentées par tous les shells POSIX. Cependant, la(( ))
syntaxe (sans$
) n'en fait pas partie. Si vous êtes limité pour une raison quelconque, vous pouvez certainement l'utiliser à la[ ]
place, mais gardez à l'esprit que vous ne devriez pas l'utiliser[[ ]]
également. J'espère que vous comprenez les pièges[ ]
et les raisons pour lesquelles ces fonctionnalités existent. Mais c'était une question Bash donc nous donnons des réponses Bash ( "En règle générale, [[est utilisé pour les chaînes et les fichiers. Si vous voulez comparer des nombres, utilisez une ArithmeticExpression" ).Sur [] :! =, =, == ... sont des opérateurs de comparaison de chaînes et -eq, -gt ... sont des opérateurs binaires arithmétiques .
J'utiliserais:
Ou:
la source
==
est en fait une fonctionnalité non documentée, qui arrive à travailler avec GNUtest
. Il a également produit de travailler avec FreeBSDtest
, mais peut ne pas fonctionner sur footest
. La seule comparaison standard est=
(juste FYI).dash
:dash -c '[ 1 == 1 ]'
. POSIX spécifie seulement=
, et non==
.Si vous n'êtes intéressé par le baillage que si un argument particulier est manquant, la substitution de paramètres est idéale:
la source
Un simple liner qui fonctionne peut être fait en utilisant:
Cela se décompose en:
Pense à noter:
la source
exit 1
cela ne s'appliquerait qu'au contexte de la sous-coque, ce qui la rend également synonyme de( usage; false )
. Je ne suis pas fan de cette manière de simplifier en ce qui concerne l'analyse des options, mais vous pouvez utiliser à la{ usage && exit 1; }
place. Ou probablement juste{ usage; exit 1; }
.{...}
est une syntaxe commune et est disponible pour la plupart sinon tous les shells basés sursh
, même les shells plus anciens ne suivant pas les standards POSIX.Découvrez cette feuille de triche bash, il peut aider beaucoup.
Pour vérifier la longueur des arguments transmis, vous utilisez
"$#"
Pour utiliser le tableau d'arguments transmis, vous utilisez
"$@"
Un exemple de vérification de la longueur et d'itération serait:
Ce stage m'a aidé, mais il manquait quelques choses pour moi et ma situation. J'espère que cela aide quelqu'un.
la source
Au cas où vous voudriez être du bon côté, je recommande d'utiliser des getopts.
Voici un petit exemple:
voir plus de détails ici par exemple http://wiki.bash-hackers.org/howto/getopts_tutorial
la source
Voici un simple liners pour vérifier si un seul paramètre est donné sinon quittez le script:
la source
Vous devez ajouter des espaces entre les conditions de test:
J'espère que ça aide.
la source