Je dois 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'entrée argument1 pour voir s'il existe?
Il 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 été transmis.
Ou vous pouvez vérifier si un argument est une chaîne vide ou pas:
if [ -z "$1" ]
then
echo "No argument supplied"
fi
Le commutateur -z
testera si le développement de "$ 1" est une chaîne nulle ou non. S'il s'agit d'une chaîne nulle, le corps est exécuté.
Il vaut mieux démontrer de cette façon
if [[ $# -eq 0 ]] ; then
echo 'some message'
exit 1
fi
Vous devez normalement quitter si vous avez trop peu d'arguments.
Dans certains cas, vous devez vérifier si l'utilisateur a passé un argument au script et, dans le cas contraire, revenir à une valeur par défaut. Comme dans le script ci-dessous:
scale=${2:-1}
emulator @$1 -scale $scale
Ici, si l'utilisateur n'a pas passé scale
comme second paramètre, je lance l'émulateur Android avec -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 le varname
non défini au lieu de renvoyer la valeur Word
;${varname:?message}
qui retourne varname
s'il est défini et n'est pas nul ou imprime le message
et annule le script (comme dans le premier exemple);${varname:+Word}
qui retourne Word
seulement si varname
est défini et n'est pas nul; renvoie null sinon.Essayer:
#!/bin/bash
if [ "$#" -eq "0" ]
then
echo "No arguments supplied"
else
echo "Hello world"
fi
Une autre façon de détecter si des arguments ont été transmis au script:
((!$#)) && echo No arguments supplied!
Notez que (( expr ))
provoque l'évaluation de l'expression selon les règles de arithmétique en shell .
Pour sortir en l'absence d'arguments, on peut dire:
((!$#)) && echo No arguments supplied! && exit 1
Une autre manière (analogue) 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 "$1" ]; then
echo -e "\nPlease call '$0 <argument>' to run this command!\n"
exit 1
fi
Ce n'est que parce qu'il y a un point plus bas à souligner que j'ajouterai que vous pouvez simplement tester que votre chaîne est nulle:
if [ "$1" ]; then
echo yes
else
echo no
fi
De même, si vous attendez arg count, testez simplement votre dernier:
if [ "$3" ]; then
echo has args correct or not
else
echo fixme
fi
et ainsi de suite avec n'importe quel arg ou var
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
#!/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
Pour rappel, les opérateurs de test numériques de Bash ne fonctionnent que sur des entiers (-eq
, -lt
, -ge
, etc.)
J'aime m'assurer que mes $ vars sont reçus par
var=$(( var + 0 ))
avant de les tester, il suffit de se défendre contre l'erreur "[: integer arg required required".