Fórum Ubuntu CZ/SK

Ostatní => Archiv => Téma založeno: snop 01 Července 2007, 23:57:01

Název: bash a cislo v premenne
Přispěvatel: snop 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.
Název: bash a cislo v premenne
Přispěvatel: fritzek 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:)
Název: bash a cislo v premenne
Přispěvatel: _mali_ 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
Název: bash a cislo v premenne
Přispěvatel: nettezzaumana 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
Název: bash a cislo v premenne
Přispěvatel: fritzek 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.
Název: bash a cislo v premenne
Přispěvatel: nettezzaumana 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
Název: bash a cislo v premenne
Přispěvatel: _mali_ 02 Července 2007, 16:37:45
No to riesenie mi ako prve vyhodil google. Nieje to z mojej hlavy. :)
Název: bash a cislo v premenne
Přispěvatel: snop 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
Název: bash a cislo v premenne
Přispěvatel: nettezzaumana 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..
Název: bash a cislo v premenne
Přispěvatel: snop 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
Název: bash a cislo v premenne
Přispěvatel: optim 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"
Název: bash a cislo v premenne
Přispěvatel: Pavelp 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:]]*$'
Název: bash a cislo v premenne
Přispěvatel: snop 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
Název: bash a cislo v premenne
Přispěvatel: fritzek 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.
Název: bash a cislo v premenne
Přispěvatel: snop 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 :)
Název: bash a cislo v premenne
Přispěvatel: fritzek 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
Název: bash a cislo v premenne
Přispěvatel: snop 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 :)
Název: bash a cislo v premenne
Přispěvatel: fritzek 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
Název: bash a cislo v premenne
Přispěvatel: snop 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
Název: bash a cislo v premenne
Přispěvatel: optim 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