Vérifiez le nombre d'arguments passés à un script Bash
Je voudrais que mon script Bash pour imprimer un message d'erreur si l'argument du nombre n'est pas respecté.
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
Ce que je fais mal?
- Vous ne devriez pas le nom de votre script
test
. C'est le nom d'une norme de commande Unix, vous ne voulez pas d'ombre. - Toujours utiliser des espaces autour de '[' ('[[') ou '(' ('((') dans les cas énoncés dans bash.
- Pour ajouter à @zoska commentaire, il vous faut un espace avant [ parce qu'il est implémenté comme une commande, essayez " qui ['.
- le meilleur exemple est donné sur le lien ci-dessous: stackoverflow.com/questions/4341630/...
- sûrement le nommant
test
est bien tant qu'il n'est pas sur le CHEMIN? - Oui, c'est vrai. Mais il ne faut pas oublier que si il le met dans le CHEMIN, ça ne marchera pas. Éviter d'utiliser le nom contourne ce problème.
- Vous avez sans doute aussi envie de sortir avec un code de sortie non nulle après l'impression d'un message si le programme est lancé avec illégale d'un certain nombre de paramètres. Ce lien suggère que certaines personnes utiliser la commande "exit 64', où 64 signifie "ligne de commande utilisation de l'erreur". stackoverflow.com/a/1535733/1102730
- Quelques commentaires. Assurez-vous de mettre de l'espace entre les crochets. bash est pointilleux à ce sujet. et assurez-vous que #!/bin/bash en haut du fichier, parce que certains système par défaut pour les plus âgés bourne shell /bin/sh qui est pas certains de la syntaxe du shell bash, mais assez similaire à déconner avec votre tête.
Vous devez vous connecter pour publier un commentaire.
Comme toute autre commande simple,
[ ... ]
outest
nécessite des espaces entre ses arguments.Ou
Lors de Bash, préférez l'utilisation de
[[ ]]
plutôt comme il ne fait pas de couper un mot et le nom de chemin d'expansion de ses variables citant peut-être pas nécessaire, sauf s'il fait partie d'une expression.Il a aussi quelques autres fonctionnalités comme non cotées condition de regroupement, de modèle correspondante (extended motif de correspondance avec
extglob
) et l'expression rationnelle correspondant.L'exemple suivant vérifie si les arguments sont valables. Il permet à un seul argument ou deux.
Pour pure expressions arithmétiques, à l'aide de
(( ))
pour certains peut-être encore mieux, mais ils sont encore possibles dans[[ ]]
avec ses opérateurs arithmétiques comme-eq
,-ne
,-lt
,-le
,-gt
, ou-ge
en plaçant l'expression est une chaîne unique argument:Qui devrait être utile si vous avez besoin de le combiner avec d'autres fonctions de
[[ ]]
ainsi.Références:
[
est juste une autre commande, c'est à dire, essayerwhich [
.[
est un builtin, tandis que[[
est un mot-clé. Dans les vieilles coquilles,[
n'est pas encore intégrée. Des commandes comme[
naturellement co-exister en tant qu'une commande externe dans la plupart des systèmes, mais les commandes internes sont priorisés par le shell, à moins que vous dérivation aveccommand
ouexec
. Vérifiez que le shell de la documentation sur la façon dont ils évaluent. Prendre note de leur différence, et comment ils peuvent se comporter différemment dans chaque coquille.Il pourrait être une bonne idée d'utiliser expressions arithmétiques si vous êtes à jongler avec les chiffres.
Sur []: !=, =, == ... sont chaîne opérateurs de comparaison et -eq, -gt ... sont arithmétique les chiffres binaires.
Je voudrais utiliser:
Ou:
==
est en fait une fonctionnalité non documentée, qui passe pour travailler avec GNUtest
. Il a également passe pour travailler avec FreeBSDtest
, mais peut fonctionne pas sur footest
. Le que standard de comparaison est=
(juste pour info).dash
:dash -c '[ 1 == 1 ]'
. POSIX ne précise=
, et pas==
.Si vous êtes seulement intéressés par puisage si un argument est absent, Paramètre De Substitution est grande:
Une simple chemise qui fonctionne peut être fait en utilisant:
Cela revient à:
Pense à noter:
exit 1
ne s'appliqueraient que dans le contexte du shell interne est exécuté rendant simplement synonyme de( usage; false )
. Je ne suis pas un fan de cette façon de simplification quand il s'agit des options d'analyse, mais vous pouvez utiliser{ usage && exit 1; }
à la place. Ou probablement juste{ usage; exit 1; }
.{...}
est une commune de la syntaxe et est disponible pour la plupart, si pas tous les shells basé sursh
, même ceux âgés de coquilles non à la suite de normes de POSIX.Découvrez cette bash triche, elle peut aider beaucoup.
Pour vérifier la longueur des arguments passés en, vous utilisez
"$#"
Pour utiliser le tableau des arguments passés en, vous utilisez
"$@"
Un exemple de vérification de la longueur, et l'itération serait:
Ce stage m'a aidé, mais manquait un peu de choses pour moi et ma situation. Espérons que cela aide quelqu'un.
Dans le cas où vous voulez être sur le côté sécuritaire, je vous recommande d'utiliser getopts.
Voici un petit exemple:
voir plus de détails ici par exemple http://wiki.bash-hackers.org/howto/getopts_tutorial
Ici un simple chemises pour vérifier si un seul paramètre est donné sinon quitter le script:
Vous devez ajouter des espaces entre les conditions de test:
J'espère que cette aide.