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”.