2017-05-09 3 views
0

ich viel Spaß habe mit Bourne-Shell zu spielen, aber ich bin vor ein recht kryptischen Situation Bedingungen in Bezug auf:Bourne Shell Bedingte Operatoren

#! /bin/sh 

a=1 
b=2 
c="0 kB/s" 

if [ "$a" -eq 1 ] ; then echo "a = 1: true" ; else echo "a = 1: false" ; fi 
if [ "$b" -gt 0 ] ; then echo "b > 0: true" ; else echo "b > 0: false" ; fi 
if [ "$c" != "0 kB/s" ] ; then echo "c <> 0: true" ; else echo "c <> 0: false" ; fi 
if [ "$a" -eq 1 ] || [ "$b" -gt 0 ] ; then echo "a = 1 or b > 0: true" ; else echo "a = 1 or b > 0: false" ; fi 
if [ "$a" -eq 1 ] || [ "$b" -gt 0 ] && [ "$c" != "0 kB/s" ] ; then echo "a = 1 or b > 0 and c <> 0: true" ; else echo "a = 1 or b > 0 and c <> 0: false" ; fi 
if [ true ] || [ true ] && [ false ] ; then echo "true or true and false: true" ; else echo "true or true and false: false" ; fi 

gibt mir folgendes Ergebnis:

a = 1: true 
b > 0: true 
c <> 0: false 
a = 1 or b > 0: true 
a = 1 or b > 0 and c <> 0: false 
true or true and false: true 

Kurze Frage: Warum bekomme ich nicht a = 1 or b > 0 and c <> 0: true?

Vielen Dank für Ihre Hilfe ...

Antwort

0

|| und && hat gleiche Priorität, anders als in Sprachen, in denen die logischen UND-Verknüpfung fester als die logischen OR bindet. Dies bedeutet, dass Ihr Code geschrieben als äquivalent zu

if { [ "$a" -eq 1 ] || [ "$b" -gt 0 ]; } && [ "$c" != "0 kB/s" ] ; then 
    echo "a = 1 or b > 0 and c <> 0: true" 
else 
    echo "a = 1 or b > 0 and c <> 0: false" 
fi 

statt der erwarteten

if [ "$a" -eq 1 ] || { [ "$b" -gt 0 ] && [ "$c" != "0 kB/s" ]; } ; then 
    echo "a = 1 or b > 0 and c <> 0: true" 
else 
    echo "a = 1 or b > 0 and c <> 0: false" 
fi 
+0

Danke, aber warum dann ich sowieso bekommen 'wahr oder wahr und falsch: true'? –

+0

Weil 'true' und' false' keine booleschen Konstanten sind; sie sind nur nicht leere Strings, also sind '[true]' und '[false]' beide erfolgreich (sie sind äquivalent zu '[-n true]' bzw. '[-n false]'). – chepner

+0

Danke, zwei nützliche Antworten in einer Frage! –

Verwandte Themen