Tato otázka má dvě části:
(a) Pochopení toho, co dělá vystřižený kód
(b) Pochopení rozdílu mezi stavem odchodu a stav návratu v kontextu bash
.
Zde je vystřižený kód, kterému se snažím porozumět:
if var=-2 && (( var+=2 ))
then
echo "True"
else
echo "False"
fi
Spuštěním tohoto příkazu vznikne False
. Nemohu pochopit, proč se to děje.
Pokud tomu dobře rozumím, zde je to, co se možná děje s if
podmínka:
(a) var=-2
vytvoří výstupní stav 0, protože přiřazení je úspěšné
(b) (( var+=2 ))
přidá 2 k hodnotě var
a výraz má hodnotu nula. Stav ukončení je tedy pro tento výraz 1
(c) 0 &&1 vytvoří existující stav 0, který pak použije if
konstruovat
if
konstrukt má jednoduše zkontrolovat stav ukončení a když je nula, vezme pak cesta. V kroku (c) výše je nula, ale skript stále používá ostatní cesta. Je to správný způsob, jak tomu rozumět?
Také stále vidím různé bash
texty používají stav ukončení a stav návratu zaměnitelně.
Pochybuji, že var=-2
přiřazení by mělo jakýkoli druh ukončení, protože se nejedná o program. Ale jakékoli vysvětlení rozdílu mezi dvěma bude skvělé.
Přijatá odpověď:
To je:
if
first list of commands
then
second list of commands
else
third list of commands
fi
To znamená spustit druhý seznam příkazů, pokud se první seznam příkazů vrátí s true /úspěch (nulový) výstupní stav, to znamená, pokud se poslední příkaz spuštění vrátí s nulovým výstupním stavem.
V:
var=-2 && ((var += 2))
Je to cmd1 && cmd2
kde cmd2
spustí se pouze v případě, že cmd1
je úspěšný.
var=-2
Obvykle bude úspěšný, dokud $var
nebyl nastaven pouze pro čtení, takže ((var += 2))
příkaz bude spuštěn:
((arithmetic expression))
Vrátí úspěch /pravda pokud je výraz správně vyhodnocen (žádná syntaktická chyba) a výsledek výrazu je nenulový.
((123))
,((1 + 1))
,((1 == 1))
vrátit true((0))
,((-2 + 2))
,((2 == -2))
vrátit false.((4294967296 * 4294967296))
vrací false ve většině shellů kvůli 64bitovému zalamování celých čísel
var += 2
jako aritmetický výraz provede přiřazení a vyhodnotí se na přiřazovanou hodnotu, zde 0, proto false stav ukončení.
Hodnotu, na které je založen stav ukončení, můžete zobrazit pomocí $((...))
Syntaxe aritmetického rozšíření:
$ echo "$((1 + 1)) $((2 == 2)) $((2 == -2)) $((var = -2)) $((var += 2))"
2 1 0 -2 0
Nebo jej přiřadit k proměnné:
$ var=-2; ((result = (var += 2)))
$ echo "$? $result $var"
1 0 0
$?
obsahuje stav ukončení předchozího příkazu. Až k if
/then
/else
/fi
se týká, 0 znamená pravda, cokoli jiného znamená nepravdu.
Zmatek zde pochází ze skutečnosti, že u aritmetických výrazů je to naopak: znamená nepravda a cokoli jiného znamená pravdu (například
2 == 2
je 1
zatímco 2 < 1
je ).
Abyste se nestarali o rozdíl, zapomeňte na $?
a jeho možné hodnoty. Přemýšlejte v pojmech boolean pravda /nepravda , úspěch /selhání .
grep -q foo file
Vrátí hodnotu true if foo
se nachází v file
.
[ "$a" = "$b" ]
Vrátí hodnotu true, pokud $a
obsahuje totéž jako $b
.
((6 * 3 - 12))
((4 == 1))
Vraťte hodnotu true, pokud je výsledkem aritmetického výrazu nenulové číslo.
Nezáleží na tom, zda jsou pravdivé /nepravda jsou vyjádřeny jako 0 nebo 1 výstupního stavu těchto grep
/[
příkazy nebo ((...))
konstrukce.