Páginas

Mostrando entradas con la etiqueta bash. Mostrar todas las entradas
Mostrando entradas con la etiqueta bash. Mostrar todas las entradas

2008/04/02

Komandoen ordezkapena

Erabili ahal dugu komando baten emaitza aldagai baten balioa balitz bezala. Ikusi zenbait adibide:
  • nireDir=$(ls $HOME) ; nireDir aldagaia definitzen da eta ls $HOME komandoaren emaitza baliotzat esleituko zaio. Konprobatzeko egikaritu jarraian hurrengo hau : echo $nireDir
  • ls -al $(type -path bash) ; $(type -path bash) komandoaren emaitza ls komandoari pasatzen zaio
  • Azter dezagun hurrengo script hau:
#!/bin/bash
# data zehatz batean - $1 - uneko katalogan aldatu diren fitxategien izenak
# ematen digu script honek. Scriptaren izena datafitxategiak.sh
function dataBatenFitxategiak{
ls -lad * | grep "$1" | cut -c54-
}
ls -lad $(dataBatenFitxategiak "$1")
# scriptaren amaiera ; gorde goiko izenarekin

Egikaritzeko , idatzi datafitxategiak.sh "12 Jan" , horrekin Urtarrilak, 12 aldatu diren fitxategien izenak ( bakarrik; cut -c54- komandoa exekutatzen delako ) agertuko zaizkigu




Karaktere kateen eragileak -II-

Patroi bilatzeko eragileak, hau da karaktere string batean "patroi" bat bilatu . Ikus dezagun hurrengo adibide hau: bidea = /usr/local/share/qemu/bios.core.bin. Kate horretan hurrengo eragileak aplikatzen zaizkie.
Eragilea------------------------------ Emaitza
${bidea##/*/}------------------------bios.core.bin
${bidea#/*/}--------------------------local/share/qemu/bios.core.bin
${bidea%.*} ---------------------------
/usr/local/share/qemu/bios.core
${bidea%%.*}
-------------------------/usr/local/share/qemu/bios
Ikusten denez, # eta % ikurrek , kateetan zenbait ariketa egiteko balio dute :
${aldagaia##patroi} --> aldagairen balioan adierazitako "patroia" , ezkerretik hasita , aurkitzen bada baliotik zatirik luzeena ezabatzen du eta geratzen dena ematen digu; horregatik
${bidea##/*/}-expresio horretan patroia /edozer / da eta /usr.............qemu/ zati hori kenduta bios.core.bin katea da emaitza
Bigarren kasuan,
${bidea#/*/}--, patroia bera da - /*/ - baina emaitza guztiz kontakoa da, esatebaterako, zatirik txikiena kendu eta geratzen dena izango da emaitza, hua da bakarrik /usr/ # eragileak .
Besteak, % eta %% , antzekoak dira baina eskumatik hasten da alderatzen patroia.

2008/03/24

Karaktere kateen eragileak-I.

Eragile horiek testu kateak kudeatzen laguntzen gaituzte , prozesu-errutinak kodifikatzeko beharra gabe; adibidez horien bitartez aldagai bat existitzen dela ziurta dezakegu, edo katearen zati bat hartu edo ezabatu patroi bat jarraituz, etabar
ADIBIDEAK
${aldag:-balio1} : aldag, baliogabea ez bada (existitzen bada) bere balioa itzultzen du, bestela balio1 ematen digu
${aldag:+balio1} : aldag, baliogabea ez bada (existitzen bada) balioa1 itzultzen du, bestela karaktere gabeko katea ematen digu, haua da: ""
${aldag:=balio1} : aldag, baliogabea ez bada (existitzen bada) bere balioa itzultzen du, bestela definitzen du aldag aldagaia eta balio1 esleizten zaio , balio1 itzultzeaz gain
${aldag:?mezua} : aldag existitzen bada eta ez da baliogabekoa bere balioa ematen digu, bestela aldag:mezua idazten du kontsolan eta scripta gelditzen du. Mezua ez badugu zehazten hurrengo hau izango da aterazten duena: parameter null or not set.
${aldag:desplaz:luzera} aldag aldagairen desplaz.karakterean hasten den eta luzera karaktere kopurua duen azpikatea ematen digu
Aplikazioak:
${egunak:--1} , horren emaitza -1 bada , esan nahi du egunak aldagaia ez dago definututa edota ez du baliorik esleitutua.
${egunak:-+1} , emaitza 1 bada, egunak aldagaiak badu balioren bat esleitutrik
${egunak:?'Kontuz: egunak aldagaiak balioa esleitu behar zaio!!'}, horren emaitza
egunak: Kontuz: egunak aldagaiak balioa esleitu behar zaio!! , bada hor geratzen da srcripta , lerro gehiago prozesatu gabe.
${helbidea:5:3} : demagun
helbidearen edukia Las mercedes,47-Getxo- string dela ; komandoaren emaitza izango litzateke mer
Pentsa ezazu ikasleen notekin fitxategia daukagula : notak.txt ; eta fitxategi horren egitura honako hau dela:
9,34 Koldo Rodriguez
4,56 Miren Pagazaurtundua
7,45 Miren Solaguren
.... ...................................
hau da ikasle bat lerro batean. n nota altuenak jakin nahi dugu( n ez bada zehazten , lehenengo 5 nota altuenak aterako dira).Horretarako hurrengo script hau presta dezakegu.

#!/bin/bash
# notaOnenak.sh scriptaren izena
# Bi parametro pasatu behar ditugu: noten fitxategia, eta n
# Hurrengo komandoarekin lor dezakegu eskatzen dena
sort -nr ${1:?' Noten fitxategia adierazi behar da!'} | head -${2:-5}
# hori da, baino ez
Egikaritzeko, notaOnenak.sh notak.txt 2 , lehenengo bi nota onenak jakiteko

2008/03/22

Aldagaiak Hedatu

Jakina da $aldagaia espresioak aldagaiaren edukia esan nahi duela , era batean esanda, $aldagaia idaztean aldagaiaren hedapena adierazi nahi dugu.
Esatebaterako, adina aldagairen balioa 12 bada $adina delakoak hedatzen du 12 baliora. Idazteko era hori beste baten laburpena da, batzutan ondo idazten ez badugu arazoak dakartzakigu.
Beraz, esan beharra dago $adina era ${adina} erari dagokiola. Noiz erabiltzen dira jakiteko , hona hemen adibide batzuk:
$ izena=Jon
$ deitura= Atxa
$ echo "${izena}_${deitura}
Azkeneko komandoaren emaitza honako hau izango zen: Jon_Atxa
Zer gertatuko litzateke hurrengo honekin?
$ echo "$izena_$deitura"
Emaitza Atxa izango litzateke, arrazoia hau da: Bash-ek $izena_ aldagaia bilatzen saiatuko da, existitzen ez denez ez du hedatuko eta $deitura aldagaiaren hedatzea egingo du.
Labur bliduz: nahasketak daudenean ${...} era erabili.
Beste egoera nahasgarria da posizio parametroak erabiltzen direnean, hau da $12 espresioa Bash-ek hurrengo hau egingo du: $1 aldagaia hedatu du eta jarraian 2 zenbakia idatziko du; ostera , ${12} 12.parametroaren balioara hedatuko du.

Bash Funtzioak

Funtzio bat komando multzo bat da, izen batez antzematen duena.Horrela esanda, sript baten antzekoa izango litzateke esan liteke, baina zenbait alde badaude; adibidez, script batean funtzioak exekuta daitezke script-ari dagokion tarte memorian aldagiak bailitzan.
Funtzio bat definitzeko bi era daude, biak baliokikeak direla.
function funtzio_izena{
...
bash komandoak
...
}

edo -----------------------------------------------------------

funtzio_izena(){
...
bash komandoak
...
}
Funtzioak definitzean inguru-aldagaiak bezala memorian biltzen dira, eta exekutatzeko funtzioaren izena komando lerroan idatzi baino ez da egin behar, dagozkion argumentuekin baldin baditu, jaikna.
Memorian zenbat funtzio dauzkagu jakiteko exekuta daiteke hurrengo komando hau declare -F. ( declare -f komandoak funtzioen inplementazioak ematen digu)
Bestalde, unset -f funtzio_izena egikarituz adierazitako funtzioa memoriatik ezabatzen da.
Gerta liteke izen bera duen script eta funtzioa existitzea ,zein izango zen lehenengoa exekutatzean arazoa sortuz.Bada, ez dago arazorik : kasu hauetan funtzioak lehentasuna du .
Ikus dezagun adibide bat: testu editore bat erailiz , kopiatu hurrengo testu hau:
#!bin/bash
# scrpit-aren izena agurra.sh
clear
echo " eginAgurra() funtzioa erabiliz agurtzen zaitut"
eginAgurra(){
echo " Kaixo $1 laguna"
echo "-----------------------------------------------"
}
eginAgurra #lerro honetan funtzioa exekutatzen da!!!
echo "Agur!!!"

Gorde agurra.sh izenarekin , ta betiko moduan x-baimena jarri exekutatu ahal izateko.Konprobatzeko script-a egikaritu , hurrengo hau idatziz: agurra.sh Pablo



2008/02/10

Bash programazioa-III-

BASH -arekin hasten
Komandoak fitxategietan bildu ahal dira geroago denak batera exekutazteko. Komandoez osatutako fitxategiek script hartzen dute izen. Beraz, script bat sortzeko textu editorea ( vi, nano, gedit,...) baino ez dugu behar . Geroago horren inguruan oharrak emango dira, momentuz lehengo programatxoa egiteko segi hurrengo urrats hauek:

  • Ireki terminala
  • Exekutatu gedit kaixo.sh : honekin gedit editorea abiatu eta kaixo.sh fitxategia sortuko du.
  • Idatzi agertzen diren moduan hurrengo lerro hauek:( zenbakiak kenduta)
  1. #!/bin/bash
  2. # hau da nire lehenengo script-a
  3. echo Kaixo guztioi
  • Gorde fitxategia eta itxi gedit programa .
  • script-a egikaritzeko , idatzi bash kaixo.sh
Azalpenak:
  • script-a kaixo.sh izendatu dugu, hau da .sh luzapena jarri diogu; hori ez da beharrezkoa, Linux munduan fitxategiek ez dute luzapenik baino, argitasuna dela eta, komenigarria da eta horrela bereizten dira .
  • script-aren lerroei dagokienean: #! : horrekin bash shell non dagoen adierazten dugu ( horrek balio du beste interpretatzaileekin ere , hau da #!/usr/sbin/php adierazi balitz php scripta izango zela) ; # : horrekin lerro bakarreko komentarioak hasten dira ; echo : komando bat da, eta atzean datorrena bistarako du; komandoak lerro batean idazten dira ( \ "slash" horrekin komandoa bi , (edo gehiago) lerrotan idatz daiteke ); lerro batean komando bat baino gehiago idatz daitezke , horretarako "," (koma) erabiltzen da komandoak bereizteko
  • Egikaritzeko bash hello.sh idazten dugu; horrekin zer adierazten da? bash programari deia egiten diogu hello.sh script-a exekuta dezan; beste era batean esanda, bash exekutatzen dugu hello.sh argumentua pasatuz
  • Zer pasatuko litzateke komando lerroan hello.sh idatzi bagenu? . Erantzuna--> bash:hello.sh : komadoa not found izango zela , hau da bash shell-ak ez du hello.sh komandoa aurkitu, edo beste era batez esanda hello.sh ez da exekutagarria; ordea, dena dela exekutatzen badugu ls -al , ez digu akatsik emango hello.sh fitxategia hor baitago.Zergatik lehenengo erantzuna? Exekutagarriak diren "fitxategiak" dituzten katalogoak , PATH inguru alagaiak kontrolatzen du. Ondorioa: gure script-ak zuzenean egikarigarraik izateko nahi badugu PATH aldagain egindako script-eko karpetaren bideak egon behar du
  • Egin dezagun beste proba bat. Idatzi ./hello.sh . Gogora ezazu . dela uneko katalogoaren izena, beraz ./hello.sh , fitxategia ,zehatz mehatz, non dagoen eesaten diogu bash-i . Horren emaitza izango zen : bash: ./hello.sh: Permission denied .Orain ez digu esaten ez dela fitxategia aurkitzen ( guk espreseki adierazten baitiogu), baizik eta exekutatzeko baimenik ez daukagula.
  • Beraz, aurrekoa kontuan harturik script-a exekutagarri bihurtu behar dugu. Nola? , baimenak aldatuz. Gogora ezazu fitxategiek baimen bereziak dituztela .Era ezberdinetan alda daitezke baimenak. Ikus ditzagun : sudo chmod 750 kaixo.sh edo sudo chmod u=rwx,g=rw kaixo.sh. ( aldatzeko root izan behar dugu, horregatik sudo hori )
  • Baimenak aldatu ondoren , gure lehenengo script-a egikaritu ahal dugu idazten ./kaixo.sh
  • bash shell-ak bilatu behar dituen fitxategiak inguru-aldagai batean jasotzen dira.PATH da aldagai hori ( letra larriaz!!!!) . Ordenagailuan daukagun aldagai horren balioa jakiteko idatzi komando-lerroan echo $PATH .Zuk aldatu ez baduzu, ohikoena da /bin : /usr/bin izatea, hau da komandoak /bin karpetan edo /usr/bin beste horretan aurkituko dira. Horregatik, komando-lerroan kaixo.sh idazti dugunean ez duela fitxategia aurkitzen erantzun digu. Baina PATH -aren balioa alda dezakegu, horretarako idatzi PATH=$PATH:. ; hau da balio berria izango da: zaharrena -$PATH- , gehi laneko katalogoa , puntuz (.) adierazten dena, horretan script-a gordeta baitago. Kontuz, berdin ikurraren (=) aurrean eta atzean ez dagoela hutsunik egon behar; bestalde : ( bi puntu) PATH balioak bereizteko erabiltzen dira.
  • PATH ez badugu aldatu nahi , script-a /bin edo /usr/bin karpetatik batean gorde, hori arrikutsua bada ere. Hobe izango litzateke gure script-etarako katalogo bat /usr/bin katalogoan sortzea, ondoren gehitu PATH aldagaian!!!.
  • Gertatzen dena da, PATH aldagaiaren balio berria desagertuko dela ordenagailu amatatu ondoren; behin betikoan jartzeko ikasiko dugu beste momentu batean


2008/02/04

Bash programazioa II

ESPRESIO ERREGULARRAK
Hain ezaguna den *.txt adierazpena espresio erregularratzat jotzen dugu, hau da * karaktereak esanahia berezia du esaldi hauetan.
Adibidez, exekutatzen badugu
  • ls -l *.txt txt hizkiekin bukatzen diren fitxategiak zerrendatuko dira
  • ls -l fi*t fi hizkiekin hasi eta t-rekin bukatzen diren fitxategiak aterako dira
* karaktere horretaz gain , badaude beste espresio erregular batzuk. Hona hemen sarri erabiltzen diren zenbait.
? edozein karaktere ordezkatzen du . et?e izan daiteke etxe, etze,etse. Adibidea
  • ls -al urtea200? : urtea200a ,urtea2003 urtea200d urtea200x ,...izango da emaizta, baina ez urtea20010,...
Parentesiak [] karaktere multzo bat ordezkatzen du. Ikus dezagun adibide batekin, e[t,n]e honekin bi hitz ordezkatzen ditugu : ene , ete . ASCII karaktere multzo bat adieraz daiteke: [a-z] edozein letra ordezkatzen du; are gehiago [a-zA-Z] letra xeheak eta larriak ordezkatzeko; edo [a-zA-Z0-9] etab.
Adibidea:
  • ls -al ariketa[0-9] : ariketa0, ariketa1, ariketa2,...ariketa9 bistarauko dira, existituz gero
Hau da, [..] barruan dauden karaktereetaik BAT bakarrik hartu
Kontuan izan komandoek , ls, cp,... etab, ez dituztela espresio erregularrak ikusten, baizik eta euren emaitza. Ikus dezagun hurrengo adibidea:
  • cp fitxategi[0-4] /Home/jon
Lehenengo, espresio erregularra garatuko zen : fitxategi0 fitxategi1 fitxategi2 fitxategi3 fitxategi4 .Oduan, multzo honetako bat edo geihago existituz gero kopiatko dira adierazitako katalogora, baina bat ere ez balego emaizta ( errore mezua) izango litzateke eta honako zerbait ikusiko genuke
cp: fitxategi[0-4] : No such file or direktory.
hau da, hartzen du fitxategi[0-4] fitxategiaren izena eta, jakina ez dago laneko katalogoan.

! karaketerak "EZ HARTZEKO" balio du. Ikus dezagun adibidea:
  • ls -al [!0-9]fitxategiak
digitoz hasten ez diren fitxategiak zerrendatzeko
Informazioa geihago , hemen

Bash programazioa I

SARRERA

Shell programa bat da, eta teklatuan sartzen diren karaktereak atzematea ditu, Windows-en monduan command.com programak egin zuen antzera. Karektereek Sistema Eragileak (SE) ulertzen dituen aginduak osatzen badituzte , agindu horiek fitxategi batean jaso ahal dira gero egikaritzeko.Fitxategi horiek script-tzat ezagunak dira. Garai batean hori zen SE-ra aginduak pasatzeko bide bakarra, egun GUI ( Graphical User Interfaces) , hau da era grafikoak, badauzkagu gauza bera egiteko.

Linux sistemak shell batzuk ditu : bash, tcsh, zsh,... Programa hauekin script-ak sortzen dira ; hurrengo adibideetarako Bourne Again Steve Bournek -bash- Shell erabiliko dugu.

Esan den moduan, ariketak kontsolan ( CLI : Comman Line Interfaces ) probatuko ditugu .Labur bilduz, script bat egiteko behar duguna da: textu editore bat, eta shell bat. Editorea Linux-ek duen vi, nano, gedit, ..., eta shell-erako bash delakoa.

Hasteko , begiratuko dugu erabiltzen dugun shell zein den; horretarako ireki terminal bat eta idatzi:

echo $SHELL.

Emaitza /bin/bash izango da; hau da bash programa /bin karpeta dagoena. Bertsio batzuk daude, jakiteko zein dira daukaguna, idatzi

echo $BASH_VERSION

Gure makinan erabili ahal diren beste shell-ak zeintzuk diren ; egikaritu

cat /etc/shells

(Ez baduzu bash erabiltzen, lehentsia egiteko idatzi chsh -s /bin/bash , hau da ChangeShell (chsh ) bash-era) .

Honaino ailegaturik, alde batetik ,esan dezakegu prest garela script-ak egiteko, bestetik erabili ditugun aginduetan hitzak era ezberdinetan idatzita daudela; adibidean echo $BASH , echo agindu bat da, eta $BASH ingure-aldagaia , era horretan adierazten dira : aginduak letra xehez ,aldagaik larriaz

Script-lengoaia hauek exekutatzeko ez dira konpilatu behar, interpretatzeko modukoak direlako, hau da, aginduak banan-banan probatu ahal ditugu eta aldaketaren bat eginez gero zuzenean ere konproba daitezke.Dena dela, goi mailako lengoia batek dituen agindu egiturak ditu bash programak: aldagaiak, balditzazko egiturak, errepikakorrak etab.