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 ça se voit Error too many argument
. Pourquoi?
command-line
bash
scripts
taymindis Woon
la source
la source
[[ ]]
. Sinon, vous devez citer vos variables.$1
peut être non défini ou défini sur une chaîne nulle par l'utilisateur du script. Considérez cette séquence de commande:$ set '' bar
alors lesecho "x${1}x";
deux variables sont définies, mais l’une d’elles est nulle.Réponses:
Essayez d’utiliser le test -z:
De l'homme
bash
:la source
Puisque ceci est étiqueté
bash
, je recommande que l’on utilise la construction de test étendue ([[...]]
) , et oublie les guillemets:Sauf si vous optez pour
sh
la compatibilité / POSIX, il n'y a aucune raison de ne pas l'utiliser[[ ]]
.la source
Ce qui suit fonctionne aussi,
la source
&&
autres séparateurs de commandes logiques ne sont pas autorisés dans le classiquetest
. Vous devez utiliser d'autres constructions de test à la place (comme-a
, je pense)Pour l'ancienne version de la réponse, voir la deuxième partie de cette réponse. Si vous voulez connaître les détails, lisez la suite
La cause du problème
Dans la question elle-même, il est rapporté que OP voit
too many arguments error
, cebash
qui ne semble pas être le cas lors des tests :Avec
/bin/sh
qui est en fait un lien symbolique/bin/dash
sur Ubuntu, une erreur est signalée comme suit:Et les autonomes
/bin/test
aussi:Sidenote: Si vous vous demandez ce qui est
/usr/bin/test
et pourquoi je suis en utilisantbash
etsh
, alors vous devriez savoir que[
est alias pour latest
commande, qui existe également exécutable autonome ou plus communément - comme shell intégré qui est ce que chaque coquille utilisera d' abord . En ce qui concerne lesif
instructions, elles agissent sur les statuts de sortie des commandes, d'où le pourquoi[
ettest
sont des commandes, tout le reste étant des arguments pour ces commandes - un ordre incorrect de ces arguments en ligne de commande entraîne des erreurs.Retour au sujet: on ne sait pas comment OP a obtenu l'erreur sans rapport. 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, ce que le shell voit avec ces variables non précisées est:
qui casse la syntaxe qui
test
comprend. Vous souvenez-vous de ce que j'ai dit à propos de l'ordre incorrect des arguments en ligne de commande? D'où l'importance de citer. Activons la sortie de diagnostic et voyons quel shell s'exécute:Meilleure façon de tester les variables non définies
Une approche très fréquente que vous voyez autour est la suivante:
Pour citer Gilles :
Vraisemblablement, cela devrait être assez portable puisque je les ai vus dans des
/bin/sh
scripts. Il peut également être combiné comme dansBien sûr, nous pourrions utiliser le
-z
drapeau. Toutefois, selon certaines recherches, notamment ksh88 (selon Stéphane Chazelas ), ce drapeau est défectueux.Voir également
\[
vs\[\[
vs((
la source
Je pense que le titre de l'article n'est pas exact, car le message avait pour but de vérifier si $ 1 et $ 2 ne sont pas nuls. L'exemple donné manquait simplement les guillemets doubles dans $ 1 et $ 2 pour fonctionner. Les variables doivent être doubles pour être développées lors de la comparaison de chaînes. Mais, vérifier si $ 1 et $ 2 existent est la même chose que vérifier si $ 2 existe, puisqu’il n’existera pas si $ 1 n’existe pas. La commande 'if' n'est également pas nécessaire dans ce cas, car 'test' renvoie vrai / faux et utilise '&&' comme 'alors' si return est 0 / vrai:
Plus simple, avec -n (non nul):
Pour "vérifier si $ 1 et $ 2 sont nuls" serait la même chose que vérifier s'il n'y a pas de paramètre:
la source