Si votre $VARIABLE
est une chaîne de caractères contenant des espaces ou d'autres caractères spéciaux, et des crochets simples sont utilisés (qui est un raccourci pour le test
), alors la chaîne peut être divisée en plusieurs mots. Chacun de ces mots est traité comme un argument distinct.
Alors que une variable est divisée en plusieurs arguments :
VARIABLE=$(/some/command);
# returns "hello world"
if [ $VARIABLE == 0 ]; then
# fails as if you wrote:
# if [ hello world == 0 ]
fi
Il en sera de même pour tout appel de fonction qui dépose une chaîne de caractères contenant des espaces ou d'autres caractères spéciaux.
Correction facile
Enveloppez la sortie de la variable entre des guillemets doubles, pour qu'elle reste une seule chaîne (donc un seul argument). Par exemple,
VARIABLE=$(/some/command);
if [ "$VARIABLE" == 0 ]; then
# some action
fi
C'est 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, un solution de rechange est d'utiliser des doubles crochets (ce qui est un raccourci pour l'option new test
commande).
Cependant, ceci n'existe que dans 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, il peut fonctionner à partir de la console mais pas lorsqu'il est appelé ailleurs, par exemple à partir de cron
selon la façon dont tout est configuré.
Cela ressemblerait à ceci :
VARIABLE=$(/some/command);
if [[ $VARIABLE == 0 ]]; then
# some action
fi
Si votre commande contient des doubles crochets comme ceci et que vous obtenez des erreurs dans les journaux mais qu'elle fonctionne à partir de la console, essayez d'intervertir les éléments suivants [[
pour une alternative suggérée ici, ou, assurez-vous que ce qui exécute votre script utilise un shell qui supporte [[
alias new test
.
Méfiez-vous également de la [: unary operator expected
erreur
Si vous voyez l'erreur "trop d'arguments", il y a de fortes chances que vous obteniez une chaîne de caractères d'une fonction dont la sortie est imprévisible. S'il est également possible d'obtenir une chaîne vide (ou une chaîne de caractères avec espaces), il serait traité comme un argument nul, même avec la "solution rapide" ci-dessus, et échouerait avec la commande [: unary operator expected
C'est le même problème si vous êtes habitué à d'autres langages - vous ne vous attendez pas à ce que le contenu d'une variable soit effectivement imprimé dans le code avant qu'il ne soit évalué.
Voici un exemple qui empêche à la fois le [: too many arguments
y el [: unary operator expected
erreurs : remplacement de la sortie par une valeur par défaut si elle est vide (dans cet exemple, 0
), avec des guillemets autour de l'ensemble :
VARIABLE=$(/some/command);
if [ "${VARIABLE:-0}" == 0 ]; then
# some action
fi
(ici, l'action se produira si $VARIABLE est 0, ou vide. Naturellement, vous devez changer la valeur 0 (la valeur par défaut) par une autre valeur par défaut si vous souhaitez un comportement différent).
Note finale : Depuis [
est un raccourci pour test
tout ce qui précède est également vrai pour l'erreur test: too many arguments
(et aussi test: unary operator expected
)
1 votes
Où se trouve le code qui a produit cette erreur spécifique ?
0 votes
Voir aussi Quand mettre des guillemets autour d'une variable shell ?