Sens de “[: trop d'arguments” erreur de si [] (crochets)
Je ne pouvais pas trouver un simple ressource d'expliciter le sens et corrigé pour la suite de la shell BASH erreur, donc je poste ce que j'ai trouvé après des recherches sur elle.
L'erreur:
-bash: [: too many arguments
Google-friendly version: bash open square bracket colon too many arguments
.
Contexte: un si l'état de simples crochets avec un simple opérateur de comparaison comme d'égal à égal, supérieur, etc, par exemple:
VARIABLE=$(/some/command);
if [ $VARIABLE == 0 ]; then
# some action
fi
- Où est le code qui a produit cette erreur?
- Voir aussi Quand à envelopper des guillemets autour d'une variable du shell?
Vous devez vous connecter pour publier un commentaire.
Si votre
$VARIABLE
est une chaîne de caractères contenant des espaces ou d'autres caractères spéciaux, et seul les crochets sont utilisés (qui est un raccourci pour letest
de commande), puis la chaîne peut être divisé en plusieurs mots. Chacun de ces est considéré comme un argument.De sorte que une variable est divisée en de nombreux arguments:
Il en sera de même pour tout appel de fonction qui met une chaîne de caractères contenant des espaces ou d'autres caractères spéciaux.
Easy fix
Envelopper la variable de sortie dans les guillemets, la forçant à rester sous forme de chaîne (donc un argument). Par exemple,
Simple que cela. Mais passer à la "méfie-toi Aussi..." ci-dessous si vous aussi vous ne pouvez pas garantir votre variable ne sera pas une chaîne vide, ou une chaîne qui ne contient rien, mais les espaces.
Ou, un suppléant fixer est d'utiliser des doubles crochets (qui est un raccourci pour le
new test
de commande).Cela n'existe que dans bash (et, apparemment, korn et zsh) cependant, et ne peuvent donc pas être compatible avec les valeurs par défaut des coquillages appelés par
/bin/sh
etc.Cela signifie que sur certains systèmes, il peut fonctionner à partir de la console, mais pas quand on l'appelle d'ailleurs, à l'instar de
cron
, selon la façon dont tout est configuré.Il devrait ressembler à ceci:
Si votre commande contient des doubles crochets comme ceci et vous obtenez des erreurs dans les logs, mais il fonctionne à partir de la console, essayez de retirer le
[[
pour une alternative suggérée ici, ou, s'assurer que tout fonctionne votre script utilise un shell qui prend en charge[[
akanew test
.Aussi méfiez-vous de la
[: unary operator expected
erreurSi vous êtes en voyant le "trop d'arguments" erreur, les chances sont que vous obtenez une chaîne de caractères à partir d'une fonction à l'évolution imprévisible de sortie. Si il est également possible d'obtenir une chaîne vide (ou tous les espaces de chaîne), ce serait considéré comme égal à zéro des arguments de même avec l'au-delà "quick fix", et ne permettrait pas avec
[: unary operator expected
C'est la même chose "chasse aux sorcières" si vous êtes utilisé pour d'autres langues, vous ne vous attendez pas le contenu d'une variable à être effectivement imprimé dans le code comme ceci avant d'être évalué.
Voici un exemple qui empêche à la fois la
[: too many arguments
et la[: unary operator expected
erreurs: remplacement de la sortie avec une valeur par défaut si elle est vide (dans cet exemple,0
), avec des guillemets doubles enroulé autour de l'ensemble de la chose:(ici, l'action va se passer si $VARIABLE est 0 ou vide. Naturellement, vous devez modifier la valeur 0 (valeur par défaut) à une autre valeur par défaut si elle est différente de comportement est voulu)
Note finale: Depuis
[
est un raccourci pourtest
, tous les ci-dessus est également vrai pour l'erreurtest: too many arguments
(et aussitest: unary operator expected
)i=$(some_command); i=$((i)); if [ "$i" == 0 ] ...
Juste tombé sur ce post, par obtenir la même erreur, en essayant de tester si deux variables sont les deux vide (ou non-vide). Qui s'avère être un composé de comparaison - 7.3. D'Autres Opérateurs De Comparaison - Advanced Bash Scripting Guide; et j'ai pensé que je devrais noter les points suivants:
pensant qu'il signifie "vide" au premier abord, mais cela signifie que "le fichier existe" - utilisation-e
-z
pour le test de vide variable (string)test
s et&&
eux:[ ... ] && [ ... ]
-a
opérateur dans un seultest
:[ ... -a ... ]
Ici est un travail de commande (recherche dans tous les fichiers txt dans un répertoire, et le dumping de ceux qui
grep
trouve contenir à la fois des deux mots):modifier le 12 août 2013: problème lié à la remarque:
noter que lors de la vérification de la chaîne de l'égalité avec les classiques de la
test
(un seul crochet[
), vous DOIT un espace entre le "égale" de l'opérateur, qui dans ce cas est un singe "est égal à"=
signe (bien que les deux égaux " signes==
semblent être accepté comme opérateur d'égalité de trop). Ainsi, elle échoue (silencieusement):... mais ajouter de l'espace, et tout a l'air bon:
((A || B) && C)
?Un autre scénario que vous pouvez obtenir le
[: too many arguments
ou[: a: binary operator expected
erreurs sont si vous essayez de tester tous les arguments"$@"
Il fonctionne correctement si vous appelez
foo.sh
oufoo.sh arg1
. Mais si vous passez plusieurs arguements commefoo.sh arg1 arg2
, vous obtiendrez des erreurs. C'est parce que c'est d'être étendus à[ -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).À certains moments, Si vous touchez le clavier accidentellement et enlevé un espace.
Va déclencher ce message d'erreur. Remarque l'espace avant ']' est nécessaire.
J'ai eu le même problème avec mes scripts. Mais quand j'ai fait quelques modifications, il a travaillé pour moi. J'ai fait comme ceci :-
de cette façon, j'ai résolu mon problème. Espère que cela va vous aider trop.