Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: bash a cislo v premenne  (Přečteno 4651 krát)

snop

  • Aktivní člen
  • *
  • Příspěvků: 366
bash a cislo v premenne
« kdy: 01 Července 2007, 23:57:01 »
Ahoj,

potrebuji v bash skripte otestovat promennou napr. x ci se vni nachazi cislo.

Potrebuji neco taketo

Kód: [Vybrat]
if x je cislo; then
  read mac;
fi
nevim ci tuto kontrolu podporuje primo bash, alebo nato existuje nejaky externi prikaz, ale zatim sem nic nenasel.
...........................--== sNop ==--............................
-- pgp - http://radeonvmod.ic.cz/keys/snop3.asc --
              AMD Sempron 2800+  1024MB RAM               ATI Radeon 9550        2x80GB HDD

fritzek

  • Aktivní člen
  • *
  • Příspěvků: 231
bash a cislo v premenne
« Odpověď #1 kdy: 02 Července 2007, 03:41:35 »
Ja bych to videl nejak takto:

Kód: [Vybrat]
if expr $x : "[0-9][0-9]*$"> /dev/null
then
echo "V promenne x je cislo"
fi
Asi by to slo udelat i elegantneji, ale zkousel jsem to a funguje. Kdyztak vrele doporucuji nasledujici stranky na nauceni zakladu regularnich vyrazu a Unixu obecne: http://www.kiv.zcu.cz/~dvop/skoleni/skoleni-unix.html

edit: Doplnil jsem presmerovani do cerne diry:)
P4 2.94GHz / 1024MB RAM / NVidia 6600 256MB / 80GB Seagate / DVB MSI Megasky / Leadtek Winfast 2000 / LENNY
NB Centrino Duo / 1024MB RAM / Intel 945GM / Intel wifi 3945ABG / Intel ethernet 100 VE

_mali_

  • Aktivní člen
  • *
  • Příspěvků: 138
bash a cislo v premenne
« Odpověď #2 kdy: 02 Července 2007, 10:07:33 »
ja som vygooglil toto:
Kód: [Vybrat]
#!/bin/bash
read VARIABLE
if [ $VARIABLE -eq $VARIABLE 2> /dev/null ]; then
echo $VARIABLE is a number
else
echo $VARIABLE is not a number
fi

nettezzaumana

  • Host
bash a cislo v premenne
« Odpověď #3 kdy: 02 Července 2007, 15:17:20 »
Kód: [Vybrat]
#!/bin/bash
if [ ! `echo $1 | grep [^0-9$]` ]; then
    echo int; else
    echo not int
fi
-- vyse popsane dva zpusoby jsou dle meho napsane "kančím štýlem", protoze u "vygoogleneho" neuvidime chybovou hlasku pouze kvuli presmerovani vystupu a od "_mali_" se zase zbytecne vola expr, true a /dev/null. Protoze testujeme retezec, je vhodne pouzit pro to nastroje k tomu urcene..

ps. zpusob od _mali_ je pozoruhodny a rozhodne funguje a kdyz tak na nej koukam, nejni to uplne "kanci stylo", ac ja bych to delal jinak..
:D

fritzek

  • Aktivní člen
  • *
  • Příspěvků: 231
bash a cislo v premenne
« Odpověď #4 kdy: 02 Července 2007, 16:19:05 »
Citace: nettezzaumana
-- vyse popsane dva zpusoby jsou dle meho napsane "kančím štýlem", protoze u "vygoogleneho" neuvidime chybovou hlasku pouze kvuli presmerovani vystupu a od "_mali_" se zase zbytecne vola expr, true a /dev/null. Protoze testujeme retezec, je vhodne pouzit pro to nastroje k tomu urcene..
ps. zpusob od _mali_ je pozoruhodny a rozhodne funguje a kdyz tak na nej koukam, nejni to uplne "kanci stylo", ac ja bych to delal jinak..
:D
Presmerovani na /dev/null tam byt nemusi, ale vzhledem k tomu, ze je to funkcni, tak je zbytecne neco psat na vystup. To eq je docela vesela vec a chvili jsem na ni koukal, ale v principu by to fungovat melo. Ovsem v tomto pripade bych mel strach, ze v jine implementaci se muze stat neco jineho, nez ze vyraz vrati nulu. A expr je podle me korektni nastroj na porovnani vyrazu.

btw... Ta striska jako oznaceni prvniho znaku mi nejak nefunguje:( Bash hazi chybu, ze je to unportable BRE.
P4 2.94GHz / 1024MB RAM / NVidia 6600 256MB / 80GB Seagate / DVB MSI Megasky / Leadtek Winfast 2000 / LENNY
NB Centrino Duo / 1024MB RAM / Intel 945GM / Intel wifi 3945ABG / Intel ethernet 100 VE

nettezzaumana

  • Host
bash a cislo v premenne
« Odpověď #5 kdy: 02 Července 2007, 16:24:52 »
ok. napsal jsem to asi vic konfrontacne nez jsem myslel. Chtel jsem tim jen rict, ze nejcistsi me pripada pouzit na testovani retezce nastroje k tomu urcene (grep) prave proto, ze s Vami naprosto souhlasim s tim, ze bych nedal ruku do ohne za to, jak se to bude chovat v jine implementaci.. ;D

_mali_

  • Aktivní člen
  • *
  • Příspěvků: 138
bash a cislo v premenne
« Odpověď #6 kdy: 02 Července 2007, 16:37:45 »
No to riesenie mi ako prve vyhodil google. Nieje to z mojej hlavy. :)

snop

  • Aktivní člen
  • *
  • Příspěvků: 366
bash a cislo v premenne
« Odpověď #7 kdy: 02 Července 2007, 16:42:48 »
Citace: nettezzaumana
Kód: [Vybrat]
#!/bin/bash
if [ ! `echo $1 | grep [^0-9$]` ]; then
    echo int; else
    echo not int
fi
-- vyse popsane dva zpusoby jsou dle meho napsane "kančím štýlem", protoze u "vygoogleneho" neuvidime chybovou hlasku pouze kvuli presmerovani vystupu a od "_mali_" se zase zbytecne vola expr, true a /dev/null. Protoze testujeme retezec, je vhodne pouzit pro to nastroje k tomu urcene..

ps. zpusob od _mali_ je pozoruhodny a rozhodne funguje a kdyz tak na nej koukam, nejni to uplne "kanci stylo", ac ja bych to delal jinak..
:D
dik, asi nejlepsi reseni, vsem dik za snahu
...........................--== sNop ==--............................
-- pgp - http://radeonvmod.ic.cz/keys/snop3.asc --
              AMD Sempron 2800+  1024MB RAM               ATI Radeon 9550        2x80GB HDD

nettezzaumana

  • Host
bash a cislo v premenne
« Odpověď #8 kdy: 02 Července 2007, 17:16:17 »
Citace
btw... Ta striska jako oznaceni prvniho znaku mi nejak nefunguje:( Bash hazi chybu, ze je to unportable BRE.
nevim jestli to muze byt tim, ale v Ubuntu standartne /bin/sh odkazuje na /bin/dash -- pokud Vam to hlasi nejakou chybu, je to spatne, protoze tato syntaxe a tento zpusob by mel byt zcela spravny a korektni na vsech Linuxech..

snop

  • Aktivní člen
  • *
  • Příspěvků: 366
bash a cislo v premenne
« Odpověď #9 kdy: 02 Července 2007, 18:28:32 »
Kód: [Vybrat]
#!/bin/bash
if [ ! `echo $1 | grep [^0-9$]` ]; then
    echo int; else
    echo not int
fi
nefunguje a nemuzu to rozchodit

ale

Kód: [Vybrat]
#!/bin/bash
read VARIABLE
if [ $VARIABLE -eq $VARIABLE 2> /dev/null ]; then
echo $VARIABLE is a number
else
echo $VARIABLE is not a number
fi
spolehlive funguje i kdyz ten prvy priklad sem mi pozdava cistejsi
...........................--== sNop ==--............................
-- pgp - http://radeonvmod.ic.cz/keys/snop3.asc --
              AMD Sempron 2800+  1024MB RAM               ATI Radeon 9550        2x80GB HDD

optim

  • Návštěvník
  • Příspěvků: 17
bash a cislo v premenne
« Odpověď #10 kdy: 02 Července 2007, 19:25:02 »
Citace: snop
Kód: [Vybrat]
#!/bin/bash
if [ ! `echo $1 | grep [^0-9$]` ]; then
    echo int; else
    echo not int
fi
nefunguje a nemuzu to rozchodit
Zkus ..

Kód: [Vybrat]
#!/bin/bash
if [ `echo $1 | grep -q "^[[:digit:]]\{1,\}$"` ];
 then echo int;
 else echo not int
fi
..nebo jednoradkove ..
Kód: [Vybrat]
#!/bin/bash
echo $1 | grep -q "^[[:digit:]]\{1,\}$" && echo "jo" || echo "ne"

Pavelp

  • Host
bash a cislo v premenne
« Odpověď #11 kdy: 02 Července 2007, 20:16:38 »
Zkuste:
Kód: [Vybrat]
if [[ "$1" =~ '[[:digit:]]' ]] ; then
echo 'cislo' ;
else
echo 'neco jinyho' ;
fi
Ale jako cislo vyhodnoti i trebas: "A123bb". Pro presnejsi rozliseni zkuste vyrazy v hornich vlaknech.

Edit: nebo trebas tenhle: '^[[:digit:]]*$'

snop

  • Aktivní člen
  • *
  • Příspěvků: 366
bash a cislo v premenne
« Odpověď #12 kdy: 02 Července 2007, 20:20:38 »
To optim:

ten prvy priklad s if then nefunguje, ale ten jednoradkovi ano a pritom je to skoro o iste
...........................--== sNop ==--............................
-- pgp - http://radeonvmod.ic.cz/keys/snop3.asc --
              AMD Sempron 2800+  1024MB RAM               ATI Radeon 9550        2x80GB HDD

fritzek

  • Aktivní člen
  • *
  • Příspěvků: 231
bash a cislo v premenne
« Odpověď #13 kdy: 02 Července 2007, 20:24:25 »
Citace: Pavelp
Ale jako cislo vyhodnoti i trebas: "A123bb". Pro presnejsi rozliseni zkuste vyrazy v hornich vlaknech.
Ten muj skript(hned druhy prispevek) jsem testoval na vsech moznych vecech, kde by mohl byt problem. a15, 15a, 1,.... Vsechno funguje bez problemu. Sice za nej nerucim, ale myslim si, ze pracuje na 99% podle pozadavku.
P4 2.94GHz / 1024MB RAM / NVidia 6600 256MB / 80GB Seagate / DVB MSI Megasky / Leadtek Winfast 2000 / LENNY
NB Centrino Duo / 1024MB RAM / Intel 945GM / Intel wifi 3945ABG / Intel ethernet 100 VE

snop

  • Aktivní člen
  • *
  • Příspěvků: 366
bash a cislo v premenne
« Odpověď #14 kdy: 02 Července 2007, 20:37:01 »
Citace: fritzek
Citace: Pavelp
Ale jako cislo vyhodnoti i trebas: "A123bb". Pro presnejsi rozliseni zkuste vyrazy v hornich vlaknech.
Ten muj skript(hned druhy prispevek) jsem testoval na vsech moznych vecech, kde by mohl byt problem. a15, 15a, 1,.... Vsechno funguje bez problemu. Sice za nej nerucim, ale myslim si, ze pracuje na 99% podle pozadavku.
jo, taky sem ho skousel a je na 100% funkcni, ale pouzivam kod od _mali_ mi pride taky privetivejsi. Kdyzto v tvem kode nechapu vyznam toho prikazu expr :)
...........................--== sNop ==--............................
-- pgp - http://radeonvmod.ic.cz/keys/snop3.asc --
              AMD Sempron 2800+  1024MB RAM               ATI Radeon 9550        2x80GB HDD

fritzek

  • Aktivní člen
  • *
  • Příspěvků: 231
bash a cislo v premenne
« Odpověď #15 kdy: 02 Července 2007, 20:41:58 »
Citace: snop
jo, taky sem ho skousel a je na 100% funkcni, ale pouzivam kod od _mali_ mi pride taky privetivejsi. Kdyzto v tvem kode nechapu vyznam toho prikazu expr :)
doporucuji man expr :)

Ta manualova stranka ma jenom par radek a je to dost dobre pochopitelny. Uzitecny prikaz
P4 2.94GHz / 1024MB RAM / NVidia 6600 256MB / 80GB Seagate / DVB MSI Megasky / Leadtek Winfast 2000 / LENNY
NB Centrino Duo / 1024MB RAM / Intel 945GM / Intel wifi 3945ABG / Intel ethernet 100 VE

snop

  • Aktivní člen
  • *
  • Příspěvků: 366
bash a cislo v premenne
« Odpověď #16 kdy: 03 Července 2007, 01:11:48 »
Citace: fritzek
Citace: snop
jo, taky sem ho skousel a je na 100% funkcni, ale pouzivam kod od _mali_ mi pride taky privetivejsi. Kdyzto v tvem kode nechapu vyznam toho prikazu expr :)
doporucuji man expr :)

Ta manualova stranka ma jenom par radek a je to dost dobre pochopitelny. Uzitecny prikaz
j..takze sem to komplet preluskal i stema regulernima vyrazama :) a dospel sem az do takeho stadia ze sem napsal reg. vyraz pre mac adresu

Kód: [Vybrat]
       if [ ! $(echo $2 | grep "^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$") ]; then
        fi
ale je tam chyba muzes zadat cislo nad 255 a ten vyraz to sezere, kontrola ci je cislo ci kazde cislo mezi bodka je mensi alebo rovne nez 255 by zabrala trochu vic kodu, ale slo by to :)
...........................--== sNop ==--............................
-- pgp - http://radeonvmod.ic.cz/keys/snop3.asc --
              AMD Sempron 2800+  1024MB RAM               ATI Radeon 9550        2x80GB HDD

fritzek

  • Aktivní člen
  • *
  • Příspěvků: 231
bash a cislo v premenne
« Odpověď #17 kdy: 03 Července 2007, 04:33:37 »
Citace: snop
ale je tam chyba muzes zadat cislo nad 255 a ten vyraz to sezere, kontrola ci je cislo ci kazde cislo mezi bodka je mensi alebo rovne nez 255 by zabrala trochu vic kodu, ale slo by to :)
No mohl jsi rovnou napsat, co potrebujes. Ale myslim si, ze prinosnejsi bude, kdyz si o tech regularnich vyrazech neco prectes. Tak at to funguje. Hodne zdaru
P4 2.94GHz / 1024MB RAM / NVidia 6600 256MB / 80GB Seagate / DVB MSI Megasky / Leadtek Winfast 2000 / LENNY
NB Centrino Duo / 1024MB RAM / Intel 945GM / Intel wifi 3945ABG / Intel ethernet 100 VE

snop

  • Aktivní člen
  • *
  • Příspěvků: 366
bash a cislo v premenne
« Odpověď #18 kdy: 03 Července 2007, 10:34:28 »
Mno rano sem se zobudel oneco chytrejsi :) a kod sem uplne dokoncil. takze plne funkcni podminka a reg.vyraz pro kontrolu spravnosti IP adresy vypada takto

Kód: [Vybrat]
if [ $(echo $1 | grep "^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$") ] && \
   [ $(echo $1 | cut -d "." -f 1) -lt 256 ] && [ $(echo $1 | cut -d "." -f 2) -lt 256 ] && \
   [ $(echo $1 | cut -d "." -f 3) -lt 256 ] && [ $(echo $1 | cut -d "." -f 2) -lt 256 ]
then
    echo true
else
    echo false
fi
...........................--== sNop ==--............................
-- pgp - http://radeonvmod.ic.cz/keys/snop3.asc --
              AMD Sempron 2800+  1024MB RAM               ATI Radeon 9550        2x80GB HDD

optim

  • Návštěvník
  • Příspěvků: 17
bash a cislo v premenne
« Odpověď #19 kdy: 03 Července 2007, 20:29:23 »
Citace: Pavelp
'^[[:digit:]]*$'
Na * pozor, namatchuje to i 0 opakování, v tomto případě tedy i prázdný řetězec ..

Citace: snop
To optim:

ten prvy priklad s if then nefunguje, ale ten jednoradkovi ano a pritom je to skoro o iste
No jenom skoro, takhle je to správně ..

Kód: [Vybrat]
#!/bin/bash
if `echo $1 | grep -q "^[[:digit:]]\{1,\}$"`;
 then echo int;
 else echo not int
fi

 

Provoz zaštiťuje spolek OpenAlt.