GNU/Linux >> Znalost Linux >  >> Linux

Jak bude Bash hodnotit následující kód?

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.

Související:Mac – Jak nastavit bash balíčku macports pro použití z terminal.app?

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.


Linux
  1. Jak ladit Bash skript?

  2. Jak opustit kontejner Docker

  3. Jak nainstalovat R na Ubuntu 18.04

  1. Bash Shell Exit Status Tutorial s praktickými příklady

  2. Co jsou výstupní kódy Bash v Linuxu

  3. Jak ukončit, pokud příkaz selhal?

  1. Bash Prompt s posledním výstupním kódem

  2. Výstupní kód přiřazení proměnné k substituci příkazu v Bash

  3. Bash:Smyčka, dokud se stav ukončení příkazu nerovná 0