comment vérifier si $ 1 et $ 2 sont nuls?

34

J'exécute un script qui passe l'argument de chaîne et que je veux faire si l'instruction suivante est affichée comme ci-dessous:

if [ $1 != '' ] && [ $2 != '' ]
then 
    do something.....

mais cela montrait Error too many argument . Pourquoi?

    
posée taymindis Woon 06.04.2014 - 18:31
la source

4 réponses

45

Essayez d’utiliser le test -z:

if [ -z "$1" ] && [ -z "$2" ]

De man bash :

-z string
   True if the length of string is zero.
    
réponse donnée Sylvain Pineau 06.04.2014 - 18:47
la source
11

Etant donné que cette balise porte la mention bash , je vous recommande d’utiliser le structure de test étendue ( [[...]] ) et oubliez les guillemets:

if [[ -z $1 && -z $2 ]]; then
...

Sauf si vous optez pour la compatibilité sh / POSIX, il n'y a aucune raison de ne pas utiliser [[ ]] .

    
réponse donnée muru 21.09.2014 - 15:38
la source
3

Ce qui suit fonctionne aussi,

if [ "$1" == "" && "$2" == ""]; then
    echo NULL
fi
    
réponse donnée Avinash Raj 06.04.2014 - 18:56
la source
2

Pour l'ancienne version de la réponse, voir la deuxième partie de cette réponse. Si vous voulez en savoir plus sur les détails, lisez la section

La cause du problème

Dans la question elle-même, il est rapporté que OP voit too many arguments error , ce qui, une fois testé dans bash , ne semble pas être le cas:

$ [ $1 != '' ] && [ $2 != '' ]
bash: [: !=: unary operator expected

Avec /bin/sh qui est en fait un lien symbolique vers /bin/dash sur Ubuntu, une erreur a été signalée comme suit:

$ sh
$ [ $1 != '' ] && [ $2 != '' ]
sh: 1: [: !=: unexpected operator

Et la version autonome /bin/test également:

$ /usr/bin/test $1 != ''  
/usr/bin/test: missing argument after ‘’

Note: Si vous vous demandez ce qui est /usr/bin/test et pourquoi j'utilise bash et sh , sachez que [ est un alias pour test commande, qui existe également en mode autonome. exécutable ou plus communément - en tant que shell intégré, ce que chaque shell utilisera en premier. Quant aux instructions if , elles fonctionnent sur les statuts de sortie des commandes. C’est pourquoi [ et test sont des commandes, tout le reste étant des arguments pour ces commandes. Un ordre incorrect de ces arguments de ligne de commande entraîne des erreurs.

Retour au sujet: comment OP at-il obtenu l’erreur non liée? Cependant, dans les 3 cas, le problème est le même: les variables non définies sont traitées comme des vides. Par conséquent, le shell voit avec ces variables non citées

[ != '' ]

qui rompt la syntaxe que test comprend. Rappelez-vous ce que j'ai dit à propos de l'ordre incorrect des arguments en ligne de commande? Par conséquent, pourquoi citer est important. Activons la sortie de diagnostic et voyons quel shell s'exécute:

$ set -x
# throws error
$ [ $1 != '' ] && [ $2 != '' ] 
+ '[' '!=' '' ']'
bash: [: !=: unary operator expected
# no error
$ [ "$1" != '' ] && [ "$2" != '' ] || echo null vars
+ '[' '' '!=' '' ']'
+ echo null vars
null vars

Meilleure façon de tester les variables non définies

Une approche très fréquente que vous voyez autour est la suivante:

 if [ "x$var1" == "x"  ] && [ "x$var2" == "x"  ];                                                                
 then
     echo "both variables are null"
 fi

Pour citer Gilles :

In [ "x$1" = x"" ], the x prefix ensures that x"$1" cannot possibly look like an operator, and so the only way the shell can parse this test is by treating = as a binary operator.

Vraisemblablement, cela devrait être assez portable puisque je les ai vus dans /bin/sh scripts. Il peut également être combiné comme dans

if [ "x${var1}${var2}" == "x" ]; then
    ...
fi

Bien sûr, nous pourrions utiliser -z flag, mais selon des recherches portant sur certains shells, notamment ksh88 (selon Stephane Chazelas ), cet indicateur est défectueux.

Voir aussi

réponse donnée Sergiy Kolodyazhnyy 25.12.2016 - 00:49
la source

Lire d'autres questions sur les étiquettes