Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: webhope 05. 05. 2010, 23:42:56
-
Zdravím,
fakt neexistuje v bashi nějaká obdoba následujícího příkazu?
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?
-
[ $first = one ] && first=1 || first=0
-
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
-
[ "$temp" == "Změnit" ]] && first=$((1-first))
-
To je asi malá chyba (== místo =), ale díky!
Není.
-
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
[[ $i -eq ${#content[@]}-1 ]]
výsledek:
+ [[ -1 -eq 23-1 ]]
místo
+ [[ -1 -eq 22 ]]
-
A co se ti na tom nelíbí ?
-
A co se ti na tom nelíbí ?
${#content[@]}-1 nevrací číselný výsledek
Edit:
No nic, už jsem to vyřešil:
[[ $i -eq $(( ${#content[@]}-1)) ]];
-
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í.
-
${#content[@]}-1 nevrací číselný výsledek
Hmm
$ [[ 2 -eq 4-2 ]] && echo plati
plati
$ foo=(a b c d); [[ 2 -eq ${#foo[@]}-2 ]] && echo plati
plati
-
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ží)
-
Díky za reakce a obzvlášť Jirkovy