J'ai besoin de vérifier l'existence d'un argument d'entrée. J'ai le script suivant
if [ "$1" -gt "-1" ]
then echo hi
fi
Je reçois
[: : integer expression expected
Comment vérifier d'abord l'argument d'entrée1 pour voir s'il existe?
C'est:
if [ $# -eq 0 ]
then
echo "No arguments supplied"
fi
La $#
variable vous indiquera le nombre d'arguments d'entrée auxquels le script a été transmis.
Ou vous pouvez vérifier si un argument est une chaîne vide ou non:
if [ -z "$1" ]
then
echo "No argument supplied"
fi
Le -z
commutateur testera si l'expansion de "$ 1" est une chaîne nulle ou non. S'il s'agit d'une chaîne nulle, le corps est exécuté.
[ -z "$1" ] && echo "No argument supplied"
Je préfère les monolignes, car elles sont plus faciles pour moi; et il est également plus rapide de vérifier la valeur de sortie par rapport à l'utilisationif
exit 1
à la fin de vos échos à l'intérieur du bloc if lorsque l'argument est requis pour que le script fonctionne. Évident, mais mérite d'être noté pour être complet.programname "" secondarg third
. La$#
vérification vérifie sans ambiguïté le nombre d'arguments.if [ ! -z "$1" ]; then ...
Il vaut mieux démontrer de cette façon
Vous devez normalement quitter si vous avez trop peu d'arguments.
la source
exit 1
que vous voulez habituellement et utilise le[[ ]]
test qui (iirc) est généralement plus raisonnable. Donc, pour les gens, copier-coller aveuglément du code est la meilleure réponse.Dans certains cas, vous devez vérifier si l'utilisateur a passé un argument au script et sinon, revenir à une valeur par défaut. Comme dans le script ci-dessous:
Ici, si l'utilisateur n'a pas passé
scale
comme 2ème paramètre, je lance l'émulateur Android-scale 1
par défaut.${varname:-word}
est un opérateur d'expansion. Il existe également d'autres opérateurs d'expansion:${varname:=word}
qui définit l'indéfinivarname
au lieu de renvoyer laword
valeur;${varname:?message}
qui retournevarname
s'il est défini et n'est pas nul ou imprime lemessage
et abandonne le script (comme le premier exemple);${varname:+word}
quiword
ne renvoie que sivarname
est défini et n'est pas nul; renvoie null sinon.la source
${varname?message}
. Le supplément est-il:
une faute de frappe ou change-t-il de comportement?: ${1?"First argument is null"} ${2?"Please provide more than 1 argument"}
Essayer:
la source
$#
et0
?else
aussi.foo*
) et le fractionnement des mots (c'est-à-dire le fractionnement du contenu si la valeur contient des espaces). Dans ce cas, il n'est pas nécessaire de citer$#
car ces deux cas ne s'appliquent pas. Il0
n'est pas non plus nécessaire de citer le, mais certaines personnes préfèrent citer des valeurs car ce sont vraiment des chaînes et cela le rend plus explicite.Une autre façon de détecter si des arguments ont été passés au script:
Notez que
(( expr ))
l'expression est évaluée selon les règles de Shell Arithmetic .Pour sortir en l'absence d'arguments, on peut dire:
Une autre façon (analogue) de dire ce qui précède serait:
help let
dit:la source
exit
qui tue mon processus zsh, j'utilisereturn
ce qui ne le tue pas((!$#))
déclencherait une substitution de l'histoire?J'utilise souvent cet extrait de code pour des scripts simples:
la source
Seulement parce qu'il y a un point de base plus à souligner, j'ajouterai que vous pouvez simplement tester que votre chaîne est nulle:
De même, si vous attendez le nombre d'arguments, testez votre dernier:
et ainsi de suite avec tout arg ou var
la source
Si vous souhaitez vérifier si l'argument existe, vous pouvez vérifier si le nombre d'arguments est supérieur ou égal à votre numéro d'argument cible.
Le script suivant montre comment cela fonctionne
test.sh
produit la sortie suivante
la source
En tant que petit rappel, les opérateurs de test numériques dans Bash ne fonctionnent que sur des entiers (
-eq
,-lt
,-ge
, etc.)J'aime m'assurer que mes $ vars sont des pouces par
avant de les tester, juste pour me défendre contre l'erreur "[: arg entier requis".
la source
var=$(printf "%.0f" "$var")
peut gérer les flottants mais souffre de la sortie non nulle quand on lui donne une chaîne. Si cela ne vous dérange pas awk, cette méthode utilisation I semble être le plus robuste pour faire respecter un entier:var=$(<<<"$var" awk '{printf "%.0f", $0}')
. Si var n'est pas défini, il est par défaut "0". Si var est un flottant, il est arrondi à l'entier le plus proche. Les valeurs négatives sont également très bien à utiliser.une validation de fonction bash liner
ajouter le nom et l'utilisation de la fonction
ajouter une validation pour vérifier si un entier
pour ajouter une validation supplémentaire, par exemple pour vérifier si l'argument passé est un entier, modifiez la validation d'une ligne pour appeler une fonction de validation:
puis, construisez une fonction de validation qui valide l'argument, renvoyant 0 en cas de succès, 1 en cas d'échec et une fonction die qui abandonne le script en cas d'échec
Encore plus simple - utilisez simplement
set -u
set -u
s'assure que chaque variable référencée est définie lors de son utilisation, il suffit donc de la définir et de l'oublierla source