Ksh

From ICO wiki
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Skoop

Teema on mõeldud, mitte päris algajale, sest lausetes on suhteliselt keerulisi väljendeid ja mingeid baas asju võiks teada enne kui teemat lugeda.


Kornshelli pilt

Originaali autor:

David G. Korn[1]

Avalikustatud:

14.juuli 1983

Operatsioonisüsteem:

rist platvorm

Litsents:

AT&T ksh, mksh, pdksh

Veebileht:

www.kornshell.com/

Sissejuhatus

Kornshelli keel disainiti ja arendati David G. Korni poolt AT&T Bell laboris. See on interaktiivne käsukeel, mis võimaldab ligipääsu UNIXi süsteemi ja mitmesse muusse süsteemi, mitmetel erinevatel arvutitel ja töökohtadel kuhu see on rakendatud. Kornshelli keel on lisaks veel täielik, võimas, kõrge tasemega programeerimis keel, millega rakendusi kirjutada, tihti palju kergemini ja kiiremini kui teiste kõrge tasemeliste keeltega.See teeb selle eriti sobivaks prototüübide jaoks. On ka kaks teist laialdaselt kasutatud shelli, Borune Shell, mis on arendatud Steven Bourne samuti AT&T Bell laboris ja C shell, mis on arendatud Bill Joy poolt Kalifornia Ülikoolis. KSH’l on neist mõlemast paremad võimalused, lisaks mitmed tema enda lisa võimalused.Seega KSH saab teha palju, et suurendada sinu produktiivsust ja kvaliteeti töös, nii süsteemiga suhtlemises kui ka programeerimises. Ksh programme on lihtsam kirjutada ja nad on sisutihedamad ja loetavamad kui programmid mis on kirjutada madalama taseme keeles nagu näiteks C.

Kornshelli põhieelis üle teiste traditsiooniliste shell keelte on selle kasutus, kui programeerimiskeel. Selle loomisest saati on lisatud mitmeid lisasid, samas säilitades tugeva tagurpidi ühilduvuse Bourneshelliga.

Ksh93 versioon toetab assotsiatiivne massiive ja sisse ehitatud ujukoma aritmeetikat.


Algteadmised

Shelli tüübi defineerimine: Et teha ksh skript(mis on ksh program), loo uus fail, mis algab nii:

#!/usr/bin/ksh

Väga tähtis, et rada ksh´le on õige ja et real poleks rohkem, kui 32 märki.

Skripti algus ja lõpp:

Skript algab esimeselt realt ja lõppeb siis kui ta kohtab „exit´it“ või viimast rida, kõik # ignoreeritakse

Käsu algus ja lõpp:

Käsk algab esimesest sõnast real või kui see on teine käsk real siis esimene sõna peale „;“. Käsk lõppeb kas rea lõpus või „;“, nii et saab panna mitu käsku ühele reale.

print -n "Name: "; read name; print ""

Käske võib jätkata ka järgmiselt realt kasutades „\“ mille kohe järgneb uue rea sümbol, võib olla „return“ klahv:

grep filename | sort -u | awk '{print $4}' | \
uniq -c >> /longpath/file


IF

Põhiline tinglause on „if“

if [ $? -eq 0 ] ; then
	print we are okay
else
	print something failed
fi

Kui $? Muutuja on võrdne 0´ga, siis (THEN) prindi välja sõnum, muuljuhul (else), prindi välja teine sõnum. FYI, „$?“ kontrollib väljumise staatust viimasel jooksutatud käsul.

Viimane „fi“ on nõutud. See lubab sul grupeerida mitmeid asju kokku. Sa võid panna mitmeid asju ifi ja else vahele või else ja fi vahele või mõlema. Sa võid üldse else ära jätta. Kui ei vaja alternatiivi.

if [ $? -eq 0 ] ; then
	print we are okay
	print We can do as much as we like here
fi

Case

Case väide funktsioneerib nagu muutus(switch) mõnes muus keeles. Andes kindel muutuja, hüppab kindlale koodiosale, mille määrab ära muutuja väärtus. Kuigi süntaks on sarnane C´ga väliselt on mõned suured erinevused.

  • muutuja mida kontrollitakse võib olla string, mitte lihtsalt number
  • Ei ole mingit läbi kukkumist „fall through“ ;;’ga, sa saad ainult ühe komplekti käske. Kui sa just ei kasuta „;&“ „;;“ asemel.
  • et heastada seda et läbi kukkumist pole saad sa jagada muutuja seisundit.
  • saad kasutada metamärki „wildcard“ et sobitada stringe
echo input yes or no
read  answer
case $answer in
	yes|Yes|y)
		echo got a positive answer
		# the following ';;' is mandatory for every set
		# of comparative xxx)  that you do
		;;
	no)
		echo got a 'no'
		;;
	q*|Q*)
		#assume the user wants to quit
		exit
		;;
		
	*)
		echo This is the default clause. we are not sure why or
		echo what someone would be typing, but we could take
		echo action on it here
		;;
Esac



While

Põhiline sõlm on kui/samas(while) sõlm, „kui“ midagi on tõene jätka sõlme.

On kaks viisi kuidas sõlme peatada. Kõige loogilisem viis on nii, et kui midagi pole enam tõene. Teine viis on kasutada „break“ käsku.

keeplooping=1;
while $keeplooping -eq 1  ; do
	read quitnow
	if "$quitnow" = "yes"  ; then
		keeplooping=0
	fi
	if "$quitnow" = "q"  ; then
		break;
	fi
done

Until

Teine sõlme tüüp ksh´s on „until“. Nende erinevus on see, et „while“ jätab sõlme käima seni kuni midagi jääb truuks. „until“ teeb sõlme seni kuni midagi mis on vale läheb tõeks.

until $stopnow -eq 1  ; do
	echo just run this once
	stopnow=1;
	echo we should not be here again.
Done

For

„for“ loop on limiteeritud sõlm. See teeb sõlme kindla arv kordi, et vastata kindlale asjade hulgale. Kui sa kord alustad sõlme siis kordus on fikseeritud.

Kõige lihtsam süntaks on:

for var in one two three ; do
	echo $var
done

Mis iganes nime sa paned „var“ asemele, uuendatakse iga väärtusega mis järgneb „in“´le. Nii et eelnev sõlm prindib välja:

one
two
three

Aga sa saad ka muutujad, mis määravad ära asjade nimekirja. Neid kontrollitakse ainult ühe korra, kui sa alustad sõlme:

list="one two three"
for var in $list ; do
	echo $var
	# Note: Changing this does NOT affect the loop items
	list="nolist"
done

Kaks asja mida tähele tuleks panna: 1. It stills prints out "one" "two" "three" 2. Do NOT quote "$list", if you want the 'for' command to use multiple items

Kui sa kasutad „$list“ „for“ real, siis ta prindib välja üksiku rea, „one two three“.


Edasijõudnud muutujate kasutamine


Braces

Vahepeal sa tahad kohe muutujale järgneda stringiga. See võib põhjustada probleeme, kui sa kasutad tavalist õigekirja „echo $a“, et kasutada muutuja, kuna ksh standartina, üritab „targasti“ parsing muutujate nimes, aga ta ei oska su mõtteid lugeda.

Võrdle järgneva kolme rea erinevusi:

two=2
print one$twothree
print one${two}three

Sellist muutujat nagu „twothree“ ei eksisteeri, siis ksh muudab selle tühjaks väärtuseks, esimeses prinditavad reas. Aga kui sa kasutada trakse „{„ et ksh´le selgesõnaliselt näidata. {see on muutuja nimi} Siis ta mõistab et sa tahad muutujat nimega „two“, oleks laiendatud nende kahe tähe keskel.

Arrays

Jah sa saad kasutada „Array“´sid ksh´s, mitte nagu vanades bourne shellides. Süntaks on järgnev:

# This is an OPTIONAL way to quickly null out prior values
set -A array
#
array[1]="one"
array[2]="two"
array[3]="three"
three=3
print ${array[1]}
print ${array[2]}
print ${array[3]}
print ${array[three]}

Erilised muutujad

On mõned „erilised“ muutujad ksh´s, millele ksh ise annab väärtused. Siin on mõned huvitavad:

PWD- alati hetkel kasutuses olev kataloog

RANDOM- erinev number igakord kui sa seda kasutad.

$$- hetkel kasutuses oleva protsessi number

PPID- „vanema protsessi“ ID (aga mitte alati kasutatav funktsioonides)

$?- lahkumise käsk viimaselt käsult, mida skript käivitas.

PS1- sinu „prompt“. „PS1->`$PWD:>`“ on huvitav

$1 kuni $9 – väited 1 kuni 9 edasi antud sinu skriptile või funktsioonile (tegelikult võivad suuremad numbrid olla aga sa pead kasutama trakse selle jaoks)


Erinevad versioonid

On olemas kaks modifitseeritud versiooni ksh93mest, mis lisavad võimaluse manipuleerida graafilist kasutajaliidest: dtksh, mis on osa CDE[2] ja tksh, mis võimaldab ligipääsu Tk widget toolkitile[3].

Mksh[4] mis on aktiivselt arendatud, BSDish-litsentseeritud [5] ksh hõnguline. See on OPENBSDi /bin/ksh [6] otsene järglane ja pdksh [7] troonipärija. Mksh arendus keskendub rohkem koodi teisaldamisele, turva parandustele, UTF-8 [8] ja üritab vältida funktsiooni järjepidevat uuendamist [9]. Oksh on OpenBSD´s /bin/ksh port GNU/Linuxile, mis sisaldab täpselt nii palju lisandeid, et koodi saaks kompileerida GNU/Linuxi süsteemis. Seda kasutatakse standart shellina DeLi Linux [10].

SKsh on AmingaOS [11], mis pakub palju Amiga-spetsiaalseid lisasid nagu näiteks ARexx [12] koostalitlusvõime.

Miks ksh, mitte XYZ programeerimise jaoks?

Bourne shell on olnud „standart“ UNIX shellskripti keele jaoks juba mitu aastat. Kuigi sellel puudub üks väga vajalik asi, lihtsal tasandil. Mõned neist asjadest lisati C-shelli(csh) hiljem. Kuigi, csh ei ole ihaldusväärne kasutada programeerimises mitmetel põhjustel.

Õnneks ksh lisab enamus asju, mida inimesed ütlevad et csh´l on aga sh´l ei ole. Lausa nii palju, et ksh´st sai „POSIX shelli“ põhjaks. See tähendab, et kõik korralikult vastavuses süsteemid peavad omama midagi vastavuses, isegi kuigi seda nüüd nimetatakse sh´ks nagu vana Bourne shelli(nagu näiteks /usr/xpg4/bin/sh on lingitud /bin/ksh, solarises). Täpsemalt öeldes POSIX-vastavuses käitumisega shell on kirjeldatud „IEEE POSIX 1003.2“

Kornshelli võimaluste kokkuvõte

Kornshell kõige arenenum shell versioon mida „ametlikult“ jagatakse UNIX süsteemis. Töö kontroll(Job Controll) koosneb fg ja bg käskudest ja võimalusest peatada töö CTRL-Z´ga

Aliases, mis lubab defineerida kiirkirja nimesid või käske ja käsuridasid

Funktsioonid(osades C shell versioonides ka), mis suurendab programeerimis võimalust ja võimaldab salvestada sinu shelli koodi mälus selle asemel, et failides

Käsu ajalugu(Command history) lubab sul esile kutsuda eelnevalt sisestatud käske

Käsurea muutmine(Command-line editing), mis lubab sul kasutada vi või emacs –stiili käsu muutmiseks käsureal

Integreeritud programeerimise võimalus(Integrated programming features), mitme välis UNIX käsu funktsionaalsus, mis sisaldab test, expr, getopt ja echo. On integreeritud shelli sisse, mis võimaldab tavapäraseid programeerimis tegevusi teha puhtalt ja ilma, et peaks eraldi protsesse tegema

Kontrolli struktuuri(Control structure) eriti „select“ konstruktsioon, mis võimaldab lihtsalt menüüd genereerida. Debugging primitiive(Debugging primitives), mis võimaldab kirjutada tööriistu, mis aitavad programeerijatel debug nende shelli koodi

Regulaarsed väljendid(Regular expressions)- hästi teada UNIXi utiliitide kasutajatele nagu näiteks grep ja awk on lisatud standart failinimede wildcardi kogudele ja shelli muutujate rajatistele

Arenenud I/O lisad(Advanced I/O features) sisaldab võimalust teha kahte-pidi kommunikatsiooni koos samaaegsete protsessidega

Uued võimalused ja muutujad, mis annab sulle rohkem võimalusi muuta enda keskkonda

Suurendatud kiirus- shelli koodi käivitamisel

Turva võimalused- Aitab kaitsa Trooja hobuste ja teiste pahade sisse tungimis skeemide


KKK

Mis on Kornshell?

Kornshell on käsu ja skriptimise keel

Mis on ksh?

Ksh on programmi nimi, mis teostab kornshelli keelt.

Kas lähtekood on vaba?

Alates 2000aastast on ksh93 võimaldatud, kui osa tarkvara pakist, mille nimi on ast-open software package(ast-avatud tarkvara pakk).

Kui ma muudan koodi, kas ma pean need tegema avalikuks?

Ei, see pole vajalik. Aga kui sa jagad need muudatused laiali pead sa võimaldama, inimestel neid võimalusi saada ja edasi jagada koos allikaga.

Kuidas ma saan noole nupud tööle?

Enamus arvutites peaks see automaatselt toimima. Aga kui esineb probleeme peate kasutama keybindings(kiirklahve), et neid tööle saada


Kasutatud materjal

http://www.kornshell.com <- Kornshell ametlik leht

http://www.bolthole.com/solaris/ksh.html <- Kornshell õpetus Philip Brown poolt

http://www.well.ox.ac.uk/~johnb/comp/unix/ksh.html <- Kornshell õpetus kistler@gmx.net poolt

http://docstore.mik.ua/orelly/unix/ksh/ <- Kornshell õpetus Bill Rosenblatt poolt

Autor

Ivar Krustok