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 la test
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 :
VARIABLE=$(/some/command);
# returns "hello world"
if [ $VARIABLE == 0 ]; then
# fails as if you wrote:
# if [ hello world == 0 ]
fi
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,
VARIABLE=$(/some/command);
if [ "$VARIABLE" == 0 ]; then
# some action
fi
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 decron
, 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 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 [[
aka new test
.
Attention également à l' [: unary operator expected
erreur
Si 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:
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 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 pour test
, tout ce qui précède est également vrai pour l'erreur test: too many arguments
(et aussi test: unary operator expected
)