Podmínka v bashi

webhope

Podmínka v bashi
« kdy: 05. 05. 2010, 23:42:56 »
Zdravím,
fakt neexistuje v bashi nějaká obdoba následujícího příkazu?
Kód: [Vybrat]
first= [[ $first == "one" ]] ? 1 : 0;

Mě to už nebaví psát pořád ty zdlouhavé podmínky if ; then fi  (vypadá to nepřehledně, když se to hlouběji vnořuje) ; Konkrétně u toho podmíněného přiřazování var=condition?1:0; by se to hodilo. Fakt tu v bashi není tento příkaz nebo to jen špatně píšu?


Atrament

Re: Podmínka v bashi
« Odpověď #1 kdy: 06. 05. 2010, 01:51:11 »
[ $first = one ] && first=1 || first=0

webhope

Re: Podmínka v bashi
« Odpověď #2 kdy: 06. 05. 2010, 12:06:07 »
To je asi malá chyba (== místo =), ale díky!

Zkoušel jsem dvě věci:
toto nefunguje:

[[ $temp == "Změnit" ]] && ( [[ $first == "1" ]] && first="0" || first="1" )

toto funguje:
[[ $temp == "Změnit" ]] &&  { [[ $first == "1" ]] && first="0" || first="1" ; }
neboli
if [[ $temp == "Změnit" ]]; then [[ $first == "1" ]] && first="0" || first="1" ; fi;

Šlo mi o to udělat jakýsi přepínač hodnot
« Poslední změna: 06. 05. 2010, 13:00:45 od webhope webhope »

deadmail

Re: Podmínka v bashi
« Odpověď #3 kdy: 06. 05. 2010, 16:30:56 »
Kód: [Vybrat]
[ "$temp" == "Změnit" ]] && first=$((1-first))

.

Re: Podmínka v bashi
« Odpověď #4 kdy: 06. 05. 2010, 16:52:06 »
To je asi malá chyba (== místo =), ale díky!
Není.


webhope

Re: Podmínka v bashi
« Odpověď #5 kdy: 07. 05. 2010, 11:57:31 »
Deadmail:
Tobě tam vypadla hranatá závorka.

Atrament:
Tak tomu nerozumím

Ještě prosím o pomoc s touhto podmínkou, nevede se mi vrátit hodnotu poslední položky v poli
Kód: [Vybrat]
[[ $i -eq ${#content[@]}-1 ]]
výsledek:
Kód: [Vybrat]
+ [[ -1 -eq 23-1 ]]místo
Kód: [Vybrat]
+ [[ -1 -eq 22 ]]
« Poslední změna: 07. 05. 2010, 11:59:31 od webhope webhope »

.

Re: Podmínka v bashi
« Odpověď #6 kdy: 07. 05. 2010, 12:26:26 »
A co se ti na tom nelíbí ?

webhope

Re: Podmínka v bashi
« Odpověď #7 kdy: 07. 05. 2010, 12:29:52 »
A co se ti na tom nelíbí ?

Kód: [Vybrat]
${#content[@]}-1 nevrací číselný výsledek
Edit:

No nic, už jsem to vyřešil:
Kód: [Vybrat]
[[ $i -eq $(( ${#content[@]}-1)) ]];
« Poslední změna: 07. 05. 2010, 15:02:48 od webhope webhope »

Atrament

Re: Podmínka v bashi
« Odpověď #8 kdy: 07. 05. 2010, 20:51:42 »
v BASHi se běžně porovnává jenom jedním rovnítkem jenom musí být mezi rovnítkem a hodnotami na obou stranách mezera, takto: $promenna = 10 takhle jde o porovnání, kdyby to bylo takto: $promenna=10 (bez těch mezer) tak jde o přiřazení.

.

Re: Podmínka v bashi
« Odpověď #9 kdy: 09. 05. 2010, 17:00:08 »
Kód: [Vybrat]
${#content[@]}-1 nevrací číselný výsledek

Hmm
Kód: [Vybrat]
$ [[ 2 -eq 4-2 ]] && echo plati
plati
$ foo=(a b c d); [[ 2 -eq ${#foo[@]}-2 ]] && echo plati
plati

Jirka

Re: Podmínka v bashi
« Odpověď #10 kdy: 10. 05. 2010, 00:40:03 »
v BASHi se běžně porovnává jenom jedním rovnítkem jenom musí být mezi rovnítkem a hodnotami na obou stranách mezera, takto: $promenna = 10 takhle jde o porovnání, kdyby to bylo takto: $promenna=10 (bez těch mezer) tak jde o přiřazení.

To fakt ne, jestli je něco porovnání nebo přiřazení se fakt neřídí mezerama (ale mohou být v některých případech povinné a v jiných zakázané). V POSIX shellu je porovnání:

  • příkazem test nebo [ (to je to samý) jednoduchým = (je to řetězcové porovnání). Mezery jsou v tomhle případě nutné vždy. Např. [ $X = string ] nebo test $X = 1
  • uvnitř aritmetické expanze dvojitým rovnítkem == (fungují normální Céčkové operátory, aritmetické porovnání). Např. $((1+1==1)), $(($X==1)) nebo $((X==1)) (poslední dva mají stejný efekt); na mezerách nezáleží
  • aritmetické porovnání příkazem test pomocí operátoru -eq (opět mezery povinné)
V Bashi je navíc [[, možnost používat == v hranatých závorkách a spousta jiných možností, jak zařídit aritmetické vyhodnocení.

Přiřazení:
  • samostatným příkazem X=hodnota (mezery nesmí být)
  • substitucí ${X=hodnota} (přřadí jen když X je prázdná, mezery nesmí být vlevo od =)
  • aritmetickou substitucí $((X=X+1)), $((X+=1)) atd. (ne $(($X=1))) (na mezerách nezáleží)

webhope

Re: Podmínka v bashi
« Odpověď #11 kdy: 13. 05. 2010, 11:01:56 »
Díky za reakce a obzvlášť Jirkovy