Erreur "opérateur unaire attendu" dans Bash si condition

225

J'ai essayé de comprendre ce qui ne va pas, mais je ne peux tout simplement pas le comprendre ..

C'est la partie qui semble recevoir une erreur.

elif [ $operation = "man" ]; then
    if [ $aug1 = "add" ]; then         # <- Line 75
    echo "Man Page for: add"
    echo ""
    echo "Syntax: add [number 1] [number 2]"
    echo ""
    echo "Description:"
    echo "Add two different numbers together."
    echo ""
    echo "Info:"
    echo "Added in v1.0"
    echo ""
elif [ -z $aug1 ]; then
    echo "Please specify a command to read the man page."
else
    echo "There is no manual page for that command."
fi

Je reçois cette erreur:

calc_1.2: line 75: [: =: unary operator expected
Jordanss10
la source
4
Je pense que votre ifdéclaration à la ligne 75 a besoin d'un fi.
Steve
7
En cas de doute, citez vars.
koola
9
@koola, 'toujours' cite vars.
CousinCocaine

Réponses:

480

Si vous savez que vous allez toujours utiliser bash, il est beaucoup plus facile d'utiliser toujours la commande composée conditionnelle à double crochet [[ ... ]], au lieu de la version à support simple compatible Posix [ ... ]. À l'intérieur d'un [[ ... ]]composé, le fractionnement de mots et l'expansion des noms de chemin ne sont pas appliqués aux mots, vous pouvez donc vous fier à

if [[ $aug1 == "and" ]];

pour comparer la valeur de $aug1avec la chaîne and.

Si vous utilisez [ ... ], vous devez toujours vous rappeler de doubler les variables comme ceci:

if [ "$aug1" = "and" ];

Si vous ne citez pas l'expansion de la variable et que la variable est indéfinie ou vide, elle disparaît de la scène du crime, ne laissant que

if [ = "and" ]; 

qui n'est pas une syntaxe valide. (Il échouerait également avec un message d'erreur différent s'il $aug1incluait des espaces blancs ou des métacaractères shell.)

L' [[opérateur moderne possède de nombreuses autres fonctionnalités intéressantes, notamment la correspondance d'expressions régulières.

rici
la source
9
"moderne"? [[A-t-il toujours été dans bash? Il est en coquille de Korn depuis plus de vingt ans et date d'avant bash. (Je sais ce que tu veux dire cependant)
cdarke
31

Cela m'a pris un certain temps pour trouver cela, mais notez que si vous avez une erreur d'espacement, vous obtiendrez également la même erreur:

[: =: unary operator expected

Correct:

if [ "$APP_ENV" = "staging" ]

contre

if ["$APP_ENV" = "staging" ]

Comme toujours -x variable de débogage aide à les trouver:

set -x
Juha Vehnia
la source
Quelqu'un m'a légué ce bogue dans un script de construction. M'a fait gagner du temps, merci!
Kyle
8

Essayez d'affecter une valeur à $aug1avant de l'utiliser dans des if[]instructions; le message d'erreur disparaîtra ensuite.

yilee
la source
0

tu dis ... :

elif [$ operation = "man"]; alors si [$ aug1 = "add"]; puis # <- Ligne 75 echo "Page de manuel pour: ajouter" echo "" echo "Syntaxe: ajouter [numéro 1] [numéro 2]" echo "" echo "Description:" echo "Ajoutez deux nombres différents ensemble." echo "" echo "Info:" echo "Ajouté dans la v1.0" echo "" elif [-z $ aug1]; puis echo "Veuillez spécifier une commande pour lire la page de manuel." else echo "Il n'y a pas de page de manuel pour cette commande." Fi

je pense que c'est juste l'espace ... fais comme ça:

elif [$operation = "man"]; then
    if [ $aug1 = "add" ]; then         # <- Line 75
    echo "Man Page for: add"
    echo ""
    echo "Syntax: add [number 1] [number 2]"
    echo ""
    echo "Description:"
    echo "Add two different numbers together."
    echo ""
    echo "Info:"
    echo "Added in v1.0"
    echo ""
elif [-z $aug1]; then
    echo "Please specify a command to read the man page."
else
    echo "There is no manual page for that command."
fi
Renan Moura
la source
-11

Vous pouvez également définir une valeur par défaut pour la variable, vous n'avez donc pas besoin d'utiliser deux "[", ce qui équivaut à deux processus ("[" est en fait un programme) au lieu d'un.

Il passe par cette syntaxe: $ {VARIABLE: -default}.

Le tout doit être pensé de telle manière que cette valeur "par défaut" soit quelque chose de distinct d'une valeur / contenu "valide".

Si ce n'est pas possible pour une raison quelconque, vous devrez probablement ajouter une étape comme la vérification de la présence d'une valeur, dans le sens de "if [-z $ VARIABLE]; alors echo" la variable doit être remplie "", ou " si [! -z $ VARIABLE]; alors #tout va bien, continuez avec le reste du script ".

el guesto
la source
3
[[ne génère pas deux processus, il s'agit d'un shell intégré (et [est également intégré à Bash). [[est différent de [ [, qui traite le second [comme une chaîne
user123444555621