Errore "operatore unario previsto" in Bash se condizione


225

Ho cercato di capire cosa c'è che non va in questo, ma non riesco a capirlo ..

Questa è la parte sembra avere un errore.

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

Ottengo questo errore:

calc_1.2: line 75: [: =: unary operator expected

4
Penso che la tua ifaffermazione sulla riga 75 abbia bisogno di a fi.
Steve,

7
In caso di dubbi, citare vari.
Koola,

9
@koola, virgolette "sempre".
Cugina Cocaina,

Risposte:


480

Se sai che userai sempre bash, è molto più facile usare sempre il comando composto condizionale a doppia parentesi [[ ... ]], invece della versione a parentesi singola compatibile con Posix [ ... ]. All'interno di un [[ ... ]]composto, la suddivisione delle parole e l'espansione del percorso non vengono applicate alle parole, quindi puoi fare affidamento

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

per confrontare il valore di $aug1con la stringa and.

Se lo usi [ ... ], devi sempre ricordare di raddoppiare le variabili in questo modo:

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

Se non citate l'espansione della variabile e la variabile non è definita o vuota, svanisce dalla scena del crimine, lasciando solo

if [ = "and" ]; 

che non è una sintassi valida. (Avrebbe anche esito negativo con un messaggio di errore diverso se $aug1incluso spazio bianco o metacaratteri shell).

L' [[operatore moderno ha molte altre funzioni interessanti, tra cui la corrispondenza delle espressioni regolari.


9
"moderno"? Non è [[ sempre stato a bash? È stato nella conchiglia di Korn per oltre vent'anni e le date precedenti bash. (So ​​cosa intendi dire)
cdarke del

31

Mi ci è voluto un po 'per trovarlo, ma nota che se hai un errore di spaziatura otterrai anche lo stesso errore:

[: =: unary operator expected

Corretta:

if [ "$APP_ENV" = "staging" ]

vs

if ["$APP_ENV" = "staging" ]

Come sempre l'impostazione della -xvariabile di debug aiuta a trovare questi:

set -x

Qualcuno mi ha lasciato in eredità questo bug in uno script di build. Mi hai salvato un po 'di tempo, grazie!
Kyle,

8

Prova ad assegnare un valore a $aug1prima di usarlo nelle if[]istruzioni; il messaggio di errore scompare in seguito.


0

tu dici ... :

elif [$ operation = "man"]; allora se [$ aug1 = "add"]; quindi # <- Riga 75 echo "Pagina man per: aggiungi" echo "" echo "Sintassi: aggiungi [numero 1] [numero 2]" echo "" echo "Descrizione:" echo "Aggiungi due numeri diversi insieme." echo "" echo "Informazioni:" echo "Aggiunto in v1.0" echo "" elif [-z $ aug1]; then echo "Specificare un comando per leggere la pagina man." else echo "Non esiste una pagina di manuale per quel comando." fi

penso che sia solo lo spazio ... fai così:

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

-11

Puoi anche impostare un valore predefinito per la variabile, quindi non è necessario utilizzare due "[", che equivale a due processi ("[" è in realtà un programma) anziché uno.

Va da questa sintassi: $ {VARIABLE: -default}.

Il tutto deve essere pensato in modo tale che questo valore "predefinito" sia qualcosa di distinto da un valore / contenuto "valido".

Se ciò non è possibile per qualche motivo, probabilmente dovrai aggiungere un passaggio come verificare se esiste un valore, sulla falsariga di "if [-z $ VARIABLE]; quindi fai eco" la variabile deve essere riempita "", oppure " if [! -z $ VARIABLE]; quindi #everything va bene, procedi con il resto dello script ".


3
[[non sta generando due processi, è un built-in di shell (ed [è anche un built-in di Bash). [[è diverso da [ [, che tratta il secondo [come una stringa
user123444555621
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.