Fórum Ubuntu CZ/SK
Ostatní => Archiv => Téma založeno: snop 01 Července 2007, 23:57:01
-
Ahoj,
potrebuji v bash skripte otestovat promennou napr. x ci se vni nachazi cislo.
Potrebuji neco taketo
if x je cislo; then
read mac;
finevim ci tuto kontrolu podporuje primo bash, alebo nato existuje nejaky externi prikaz, ale zatim sem nic nenasel.
-
Ja bych to videl nejak takto:
if expr $x : "[0-9][0-9]*$"> /dev/null
then
echo "V promenne x je cislo"
fiAsi 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:)
-
ja som vygooglil toto:
#!/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
-
#!/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
-
-- 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.
-
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
-
No to riesenie mi ako prve vyhodil google. Nieje to z mojej hlavy. :)
-
#!/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
-
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..
-
#!/bin/bash
if [ ! `echo $1 | grep [^0-9$]` ]; then
echo int; else
echo not int
finefunguje a nemuzu to rozchodit
ale
#!/bin/bash
read VARIABLE
if [ $VARIABLE -eq $VARIABLE 2> /dev/null ]; then
echo $VARIABLE is a number
else
echo $VARIABLE is not a number
fispolehlive funguje i kdyz ten prvy priklad sem mi pozdava cistejsi
-
#!/bin/bash
if [ ! `echo $1 | grep [^0-9$]` ]; then
echo int; else
echo not int
finefunguje a nemuzu to rozchodit
Zkus ..
#!/bin/bash
if [ `echo $1 | grep -q "^[[:digit:]]\{1,\}$"` ];
then echo int;
else echo not int
fi..nebo jednoradkove ..
#!/bin/bash
echo $1 | grep -q "^[[:digit:]]\{1,\}$" && echo "jo" || echo "ne"
-
Zkuste:
if [[ "$1" =~ '[[:digit:]]' ]] ; then
echo 'cislo' ;
else
echo 'neco jinyho' ;
fiAle jako cislo vyhodnoti i trebas: "A123bb". Pro presnejsi rozliseni zkuste vyrazy v hornich vlaknech.
Edit: nebo trebas tenhle: '^[[:digit:]]*$'
-
To optim:
ten prvy priklad s if then nefunguje, ale ten jednoradkovi ano a pritom je to skoro o iste
-
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.
-
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 :)
-
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
-
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
if [ ! $(echo $2 | grep "^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$") ]; then
fiale 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 :)
-
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
-
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
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
-
'^[[:digit:]]*$'
Na * pozor, namatchuje to i 0 opakování, v tomto případě tedy i prázdný řetězec ..
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ě ..
#!/bin/bash
if `echo $1 | grep -q "^[[:digit:]]\{1,\}$"`;
then echo int;
else echo not int
fi