unaire operator verwacht fout in Bash als voorwaarde

Dit script krijgt een foutmelding:

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

Ik krijg deze foutmelding:

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

Antwoord 1, autoriteit 100%

Als je weet dat je altijd bash gaat gebruiken, is het veel gemakkelijker om altijd het voorwaardelijke samengestelde commando met dubbele haakjes [[ ... ]] te gebruiken, in plaats van de Posix-compatibele enkele haakje versie [ ... ]. Binnen een [[ ... ]]-verbinding worden woordsplitsing en padnaamuitbreiding niet toegepast op woorden, dus u kunt erop vertrouwen

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

om de waarde van $aug1 te vergelijken met de tekenreeks and.

Als u [ ... ] gebruikt, moet u altijd onthouden om variabelen als volgt te verdubbelen:

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

Als u de uitbreiding van de variabele niet citeert en de variabele is niet gedefinieerd of leeg, verdwijnt van de plaats delict en blijft alleen over

if [ = "and" ]; 

wat geen geldige syntaxis is. (Het zou ook mislukken met een ander foutbericht als $aug1 witruimte of shell-metatekens zou bevatten.)

De moderne operator [[] heeft tal van andere leuke functies, waaronder het matchen van reguliere expressies.


Antwoord 2, autoriteit 6%

Het kostte me wat tijd om dit te vinden, maar houd er rekening mee dat als je een spatiëringsfout hebt, je ook dezelfde fout krijgt:

[: =: unary operator expected

Correct:

if [ "$APP_ENV" = "staging" ]

vs

if ["$APP_ENV" = "staging" ]

Zoals altijd helpt het instellen van de debug-variabele -x om deze te vinden:

set -x

Antwoord 3

Probeer een waarde toe te wijzen aan $aug1 voordat u deze gebruikt in if[]-instructies; de foutmelding zal daarna verdwijnen.


Antwoord 4

U kunt ook een standaardwaarde voor de variabele instellen, zodat u niet twee “[” hoeft te gebruiken, wat neerkomt op twee processen (“[” is eigenlijk een programma) in plaats van één.

Het gaat door deze syntaxis: ${VARIABLE:-default}.

Het geheel moet zo worden bedacht dat deze “standaard” waarde iets anders is dan een “geldige” waarde/inhoud.

Als dat om de een of andere reden niet mogelijk is, moet u waarschijnlijk een stap toevoegen, zoals controleren of er een waarde is, in de trant van “if [ -z $VARIABLE ] ; dan echo “de variabele moet worden ingevuld”” , of “if [ ! -z $VARIABLE ] ; dan is #alles in orde, ga verder met de rest van het script”.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

10 + 14 =

Other episodes