vergelijking in shell-script met deling geeft altijd false

Ik schrijf een zeer eenvoudige vergelijking in shell bash script, maar ik snap het nooit goed:

count = 0

if [ expr $count/4 = 0 ];
then
  echo "yes";
else
  echo "no";
fi

geef je altijd nee?

1
toegevoegd de auteur olidev, de bron
Gewoon uit nieuwsgierigheid, wat probeer je hier te doen? Controleren of $ count/4 == 0 u alleen zal vertellen of $ count minder is dan 4. Waarom geen gebruiken als [$ count -lt 4] ?
toegevoegd de auteur Chriszuma, de bron

3 antwoord

Als je naar het expr-programma wilt bellen, moet je er eigenlijk naar bellen:

if [ $(expr $count/4) = 0 ]; then echo "yes"; else echo "no"; fi

Maar bash kan het intern doen:

if (( $count/4 == 0 )); then echo "yes"; else echo "no"; fi
5
toegevoegd
Eigenlijk hebt u met (()) niet eens de $ nodig. Dit zou doen: als ((count/4 == 0)); dan echo "ja"; anders echo "nee"; fi
toegevoegd de auteur Lee Netherton, de bron
Wauw, ik wist niet dat bash dat kon doen. EDIT: Het heeft even geduurd, maar ik heb een gids gevonden. Bedankt dat je me een nieuwe truc leert. tldp.org/LDP/abs/html/dblparens.html
toegevoegd de auteur Chriszuma, de bron

U moet opdrachtvervanging ( $() gebruiken of backticks) om de expressie eval te evalueren. Gebruik ook -eq voor vergelijking van gehele getallen :

if [ $(expr $count/4) -eq 0 ];
then
  echo "yes";
else
  echo "no";
fi
3
toegevoegd
Ja, de vergelijking met == werkt meestal, maar als de if-instructie is geschreven als als [$ (expr $ count/4) == 00] dan zou het een onbedoeld resultaat geven. Het is het beste om de vergelijkingsoperator te gebruiken die voor het doel is bedoeld.
toegevoegd de auteur Lee Netherton, de bron
+1, maar u kunt = gewoon laten.
toegevoegd de auteur Michael Krelin - hacker, de bron
Voor gehele getallen kunt u -eq of == gebruiken, omdat string-equivalentie en integerequivalentie hetzelfde zijn.
toegevoegd de auteur Chriszuma, de bron

Wat denk je hiervan

[[ count/4 -eq 0 ]] && echo 'yes' || echo 'no'
0
toegevoegd