Portál AbcLinuxu, 9. května 2025 00:51

Dotaz: bash: porovnanie des. cisel

8.3.2005 15:14 oron | skóre: 27
bash: porovnanie des. cisel
Přečteno: 683×
Odpovědět | Admin
a=2.56
b=3.89

potrebujem spravit podmienku
if $a < $b; then
  echo "a < b"
fi

prosim vas ako ? najeko sa stale mocem dokola a nejde mi to ...?
dik
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

8.3.2005 15:19 Tomík Pařízek
Rozbalit Rozbalit vše Re: bash: porovnanie des. cisel
Odpovědět | | Sbalit | Link | Blokovat | Admin
man bash:

"-gt" > "-lt" <

atd...
8.3.2005 15:28 oron | skóre: 27
Rozbalit Rozbalit vše Re: bash: porovnanie des. cisel
porovnat cele cisla samozrejme viem,
problem mam s des.cislom .... ?
8.3.2005 15:32 Yeti
Rozbalit Rozbalit vše Re: bash: porovnanie des. cisel
Odpovědět | | Sbalit | Link | Blokovat | Admin
Bash neumí porovnávat desetinná čísla. Nehledě na to, že < je v shellu přesměrování. Použij zsh, awk, perl, ...
8.3.2005 15:39 oron | skóre: 27
Rozbalit Rozbalit vše Re: bash: porovnanie des. cisel
ano ... viem ze bash nevie robit s des. cislom ... skusam to pomocou bc, ale toto sa mi zda trocha divoke
if [ $(bc << EOF
$a < $b
EOF
) -eq 1 ]; then
   echo "a < b"
else
   echo "a > b" 
fi

9.3.2005 08:23 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: bash: porovnanie des. cisel
hmm, a co je na tom divného. Když holt nechceš použít něco pořádného, tak se nediv. Krom toho tvrďáci by použili dc.
[ $(dc <<<"[1pq]sa$a $b>a0p") -eq 1 ] &&
  echo "a < b" ||
  echo "a > b"
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
9.3.2005 09:38 Yeti
Rozbalit Rozbalit vše Re: bash: porovnanie des. cisel
Tvrďák použije sort ;-)
function rnle() {
  test `echo -e "$1\\n$2" | sort -g | head -n 1` = $1
}
function rnge() {
  test `echo -e "$1\\n$2" | sort -g | head -n 1` = $2
}
9.3.2005 17:20 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: bash: porovnanie des. cisel
No mě to přijde proti dc moc easy, ale musím uznat, že je to drsnější co do plýtvání systémovými prostředky a na to mě moc neužije. Krom toho jsem se po dlouhé době donutil přečíst man dc a možnosti tohoto nástroje mě nadchly, takže odpříště všechno nepíšu v bashi, ale v dc ;-)
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
9.3.2005 18:22 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: bash: porovnanie des. cisel
A vůbec. Ještě jednou se snížím k bashi.
rnlt() {
  if [ ${1:0:1} == '-' -a ${2:0:1} == '-' ]
  then
    rngt ${1:1} ${2:1}
    return $?
  fi
  IFS='.'
  a=($1)
  b=($2)
  [ ${a[0]} -lt ${b[0]} ] && return 0
  [ ${a[0]} -gt ${b[0]} ] && return 1
  i=0
  while :
  do
    [ -z "${a[1]:$i:1}" -a -n "${b[1]:$i:1}" ] && return 0
    [ -z "${b[1]:$i:1}" ] && return 1
    [ ${a[1]:$i:1} -lt ${b[1]:$i:1} ] && return 0
    let i++
  done
}
rngt() {
  if [ ${1:0:1} == '-' -a ${2:0:1} == '-' ]
  then
    rnlt ${1:1} ${2:1}
    return $?
  fi
  IFS='.'
  a=($1)
  b=($2)
  [ ${a[0]} -gt ${b[0]} ] && return 0
  [ ${a[0]} -lt ${b[0]} ] && return 1
  i=0
  while :
  do
    [ -n "${a[1]:$i:1}" -a -z "${b[1]:$i:1}" ] && return 0
    [ -z "${a[1]:$i:1}" ] && return 1
    [ ${a[1]:$i:1} -gt ${b[1]:$i:1} ] && return 0
    let i++
  done
}
Teda zatím to není úplně blbuvzdorné a používá se to.
rnlt $a $b && echo 'a < b' || echo 'a >= b'
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
9.3.2005 19:04 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: bash: porovnanie des. cisel
Dělám snad někde chybu -- kromě toho, že neparsuji semilogaritmický tvar -- když to porovnávám jen
function rnle() {
  [ ${1/.*} -lt ${2/.*} ] && return 0
  [ ${1/.*} -gt ${2/.*} ] && return 1
  if [ ${1:0:1} = '-' ]; then
    [ ! ${1#*.}0 \> ${2#*.}0 ]
  else
    [ ! ${2#*.}0 \> ${1#*.}0 ]
  fi
}
9.3.2005 19:36 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: bash: porovnanie des. cisel
Děláš:
$ rnle 3.45 3.345 && echo OK
OK
$ rnle 3 3.345 && echo OK
$
Nicméně, když na to teď s odstupem koukám, tak je to fakt hnus, co takhle:
rnle() {
  IFS='.'
  a=($1)
  b=($2)
  [ $a -lt $b ] && return 0
  [ $a -gt $b ] && return 1
  if [ ${a:0:1} == '-' ]
  then
    a[0]=${b[1]}
    b=${a[1]}
  else
    a=${a[1]}
    b=${b[1]}
  fi
  for((i=${#a};i<${#b};i++)); do a=${a}0; done
  for((i=${#b};i<${#a};i++)); do b=${b}0; done
  [ $a -ge $b ] && return 1
  return 0
}
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
9.3.2005 19:56 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: bash: porovnanie des. cisel
V tom problém není, protože > porovnává lexikograficky. Jen jsem zaměnil větve té podmínky
function rnle() {
  [ ${1/.*} -lt ${2/.*} ] && return 0
  [ ${1/.*} -gt ${2/.*} ] && return 1
  if [ ${1:0:1} = '-' ]; then
    [ ! ${2#*.}0 \> ${1#*.}0 ]
  else
    [ ! ${1#*.}0 \> ${2#*.}0 ]
  fi
}
9.3.2005 20:18 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: bash: porovnanie des. cisel
Musím uznat, že je to elegantní
rnlt() {
  if [ ${1/.*} -ne ${2/.*} ]
  then [ ${1/.*} -lt ${2/.*} ]
  elif [ ${1:0:1} = '-' ]
  then [ ${1#*.}0 \> ${2#*.}0 ]
  else [ ${2#*.}0 \> ${1#*.}0 ]
fi
}
Tak dnešní kontest jsi vyhrál ;-)
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
9.3.2005 19:36 Ja
Rozbalit Rozbalit vše Re: bash: porovnanie des. cisel
Ja to mam podobne, i kdyz asi trochu prasacky ...
function rnlt()
{
        celacast_1=`echo $1|cut -d. -f 1`;
        descast_1=`echo $1|cut -d. -f 2`;
        celacast_2=`echo $2|cut -d. -f 1`;
        descast_2=`echo $2|cut -d. -f 2`;
        if [ $celacast_1 -eq $celacast_2 ]
        then
                if [ $celacast_1 -lt 0 ]
                then
                        descast_1=`expr -1 \* $descast_1`;
                        descast_2=`expr -1 \* $descast_2`;
                fi
                [ $descast_1 -lt $descast_2 ]&& return 0;
                return 1;
        else
                [ $celacast_1 -lt $celacast_2 ]&& return 0;
                return 1;
        fi
}
9.3.2005 19:46 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: bash: porovnanie des. cisel
Stejnej problém jako Yeti, nestejně dlouhé desetiné části selžou. Nicméně, naučit se používat konstrukce typu ${variable#pattern}, ${variable%pattern} a používat IFS by ušetřilo hodně zbytečných subprocesů.
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
9.3.2005 19:51 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: bash: porovnanie des. cisel
A to nemluvím o těch zbytečnejch echo.
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.

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.