Je n'ai trouvé aucune ressource simple et simple expliquant la signification et la correction de l'erreur de shell BASH suivante, donc je poste ce que j'ai trouvé après l'avoir recherché.
L'erreur:
-bash: [: too many arguments
Version par Google: bash open square bracket colon too many arguments
.
Contexte: une condition if entre crochets simples avec un opérateur de comparaison simple comme égal, supérieur à etc., par exemple:
VARIABLE=$(/some/command);
if [ $VARIABLE == 0 ]; then
# some action
fi
bash
if-statement
arguments
user56reinstatemonica8
la source
la source
Réponses:
Si votre
$VARIABLE
est une chaîne contenant des espaces ou d'autres caractères spéciaux et que des crochets simples sont utilisés (qui est un raccourci pour latest
commande), la chaîne peut être divisée en plusieurs mots. Chacun d'eux est traité comme un argument distinct.Donc, une variable est divisée en plusieurs arguments :
La même chose sera vraie pour tout appel de fonction qui met une chaîne contenant des espaces ou d'autres caractères spéciaux.
Solution facile
Enveloppez la sortie variable entre guillemets doubles, en la forçant à rester comme une chaîne (donc un argument). Par exemple,
Aussi simple que cela. Mais passez à "Attention aussi ..." ci-dessous si vous ne pouvez pas non plus garantir que votre variable ne sera pas une chaîne vide ou une chaîne qui ne contient que des espaces.
Ou, une solution alternative consiste à utiliser des crochets doubles (qui est un raccourci pour la
new test
commande).Cela n'existe cependant qu'en bash (et apparemment korn et zsh), et peut donc ne pas être compatible avec les shells par défaut appelés par
/bin/sh
etc.Cela signifie que sur certains systèmes, cela peut fonctionner à partir de la console, mais pas lorsqu'il est appelé ailleurs, comme à partir de
cron
, selon la façon dont tout est configuré.Cela ressemblerait à ceci:
Si votre commande contient des crochets doubles comme celui-ci et que vous obtenez des erreurs dans les journaux mais que cela fonctionne à partir de la console, essayez d'échanger le
[[
pour une alternative suggérée ici, ou assurez-vous que tout ce qui exécute votre script utilise un shell qui prend en charge[[
akanew test
.Attention également à l'
[: unary operator expected
erreurSi vous voyez l'erreur "trop d'arguments", il y a de fortes chances que vous obteniez une chaîne d'une fonction avec une sortie imprévisible. S'il est également possible d'obtenir une chaîne vide (ou toutes les chaînes d'espaces blancs), cela serait traité comme un argument zéro même avec la "solution rapide" ci-dessus, et échouerait avec
[: unary operator expected
Il en va de même si vous êtes habitué à d'autres langues - vous ne vous attendez pas à ce que le contenu d'une variable soit effectivement imprimé dans le code comme celui-ci avant d'être évalué.
Voici un exemple qui empêche à la fois les erreurs
[: too many arguments
et les[: unary operator expected
erreurs: remplacer la sortie par une valeur par défaut si elle est vide (dans cet exemple,0
), avec des guillemets doubles entourant le tout:(ici, l'action se produira si $ VARIABLE est 0 ou vide. Naturellement, vous devez changer le 0 (la valeur par défaut) en une valeur par défaut différente si un comportement différent est souhaité)
Remarque finale: puisqu'il
[
s'agit d'un raccourci pourtest
, tout ce qui précède est également vrai pour l'erreurtest: too many arguments
(et aussitest: unary operator expected
)la source
i=$(some_command); i=$((i)); if [ "$i" == 0 ] ...
Je suis juste tombé sur ce message, en obtenant la même erreur, en essayant de tester si deux variables sont toutes les deux vides (ou non vides). Cela s'avère être une comparaison composée - 7.3. Autres opérateurs de comparaison - Guide de script Bash avancé ; et j'ai pensé que je devrais noter ce qui suit:
pensant que cela signifie "vide" au début; mais cela signifie que "le fichier existe" - à utiliser-e
-z
pour tester une variable vide (chaîne)test
s et&&
eux:[ ... ] && [ ... ]
-a
opérateur en un seultest
:[ ... -a ... ]
Voici une commande de travail (recherche dans tous les fichiers txt dans un répertoire et vidage de ceux qui
grep
trouvent contiennent les deux mots):Edit 12 août 2013: note de problème connexe:
Notez que lors de la vérification de l'égalité des chaînes avec classique
test
(simple crochet[
), vous DEVEZ avoir un espace entre l'opérateur "est égal", qui dans ce cas est un seul=
signe "égal" (bien que deux signes égaux==
semblent être acceptés comme égalité) opérateur aussi). Ainsi, cela échoue (en silence):... mais ajoutez de l'espace - et tout a l'air bien:
la source
((A || B) && C)
?Vous pouvez également obtenir les erreurs
[: too many arguments
or[: a: binary operator expected
si vous essayez de tester tous les arguments"$@"
Cela fonctionne correctement si vous appelez
foo.sh
oufoo.sh arg1
. Mais si vous passez plusieurs arguments commefoo.sh arg1 arg2
, vous obtiendrez des erreurs. C'est parce qu'il est étendu à[ -z arg1 arg2 ]
, ce qui n'est pas une syntaxe valide.La bonne façon de vérifier l'existence d'arguments est
[ "$#" -eq 0 ]
. ($#
est le nombre d'arguments).la source
Parfois Si vous touchez accidentellement le clavier et que vous supprimez un espace.
Déclenche ce message d'erreur. Notez que l'espace avant «]» est requis.
la source
J'ai eu le même problème avec mes scripts. Mais quand j'ai fait quelques modifications, cela a fonctionné pour moi. J'ai aimé ça: -
de cette façon, j'ai résolu mon problème. J'espère que cela vous aidera aussi.
la source