Portál AbcLinuxu, 12. května 2025 09:03

Dotaz: BASH - Jednořádkové podmínky

9.8.2012 11:11 MM
BASH - Jednořádkové podmínky
Přečteno: 400×
Odpovědět | Admin
Ahoj, mám takovou podmínku, ale return se provede vždy, proč? Díky
[ $? == 1 ] || [ $? == 255 ] && rm -f $DIALOG; return

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

9.8.2012 11:25 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: BASH - Jednořádkové podmínky
Odpovědět | | Sbalit | Link | Blokovat | Admin

Protože je oddělen středníkem, takže nemá s předchozím složeným příkazem nic společného. Středník je víceméně ekvivalentní konci řádku.

Osobně bych se vykašlal na šetření znaky a upřednostnil srozumitelnost:

if [ $? = 1 -o $? = 255 ]; then
  rm -f "$DIALOG"
  return
fi

Skládání operátorů || a && je strašně náchylné na chyby a je lepší se mu vyhnout.

9.8.2012 12:17 loupak
Rozbalit Rozbalit vše Re: BASH - Jednořádkové podmínky
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud nepotrebujes else vetev, tak takle
[ $? = 1 -o $? = 255 ] && {
  rm -f "$DIALOG"
  return
}
9.8.2012 12:29 Kit
Rozbalit Rozbalit vše Re: BASH - Jednořádkové podmínky
Ono to funguje i s větví else, ale občas se v tom nasekají chyby.
[ $? = 1 -o $? = 255 ] && {
  rm -f "$DIALOG"
  return
} || {
  echo "Větev else"
}
9.8.2012 13:09 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: BASH - Jednořádkové podmínky

To je právě to, na co jsem narážel v první odpovědi:

  A && B || C

lze použít pouze v případě, kdy máme jistotu, že B nemůže selhat (jako v tom vašem příkladu), jinak se provedou B i C.

9.8.2012 13:21 Kit
Rozbalit Rozbalit vše Re: BASH - Jednořádkové podmínky
Zajímavé chování. Stačí na konec B přidat příkaz, který zaručeně neselže a C se neprovede ani když uvnitř B něco selže. Chová se to pak podle původního předpokladu.
9.8.2012 14:09 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: BASH - Jednořádkové podmínky

To chování je logickým důsledkem pravidel, podle kterých ty operátory fungují:

  • v konstrukci A && B se druhý příkaz provádí, pokud první vrátí nulu
  • v konstrukci A || B se druhý příkaz provádí, pokud první vrátí nenulu
  • v obou případech je návratovou hodnotou složeného příkazu návratová hodnota posledního příkazu, který se provedl
  • asociuje se zleva

Bohužel nadužívání ve skriptech často vede k tomu, že kdo ta pravidla nezná, bere operátory jako if-then a else a pak může být nemile překvapen.

9.8.2012 18:59 MM
Rozbalit Rozbalit vše Re: BASH - Jednořádkové podmínky
Odpovědět | | Sbalit | Link | Blokovat | Admin
Hm, ať se dívám jak se dívám, tak přepinač -o jsem fakt nikde nenašel.. Nějaký zdroj? A jak se zapisuje třeba OR ? Díky

http://www.abclinuxu.cz/clanky/navody/bash-iii
9.8.2012 19:48 Kit
Rozbalit Rozbalit vše Re: BASH - Jednořádkové podmínky
-o v daném místě není přepínač, ale operátor OR.
9.8.2012 19:56 MM
Rozbalit Rozbalit vše Re: BASH - Jednořádkové podmínky
Dík, a operátor AND se zapisuje jak?
9.8.2012 20:04 Kit
Rozbalit Rozbalit vše Re: BASH - Jednořádkové podmínky
Nepřipadáš si trapně? Když zadáš
man test
tak je to hned na první stránce společně s dalšími operátory.
9.8.2012 20:18 MM
Rozbalit Rozbalit vše Re: BASH - Jednořádkové podmínky
Konečně kur*a pořádný manuál !! Dík, akorát teda slovo test se mi s tím nějak nespojuju :-)
9.8.2012 20:26 Kit
Rozbalit Rozbalit vše Re: BASH - Jednořádkové podmínky
Hranaté závorky jsou jen syntaktický cukr pro příkaz test.
Pavel Stárek avatar 10.8.2012 12:11 Pavel Stárek | skóre: 44 | blog: Tady bloguju já :-) | Kolín
Rozbalit Rozbalit vše Re: BASH - Jednořádkové podmínky
info bash je ještě možná lepší.
Kdo chce, hledá způsob; kdo nechce, hledá důvod.
10.8.2012 17:14 Sten
Rozbalit Rozbalit vše Re: BASH - Jednořádkové podmínky
Anebo rovnou
man [
:-)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.