Bill Parker wird abgewählt, weil seine Definitionen von der normalen Codekonvention abweichen. Normalerweise wird true als 0 definiert und false als nicht null. 1 wird für false funktionieren, genauso wie 9999 und -1. Das Gleiche gilt für Funktionsrückgabewerte - 0 ist Erfolg und alles andere als null ist ein Fehler. Entschuldigung, ich habe noch nicht genug Glaubwürdigkeit, um ihm direkt zu antworten oder zu stimmen.
Bash empfiehlt jetzt, anstelle von einfachen eckigen Klammern doppelte eckige Klammern zu verwenden, und der Link, den Mike Holt gegeben hat, erklärt die Unterschiede in ihrer Funktionsweise. 7.3. Andere Vergleichsoperatoren
Zum Einen ist -eq
ein numerischer Operator, weshalb der Code
#**** HINWEIS *** Dies gibt einen Fehler aus *****
The_world_is_flat=0;
if [ "${The_world_is_flat}" -eq true ]; then
Ein Fehler verursacht, da ein Integer-Ausdruck erwartet wird. Dies gilt für beide Parameter, da keiner von ihnen ein Integer-Wert ist. Aber wenn wir doppelte eckige Klammern verwenden, wird kein Fehler ausgegeben, aber es wird ein falscher Wert zurückgegeben (nun ja, in 50% der möglichen Permutationen). Es wird zu [[0 -eq true]] = Erfolg ausgewertet, aber auch zu [[0 -eq false]] = Erfolg, was falsch ist (hmmm... was ist mit diesem Befehl als numerischer Wert?).
#**** HINWEIS *** Dies gibt falsche Ausgabe *****
The_world_is_flat=true;
if [[ "${The_world_is_flat}" -eq true ]]; then
Es gibt auch andere Varianten des Bedingungsbausteins, die ebenfalls falsche Ausgaben liefern werden. Grundsätzlich alles (außer der oben aufgeführten Fehlerbedingung), das eine Variable auf einen numerischen Wert setzt und sie mit einem true/false-Befehl vergleicht oder eine Variable auf einen true/false-Befehl setzt und sie mit einem numerischen Wert vergleicht. Auch alles, was eine Variable auf einen true/false-Befehl setzt und einen Vergleich mit -eq
durchführt. Vermeiden Sie also -eq
für Boolesche Vergleiche und vermeiden Sie die Verwendung von numerischen Werten für Boolesche Vergleiche. Hier ist eine Zusammenfassung der Varianten, die ungültige Ergebnisse liefern:
# Mit Variable als Integer und Auswertung als true/false
# *** Dies gibt eine Fehlerwarnung aus und wird nicht ausgeführt: *****
The_world_is_flat=0;
if [ "${The_world_is_flat}" -eq true ]; then
# Mit Variable als Integer und Auswertung als true/false
# *** Diese Anweisungen werden nicht ordnungsgemäß ausgewertet: *****
The_world_is_flat=0;
if [ "${The_world_is_flat}" -eq true ]; then
#
if [[ "${The_world_is_flat}" -eq true ]]; then
#
if [ "${The_world_is_flat}" = true ]; then
#
if [[ "${The_world_is_flat}" = true ]]; then
#
if [ "${The_world_is_flat}" == true ]; then
#
if [[ "${The_world_is_flat}" == true ]]; then
# Mit Variable als true/false-Befehl und Auswertung als true/false
# *** Diese Anweisungen werden nicht ordnungsgemäß ausgewertet: *****
The_world_is_flat=true;
if [[ "${The_world_is_flat}" -eq true ]]; then
#
if [ "${The_world_is_flat}" = 0 ]; then
#
if [[ "${The_world_is_flat}" = 0 ]]; then
#
if [ "${The_world_is_flat}" == 0 ]; then
#
if [[ "${The_world_is_flat}" == 0 ]]; then
Also, nun dazu, was funktioniert. Verwenden Sie true/false-Befehle sowohl für Ihren Vergleich als auch für Ihre Auswertungen (wie Mike Hunt bemerkte, umgeben Sie sie nicht mit Anführungszeichen). Verwenden Sie dann entweder ein einfaches oder doppeltes Gleichheitszeichen (= oder ==) und entweder einfache oder doppelte eckige Klammern ([ ] oder [[ ]]). Persönlich bevorzuge ich das doppelte Gleichheitszeichen, weil es mich an logische Vergleiche in anderen Programmiersprachen erinnert, und doppelte Anführungszeichen einfach, weil ich gerne tippe. Also funktionieren diese:
# Mit Variable als Integer und Auswertung als true/false
# *** Diese Anweisungen werden ordnungsgemäß funktionieren: *****
#
The_world_is_flat=true/false;
if [ "${The_world_is_flat}" = true ]; then
#
if [[ "${The_world_is_flat}" = true ]]; then
#
if [ "${The_world_is_flat}" = true ]; then
#
if [[ "${The_world_is_flat}" == true ]]; then
Das ist alles.