Vérifier l'existence d'un argument d'entrée dans un script shell Bash
je dois vérifier l'existence d'un argument d'entrée. J'ai le script suivant
if [ "" -gt "-1" ]
then echo hi
fi
je reçois
[: : integer expression expected
Comment puis-je vérifier l'entrée argument1 d'abord pour voir si il existe?
9 réponses
C'est:
if [ $# -eq 0 ]
then
echo "No arguments supplied"
fi
la variable $#
vous indiquera le nombre d'arguments d'entrée que le script a passé.
Ou vous pouvez vérifier si un argument est une chaîne vide ou pas comme:
if [ -z "" ]
then
echo "No argument supplied"
fi
le commutateur -z
vérifiera si l'extension de "$1 " est une chaîne nulle ou non. Si c'est une chaîne nulle, alors le corps est exécuté.
il vaut mieux démontrer de cette façon
if [[ $# -eq 0 ]] ; then
echo 'some message'
exit 1
fi
normalement, Vous devez quitter si vous avez trop peu d'arguments.
si vous êtes seulement intéressé à détecter si un argument particulier est manquant, paramètre de substitution est grand:
#!/bin/bash
# usage-message.sh
: ${1?"Usage: "151900920" ARGUMENT"}
# Script exits here if command-line parameter absent,
#+ with following error message.
# usage-message.sh: 1: Usage: usage-message.sh ARGUMENT
Dans certains cas, vous devez vérifier si l'utilisateur est passé d'un argument au script, et si non, revenir à une valeur par défaut. Comme dans le script ci-dessous:
scale=${2:-1}
emulator @ -scale $scale
ici si l'utilisateur n'a pas passé scale
comme deuxième paramètre, je lance émulateur Android avec -scale 1
par défaut. ${varname:-word}
est un opérateur d'extension. Il y a aussi d'autres opérateurs d'expansion:
-
${varname:=word}
qui jeux undefinedvarname
au lieu de retourner leword
valeur; -
${varname:?message}
qui retournevarname
si elle est définie et n'est pas nulle ou imprime lemessage
et annule le script (comme le premier exemple); -
${varname:+word}
qui renvoieword
seulement sivarname
est défini et n'est pas null; retourne null sinon.
, Essayez:
#!/bin/bash
if [ "$#" -eq "0" ]
then
echo "No arguments supplied"
else
echo "Hello world"
fi
une Autre façon de détecter si les arguments passés au script:
((!$#)) && echo No arguments supplied!
Note que (( expr ))
les causes de l'évaluation de l'expression que par les règles de Shell " Arithmétique .
pour sortir en l'absence de tout argument, on peut dire:
((!$#)) && echo No arguments supplied! && exit 1
Another (analogue) façon de dire ce qui précède serait:
let $# || echo No arguments supplied
let $# || { echo No arguments supplied; exit 1; } # Exit if no arguments!
help let
dit:
let: let arg [arg ...]
Evaluate arithmetic expressions. ... Exit Status: If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.
j'utilise souvent cet extrait pour des scripts simples:
#!/bin/bash
if [ -z "" ]; then
echo -e "\nPlease call '"151900920" <argument>' to run this command!\n"
exit 1
fi
comme petit rappel, les opérateurs de tests numériques de Bash ne fonctionnent que sur des entiers ( -eq
, -lt
, -ge
, etc.)
je tiens à m'assurer que mon $vars sont ints par
var=$(( var + 0 ))
avant que je les teste, juste pour se défendre contre l'erreur" [: integer arg required".
Si vous souhaitez vérifier si l'argument n'existe, vous pouvez vérifier si le nombre d'arguments est supérieur ou égal à votre cible numéro d'argument.
le script suivant montre comment cela fonctionne
test.sh
#!/usr/bin/env bash
if [ $# -ge 3 ]
then
echo script has at least 3 arguments
fi
produit la sortie suivante
$ ./test.sh
~
$ ./test.sh 1
~
$ ./test.sh 1 2
~
$ ./test.sh 1 2 3
script has at least 3 arguments
$ ./test.sh 1 2 3 4
script has at least 3 arguments
seulement parce qu'il y a plus de point de base pour faire remarquer que je vais ajouter que vous pouvez simplement tester votre chaîne de caractères est null:
if [ "" ]; then
echo yes
else
echo no
fi
de même si vous attendez arg compte juste tester votre dernier:
if [ "" ]; then
echo has args correct or not
else
echo fixme
fi
et ainsi de suite avec tout arg ou var