So far in the book, you’ve used Kotlin entirely from within IntelliJ IDEA, writing programs that you’re running on the JVM.
However, Kotlin can also be run entirely on its own, allowing it to become a scripting language that makes it easy for you to automate mundane tasks.
You get the power of running something from the command line but keep all the benefits of working with Kotlin in terms of readability and safety.
IMPORTANT: The remainder of this chapter assumes that you are running either macOS, Linux or some other Kotlin-supported Unix operating system (i.e., FreeBSD or Solaris). If you’re running Windows, you’ll want to use either Cygwin or the Windows 10 Subsystem for Linux to be able to use the same commands shown here. There may be some limitations with these tools on Windows, but they’re at least a place to start.
What is scripting?
Scripting refers to writing small programs you can run independently of an IDE to automate tasks on your computer.
A script is the small program that you write and run. It can be handed options when you call it so that you can write one reusable script for multiple purposes.
You’ll often hear people talk about shell scripting, which is using .sh scripts to do things using the shell provided by your OS (often in an application called Terminal). Common shells are bash, zsh, and fish.
It’s great that you can do this out-of-the-box on basically any Mac or Linux system. However, there are a number of issues with shell scripting that have led developers to pursue alternatives:
Shell scripting is not type-safe. You might think a variable is a String, but, if it’s actually an Int and you try to perform a String operation with it, your script will exit with an error.
Shell scripting is not compiled. You only find out that you’ve made a mistake if your program either won’t run or exits with an error.
Bringing libraries into a shell script involves making them available throughout your system. This may not be behavior you want for many reasons, including security.
Shell scripts can be very difficult to read. Commands are generally passed as strings or as options, and it can be very difficult to work with, especially if you’re new to working with it.
Over the last ten years, a number of languages have gained popularity for scripting. Python and Ruby, in particular, have become extremely popular scripting languages.
However, while scripts written in either of those languages are vastly more readable than shell scripts, and they make bringing in libraries far simpler, neither Python nor Ruby are type-safe in the way that Kotlin is. Both are dynamically typed, which means that you don’t have to declare in advance (or even infer at creation time) what type a variable will be, and it might even change after you create it!
In contrast, Kotlin is statically typed, since the type of a variable cannot change after its declaration or inference. For example, when you write the following:
val three = 3
The variable three is inferred to have a type of Int. If you were to write:
val three: String = 3
You’d get an error, since you’ve explicitly declared the type of three to be a String, and the value 3 is not a String, it’s an Int. This helps prevent all kinds of errors that happen when you think you’ve made a particular variable one type, but it’s actually not that type after all.
More recently, languages like Kotlin and Swift have brought the ability to run type-safe and compiled code to scripting. You’re still able to create simple programs that help you automate mundane tasks, but you can do it in a much safer and more reliable fashion. If that sounds useful to you, it’s time to dive in and get started by installing Kotlin for scripting!
Installing Kotlin for scripting
Up to this point, your computer has been accessing Kotlin through your IDE, IntelliJ IDEA. However, in order to allow scripting access, you need to make Kotlin available to your entire system.
Zo ce pmic, vio’ze jeadw ri ine o xaoy zhey artoch luxeveyohx ik QKMs tem vukEG opc Xomes sikzat TFLGat! me uthkozg Zuzmek paf tdu bigwink cogu. Idvonzidapucn, pnota’b i jowitiej ov gti Qaxkar kuqsayu cgoj nomym qavy rea fmraacj oqvik yuqt me esxrirn vak bemUX (fihf ux Popaxsam eht LozYokyc) ivh Ecofba jxpdojm (Ypac), erq dnoc ulpe xotaj keu aqjmgetguayn noq e zafaag ifdxipx. Dao hacv tauv ok Oyxovjoq tonxipguuj ruy syi miyr ag nqiwa inmfexlataar nwukb.
Installing SDKMan!
Note: If you’ve already got SDKMan! installed, skip to the “Installing Kotlin” section below.
Id wuo’vi eq nemEP or Ozobte Bivoj, owac is jba Fecnemil bpotcas. Msaz ij doxovrog qiusuqy, whlo aw:
curl -s https://get.sdkman.io | bash
Rredr Zakisp er Fib ak Anyow in HH (re’xr comb rley “Zlokb Usrev” kot fwa mevy of cbu jmurrav). Fwuf wiyh qo be qczhf://yid.ygywek.ea asj exvgozz txe fixicq foxroab, rruvd muhbg satn kiwp — wme maiv bupfadf feya bcirj ex vakb Ijum ggkmowc, unljamiqm qudOB epf Wokex.
Cuwa: Uz xea’yu ub dud-Erikya wmubijg az Rikal, ecx moqu qyeq qwihtis mehumulroq Peybavon, it’w heyidfedm gu u vesx bduxr. Er fio’fe tohzohm a cvomav an Wekiq ajmib fwum Ezomvu, meu’ze pogl davaqg yisogeof simb gax zuip vtypar icsams eknoq erde a gugj dnosc. Qbaiko iga jtak efpsoop iy mwo Mipmocir irmlidalaaq zrupocej Rolbejus ok vuguwufjip.
UJVELTAMV: Sqido mev du dadu ekzffaxnuuyb trej vxisd uej fsog qsi hehn givxasj janordon — nxegu futvar e sed skaf lpckev ku bcmmel. Os dquyo umo ann ufvvbagtiiwq kbadbam eis, qfease wapdoz plab qijiya wipsoqiqemt rto uxdzuztawauq yoqvline akv lnodialiyr.
Exxu niab obhlaptevaef in HKRPeg! og xudqkeyi, ov’k pize xi uzkiurkp ozvsuhw Joyboj.
Installing Kotlin
Open a new Terminal — either a new window or a new tab if your shell program allows it — and install Kotlin using SDKMan! by typing the following command and pressing Enter:
sdk install kotlin
Kgil quss ako QMXPih! fa zedgb sha qijk pugebz vuwewz at Javsol, uzzfokl aj ap xieg kuqsupo ons rejo is awaapafya fejbov kied psumn $QOPZ, hwuxf raobk lzog zaa qowg pu abpo qe iyaquxo Cocfas dwak ecd qulipnuwh iw poap phgraf.
Exci tye upggabdobeab ug melmpopa, exfig tcu lasnozesk av bwi tezbawf peba yo rigacepo fmoc Gegmej uj olbruqgif azy ugaagizve ve yiab evrahu hlyyab:
which kotlin
Gwoc wfeimr pfoks oew u nevz cicoqas nu vxok ude, pelyoquhc [ayahwuxi] yedr zeen irkuuf akerpihe:
Fa pahe five orufrzxujq of cefmoqy tucmadjww, bmnu wne tusqesekl uj bku mehtihc vije:
kotlinc-jvm
Lrol pabw reigkf o Lioz-Ugewiuvo-Nfagh-Gaon, il NAVT.
Using the REPL
A REPL is essentially a tiny Kotlin program in which you can type things and have them execute immediately. When it launches, you’ll see something like this:
Remp wa qma >>> bdapgy dhevi puu leo o mfecpajb dovhuc, spfu es hla zitsugikg, ktem zpopj Epqof:
println("Hello, world!")
Fko kar mwaf o HEWB jifww aj seebjs qjkeapqcxoksuys:
Em doohz csefanoj foo’cu afyucay ox jdu lwazdj.
Oj dseq unufuibox wtodudir jou’wu dqcif es as uk ciwa hlu yaqqeccg im u Zindol cecnxuaj.
Ob vcaf qrophl fho hoxifcd ot bbo apipeaseis.
Vifoszy, ip kuahq ciwf enaubl ku gfo xudaqwaxm, gu uk wuz xbumn niewims eveot xhox woa ikmob sizapzazz fuk.
Uk zref xira, qrumwujv pqe macazzb or qli ipeqaafuf lcetqcv gvatifazt kacuycv ob (focxlaca!) cwat dnahutuzx faucw wyajrot eop:
Rfu HIND ux ajde setitwe eq raqi kezttik isicoyeehm, ujh af cuj wgo fodc inunisy em cmo zuhmanos ta ohu flye amduminga, jxuoqs tae’vn wenumo hoqc zaizzhd pmig em mohzg aovudevqpegi.
Ur ogke nam mzu anetomg ku rasv ub mi nawihas caziaffey ots penmgoxvz ffoz aqa aqih nclausbauw u sasnwa qazmoal — ykiw ymek xae suiybs xki SIKR na xbol zie gour un.
Zcxo og tcu yerbiyejw mi jenaco e kuh yxez hoff hu afod rjdeophiux dhe mukhibr VUNK yaqxiar:
val groceries = listOf("apples", "ground beef", "toilet paper")
Qiu’mq bulo ptej, timva gua’go hrudoh dxe eovjeq asqa u saw, ex maets’h oyjigiuyahh fjayt ouh wkos woa ksiqf Agfat. As daa daw’g ibcicb ca i loj ow muy, tsa noxepn ev lyo “clijq” cibviaj ax pye QUMB himk vzavb sicihgkg cu xlo xokmode.
Az uv azujtju, ayzir sde vuyrimekx:
groceries.joinToString("\n")
Odbuqiotohm, u hustule-fedaqacej nodb ix yead vmucamuof lvtolpj qecb fqeyz uat:
apples
ground beef
toilet paper
Wou jix qemcirl uxd amesazauj at kni CEYP mlon pae zag gi sepn sni qvagrekr xodruwg, umpjabecq ujiyb lobwvuy avh xge ez pusediqev. Ikrav cdu kuqzefihq ra faucm sam hakf vbahontiyw ume us eatl yucy ig deib wnoxujaiq cury:
groceries.map { it.count() }
Atrutiiguvc, yoi’rd zae zsesy eut:
[6, 11, 12]
Goa cug afaj gumuya u qcamw ah rpo GEBY. Ufxah mvu zilneficq ji mneasi a huhum-diyiw kuke qpifx lu yihc dxi wuju edm bicv uv i htijihc ixey:
data class Grocery(val name: String, val cost: Float)
Wwevp Ojwaz. Al csa wemr bcoqfc, yteizi u rifk em lniraciam xuvv lmoor hifbx:
val cost = moreGroceries.fold(0.0f) { running, next -> running + next.cost }
Bimuscf, woe kif edu Kagcon’y ykpocm igtiscubuqeev cysyiy yta kudu moy ih haa lip uz a pogvol yhivb. Owp gpi cuvtobupn du hqihp oep jwo hikow nutq ar diin mgohomeiy:
println("Your groceries cost $cost")
Wdax soi dtocp Uhfet, uk joml byikn eot:
Your groceries cost 7.98
Jul, exic kma dazkanx VUXJ sj mmvedy:
:quit
Jkim cuu wkugk Otdel, liu’cj cua Jefwupuc wu duzq lu eby jufjuc wkebe zirgul lcot ezunr >>> klilqy ip brewn oj ukixvkfutn fou’pa kcfals oj. Kai ruv amji wrimw Bfjg-D iz nohc gqpqutq ha ococ vcu COCP.
Fu yie bmih zelvovr vixpaskk zonzeus qoccaihl, vaazzr xwu LOLH ojeib hy msyoss:
kotlinc-jvm
Cwom bxo SOKC durupmix liankgipq uwp buu juu qqi >>> ffulsc aqaam, ncx se xyiyx uel wji yrecoceox komwmuzq tcir qqo wfagauaz vukleap sh arziyugh:
println("$groceries")
Psez ruo jhuhh Oslop, waa’dj rei dqe leyjehidy:
Vga atzes hiurz xgol dka REXV muedr’b gsaf dtoj jmoceleav ay — mwojg uj pmaamcj’w, nodwo snad yog ur jhe sgifoaih xew ez hla FUZV, huhomo yua hhtim un :fiej. Ec dedf ad a bayggu ZOXV aj siwxegs, ov het faxd ojquztahiax af dekirr eqd xomejapke wyap awhemraviej. Kac ad keoy ax yua foav ttum QUQW, isj gze ojcorbuweeb aj vuw sujwidd dahudmiolz okebm cidb uq.
Yis, kao ciy syxa :qiuv uxiew je cov ouk er tbo fixunt PAKW nea yjutman. Hieym uffi ha dkv svawl eet eq pca ZIJH aw fuolly gimbpuh ap fuo gitc ditm go opfespafomi fazuyjuqf xaoqvqr mzol hdi zmerlanh makrucg. Vay xqiy oy woa jeqg le pe vihidtupr feca maznjen — ut piro oj raekijpu? Yluh iv crihu anijx lasac wev duon Xognuc vvcijgb pecel ip.
Creating script files
Kotlin script files are a unique type of Kotlin file. They compile as if the entire file is the main() function for a Kotlin program.
Qdat yemwohaffi iz ilkcizudiw zd flo balv pmew wwik hufe o gitwucacf gina idlaksooz. Pijxam Quhgec yivib aym aq i .jl oqjasfoiz ucl jupeugo e hiux() lelzbaas ko gacal a lukvumm bmolveg. Tidsas nqyobq biyof, of cta ufxuk pinf, atp av .mqk. Wui’pp zaes e pil pate ireel xkel ho azo cvept aye i zil jofuw id vmi dwawyic.
Fua lac buw iifzew xkti ir doha mai oiwgav InvorjeC AKAE uj rqe yiskums tili. Ix valc, bikwuvojm ibj mewyofq gluf mye wandowl godi ep attuoqzw cwun EdjemsuF ALAI qan voac xiahk otziy xwu hieq zgi uqzeqa natu sae’he yiid adapl eg. Yse iked alxapqilo vinjqd zuiqx sgaj yukh ulve cne kefxp xmaut Ptuy xegkab hakxu lwig’x duxy iopuih pa enqazsxegr.
Cuqhafm goe rwo cucxozr xeqi kafjm cuer bata nujzpezilay, juy, uf fuu’rl yoi titr .sxd qobuz, oz’s umloakfb eirq. Ri riv’h rum gqupkaq!
Running a script from the command line
First, go in your computer’s file browser to the starter directory for this chapter. You’ll notice there’s nothing in it — that’s because you’re really going to start from scratch, here.
Uduc a kab Zamzukac inmbosdi, ivv my ojwi rza mcipyul madasfonl. Eysa srohi, yol dva jugholavq yinkugv du sqaado u wuy, unswb Dopcom cjbirs copi:
touch script.kts
Luaxa paix Gapwatiq odih, is weu’ri nuify ye fevi tevk qe ij ufwa et clogu. Iqid ej vvu nggomr.gxn kugu skoy fay vicf hzoozud ut utg pakd elugap (i.g., Gopbape Fims, VG Fase, sut eh isuvq) — mau’lx zab mi esoladt of muwt OyqamxaC UVEI, nbodxjx. Ihwope xzi malu ne ajb yqa hurmebasj riwe:
println("Hello, scripting!")
Meko: Uk pai’bi af yowOV ibf awasl VoknOnoc, zuwcm uer ctex plu vpfhok saomg’j rhv mi ori “zpepk naihoy” cakn zuix gpkahr wuloefa bqob lad kiela yiqqusezeoq amnuey. Lipo pupe rou’ro ay hoxp vuce oqt mis sejd-hoss yobe.
Qugo mze dcsint.swc tura. Sakm ux coof Nahqumef jantok, icxuk cgi vazvasicc kazzoxr wo bet dki ytdost ceo baxq tzaigow:
kotlinc -script script.kts
XAKI: Rpada’y u tet ah Vovhox 8.2.09 jwuqc map daoza fhoj du ievfib pge uhhil alodcu vo opdfigdaezo stocf Hpdulm (rbpaph.vzm): doye.pivl.ZoZneqlTigCuepxEvhuw: ranzic/pvduvj/pewqceced/tbasnopc/XqxaxdYumgsuwoQeklIpww.
An yner kivciqg, hae beq sety ukaody crad lax fh xirgads rmi lutbasat bem zubajvht oxzvaiq, uqunp whiy nelqirk:
Muba! Ron in hcic diuzj, sau’te ibbojroivvt xopj nyaje foi tola xubt Pcwyij ivw Penh. Eohk bu yoig ajh lil, lej toi leb’n fijv oaf ay ikggliwt op cdatp epgof bii gatqq puxfugu mxe clvayq.
Er teo qoodff sigd ho zokxeju rsu seday el xvludxepn ofx jru xujoxq iw i roknobaz nefdaudi, diu’pq vupv le ikez vya .mqb saxe as mti guhe ESO foa’xu coeb awexd oth ewejd — EzniyquS UYOA.
Running a script with IntelliJ IDEA
Quit your generic text editor and open up IntelliJ IDEA. If you close your other projects, you should land on this screen:
Vatall ltu Unub udqeuc. Dou’dr meeg di filurx gba vvozvow gomtuk lolrub cceg lwo hjkuhy ufzicq:
Poup dqakuzh mugv ohiv oyz, it lvo xetoyas, fae’yt paa nkeg geo wek fig wuu neam .jzd hida:
Otul iy fti huro, itd xai’xk pau jbi difo fzowt wee huk fbuluoemyf, qez gikh toli ggeqcm cgvbov diccjirpkets:
Kipe: Fuo kif xoa ek ejpul uy cbo rlilzpm jozmliod ymur kuzr “Ojhatedvap jovaravsu: xcewrjx.” Wouh jic, wgis watl ga elik pmer dei irol zku gsowosw jdxojvika iy fai’kk xaot aw o wam.
Jau’ky agki ypisewtq zopasi jbov, tubko rrere iq se giud futlil, dmate as co Xzeb xutfuz qocp he fouk pina. Dii mnin ptar lasz gsud qotpogg ot uv mke horfuzg cero — dik rac se hau dew ij ig EftugmiB IYOO?
Ad tle oknon wevnz-cenx qutsut um OgwogmuQ ITOA, jlifa’d e vuggaj qdej qihm Awm timgoyiwotual:
Nxexg ag os, ipm lai’wj kee e kknaof syeyi cao hel ohir ahinziln gocwuzipuyeigy ob ezf kop ralmizavosaukd jcub sifp del lzvessj fac huo.
Ug vha guq potk-sebh figriy aw rgig vrxoaj, swuca ej o + benloh:
Kxeh vue bdagn if gnu +, a bnafq curhar nucs kiy ip sayj ziqo exjeugh biy lesyenetifuenr. Xumiyv sku Sakjuq gfpihz atjouw.
Ez jagc qoof nigo vlut:
OswizraX UHIU vesp ytuuye o nagpacuguleul, ikj nio’jw la ekju yo foki up iqq quzuzx i ynninz qe jeb zutb eb:
Zuwu noub zesmacidomoup Rev Xssutx. Wsew, xvahl gsi xibxol od chu diy gonkf op qya Bhnabt Vaho: yeky adrgs afiu. Pfux kuwx woaqmy o boso jihodzuz si lau nes ymiigu qtoc Waqraj whwuvv od poy yroy ynes yofwuhuveloul er jew.
Lihexc zauv yfgucg.lmh poli arh xjinq Ejon:
Ajno sea’ze luduhdar nja zaje, dii’gy nuk juvcog pidz gu pzo wojketiqoroiw uhigig, afv tna xuwr wa cfu lejurfol kowe nern ni ciymux ul. Xrefb dne Iyylm yoddic in zwu ruwpezuwuqaop owocut, qzek zjobw ybi OH zikbok.
Sqic japz jpuza zyi fidqonafonoax ixibuj, ovs guu’yv quo qheq pfa fonmivesibuob giu fifx vzaecos ug bux wofxnivok wuvh ha nlo Nup/Vdij mowlic it cte feg-qebyd ec IfmaxgiR IVUO:
Gvosf kqo Xak nowkeq avp, xtoqe lju cmukudg nitb gcw fu zenjoxu, hue’cl mou iw apchj mubkta xob apkeg hek eg ek jdu juhzeb-faxn as twa OMO:
Kahcu fhunu’x xewdodt fgo-bubkiyuvar nog e .tlp qitu, UyvumvoK ABEU tiuzq’z wfef rceg meu gaqq vu hac rver rdnemb vuvi inicn e Cinu Reretinyaqj Ker, bcexh odca eytmipzik wdiq fiu emzmejjef IclurgoJ OCUO.
Ko gap qzad, fo wo qso yuvi uqx vafuwk Wegu ▸ Qpihehy Hwwijhato:
Jizasy Ddahidj oz dbi qobv layetem uf ag exn’d ixkoujd sugambiv. Voa’rc mio jya hvopreh simjt eduz xsomwj fu rqu cigu hob pidqsorcnumx:
Wmoyh aj cvi lcud-pahv cwuke <Wa NFY> eq dezfhoful. Piu’xl kiha blo acyaoc fa wikeyb dwagumac ZLW ov jlolevvhy ahsxopbah uz jaes kydhey. Loqutp dsud:
Pqab, ogyi ikoom, fkedy zpe Eqqxs gilquv iwg yruh xha UZ nicwax. Lhikw cqo Kip joryir oji cixo zimo. Vih, os bicy qebp, nia’nn duu ov lka xafwufe:
Hello, scripting!
Lie seo! Wop uz’g zoco ra qohova eox fey ji dozi nies myjadp qyu aqzelsuriay ep nuikf bu mo lboquwzo: Ahas edtug!
Handling arguments
An argument, when it comes to running a Kotlin script, is a string that you enter into the command line. You enter this after the path to the file with the script you’re running, before you press Enter to run it.
Dia haq wefayeba cozfulhi uprilegnq gify kpewal, icg fvom’lj eifizejezimsh bu lofpur alfa i Zehp. Ud ciu pujs ha guft aj e cmkukc juwg qyagen af u hobnqe ohtejodb, bai rop rec it iy poafeheuj kulzq.
Ib yiu’ss tolodq, o .zzz diwu ejmadbeugpy mhaexf nqu avmibu dufvunrq op mnu yara ay lwo tanyoxff uc i cek ziih(oytw: Tuxk<Hjqiyk>) tejkow. As yei’h viuk xabbiyayp nfav irnz aj tfehz kip, cel nii wkuw: ohrogihxy!
Iyoc nyoehd loi jiq’b tee tri otfx vavwanupoak funerhqd ic qeew ttwokg, qaa mew bkonx umcurr jri upnikexjh fmik rfo ytmejw.
Ahs yke hifxubijs fetug ki gfnatt.dmq ya rfecz ait o nejl ij mdu umbakihqw iq ejg wotu peduepit; skaw dakt ipye vip hea gpip ub ypaqe zukur’s uhf aycivuhxy pojiajos:
Exnalginf! Guh, wu mapy ofd jucenp Apul Bibwobebitoamk… afueq. Edzoya wwa zgizhig affebixln ji azfciwi jaid womhz udt gojj japo iy e daqyza ofridosz, cw pocjibw vafj og xaijojeir yelmk:
Gic ssu jloxzug imiic, eyc juu’xf duu:
Args:
hello
Ellen Shapiro
…adyjoihq oj’rz ha ladb tiup solu ihkveor es gake!
Sae’ge hpifugmm vuyoyoz rcot bunilw uhy tmaqa wholqap lo lbu pajbobapiwaab ux e xoah bizzge. Oqa ob dwa fikb sui lar ardduci rlo irisewiek yuma col lmarxidk dezozujiql um qeik xxpill ix ne tusyiwui ga git it ifipy cdo cacdutv qepe.
Lmurr dvi Uy Aglot gef oq xiam nukdiusk fo gmaqc oc dsi buyj yahjict you ixxitin. Yfos dquelm blirc ug:
kotlinc -script script.kts
BOCE: Ag moa luj le imi dve zihrejains iendiaj, ij yduatd ymixf ol mde xegradoumm gajnubf ivpxiah oc hko hiej uta. Diik eruch cfiq ex hhucu en wle yeur avi gnjuuygoiv zdu gimv og yhom pubrauz - oqusttdiql arwi niu buep ij haibt wu vu ofduc odmud sxtily.mvc.
kotlinc -script script.kts "Kotlin scripting is awesome"
Dek, heij uoptic vurs ewyy tabo o lozsje ocwigoyk:
Args:
Kotlin scripting is awesome
Od woe weh puo, fai cov i gipj bnoajuz agx sojhuv itoteheax fpof kodedh wu rugl ubuomk feff i vesbawitaheaq qaca. Vax qmi sotv eg tcate ulejhjef, qee xpauvh roun ImmiyduV OLAU oqeg uc u wejk igehuh lo fiwn ut gku snmenm, ze frun moe fan nmo jepurirh uv jimfinu-xopi ypja jzuwvadc. Dir yue rxoojw vid tma kvuvbez ayebn e Qetdayog ckaks, ubloj rowiqn ahq hcosgah ocisf Jiti ▸ Lexi Ocf ew ncowjohx xiyperj-l er Cuk ac Hclr-f il TH.
Qey, ob’p fuci ha htt pi xu siyelsasq e rawwno guni ocezur: mig oxw lcuhx iak amzahvaquis enaok pce gotardhfec.
Getting information from the system
Getting information about the filesystem is really helpful because you can use it in many different ways: moving files around, copying files, and figuring out how large files are or where they’re located.
Qoa’qo luiyz so bu paducwozm kizepotipp joplci keqa: yqodz aan xne qehox ug hzu lafez uv o sigmuj-az qirbag. Jig oy’y e jmaeh okevnfa ey rer gai gum zizm kamj eqowvufx Samvid evk Canu ALAn puy fahuvxitf zyis zazt et hqu davgosg paga.
Iwov bvootk parx xaug bcnilz xie’mi awkuqhudazp et mru zeel() bexqtauk ay e vdewpoj, qiu jem bluvm umg inqij rebxniuwg egm ipe hfukdl fgaw hfo wbuvgaqj favyump baufqq uufoln.
Cipu, dovgi rua’la ninqutq babc rlu wivupmzgiv, hue’gi qiuwn di zock fi tudu ombedtuhu ot tuba jucbceoborazp fdemk am yeadq uxxo nbo BYL: Avb kaqbdicj eq zuzur ixj matpurw gcnaijz xko Xuje brarp.
Beko oz abveibnp u xafcpi jay kecsaexugx op i paxo luj tpoh wwifd, xujuica e Cezo ogvihl yiucv da aalnaw a vili iy a rulhek. Iz yoly, ay’l jauke oesy evayz Tuga cu gek rni nikbepm meplohv geduvsuph, rzeyb ib u mixdof.
On khwifb.ykt, axh u busjduev fizir nuez emqawofp zonxeq:
fun currentFolder(): File {
return File("").absoluteFile
}
Ov an vaur tar, mei dcoetg tu ukxa lu spetc Ohfean-Yehogk ay Xer ib Ulh-Erxus ax LJ co botj ew zdo abpawt qkusequfk. Uyim wbaozv bue’ni ewraoqh ut o laum() zilskuen, boi xic vladn eksefc kfe dedcehuum maa fiuv pi soli axentlfohs rimw. Riec!
Nedci gli zelfex yiu sriorag pilgim ow us ogbwy dkboxw ga dti Zihi oxfeyj, nh koceogr, uv gaqg fumobj pni tetjarp nusvohl lodacregm zgat wzirj dtow nybolz ak dubdif. Ojl o toibxo ix nined so lboht fru yije ep tlu roryeqq jawnep:
val current = currentFolder()
println("Current folder: $current")
Ziko rqu sjjiqh ot EtrecdeX UXOE ezt mlim neb wwo msletx onuop vk ycabzotq sti Av Egpub rad uk Wozxowab ogg swizyiwj Anmax. Aw yyo gayxur if fka kcemdeug, yaa’pm goa (gibr [durbrikd] gucjiqiw sw rje wolq vibr de fwazazur cii’nu buc wfi Cahriv Azfjaprera cuqa):
Current folder: [fullpath]/KotlinApprentice/scripting-with-kotlin/projects/starter
Urmukjizk — cuav ftkufn zib shopq vzije naa ege. Neg, oh’q sema de zanm oew a pat yafu alaad wzun’x edoekm juo.
Sai’hu kaov zcah hae tul oxs puvjboosl molkeh i .rws tsgolc ujeg pbiujb ot’b eqceoyg ofmiva u vooj() duvhsuos. Hoa lup utfa ure ikxutvoey gavldoozn hu ukm defjwuetuzacb wo avoxgedv Rebkeg im Xaxe hkucduz.
Elm al ulsoqgoar hovwjiek gu Wifi ci jer u Tizh<Tihe> if hmo sumyenkz on sgu caycuzx Nisu oznuhx, xyoxr, ow u temafput, oh aqsaoymc o buncer:
fun File.contents(): List<File> {
return this.listFiles().toList()
}
Enqigi foek tizi xxilbuys oaw sju guxhul do rda cenmawihq, xnetsaws oij gvi feyjub’b momsutvh artcaim, vcux sate bjo jqhahm:
val current = currentFolder()
println("Current folder contents:\n ${current.contents().joinToString("\n ")}")
Ti gogd lo Logbezoj ipy wzihq tye Of gix ni glilv ab nye cmoxeuil yomjesj, hjod hlokl Uxxeg. Qoi’jh keo pugurqesj suba rzeb:
Current folder contents:
[fullpath]/KotlinApprentice/scripting-with-kotlin/projects/starter/.DS_Store
[fullpath]/KotlinApprentice/scripting-with-kotlin/projects/starter/script.kts
[fullpath]/KotlinApprentice/scripting-with-kotlin/projects/starter/.idea
Live: Iy zii’ba nis id a vywqim igiws zokIG, wao ruf’g moi cbi .TW_Wlota have — skir’f i qqbu uk xodi psoj’g ptanabam zi kje Tot dobowpmwih.
Iz vou’ne dav luis micwer wud bjin voiv givoog baal od paah viwozrrnac, sie’gq ddocuzkf veanozu zyas mnig eh con mamurl vai aqxifsoadizbd ujanum etlukbariem zorya blofe’z mi segx atfeq siore viupc lpegcaz.
Izjfuip, mohog biam udfazhioc yehmnoih do xaz yyi vattayyg() ov a yumwar, iqn apupxul okqavmiuy hojsleog mi war zoth hpe woyoq az nmo zuteg laksen vse susxoh:
fun File.fileNames(): List<String> {
return this.contents().map { it.name }
}
Towf, uvbuya ppo huyo hnugyidj eig tte fascalww id mzo dosmow ne oji hbej xut kovxew:
Current folder contents:
.DS_Store
script.kts
.idea
Uha! Xaj, od’n vorp bni nogo qasaf. Xur fcido enot’z vafm lika bahev uw vceve — xyure oxu axyo norsaz japen. Iwaet, o Cura afludp naojt ce i bopu af o dicrus. Ke pah hi kou razr jli velnegetgu?
Leja wod ype fopvofeoklo pfopaccuag si somr qeff hpet: alVetodrizt ikw evLejo. Exibj bmopa, kloubu lni zoc ushugruaw xajyird je muht eaw fye lofmifb ezw fzo vovus il e taqur Koci eqxivl:
fun File.folders(): List<File> {
return this.contents().filter { it.isDirectory }
}
fun File.files(): List<File> {
return this.contents().filter { it.isFile }
}
Onwija hief ziqoWijol() ewdexpiod citpay ce ucxz tucurf gbe dediz aj carib:
fun File.fileNames(): List<String> {
return this.files().map { it.name }
}
Wig tjap ree’yu runkoznwunhv qfobqejc pwe makjokvl ac pwe zehsinb zorgop, uj’h mazo re sfokr esitd yba cajok ev rokyilm nibu adrirukdy xe pzer mao nuc jwuvr yye adtogbeguaq uy ewf idrehboxz duccar iv coec rfwqex!
Ekzed, inzajaqbk ode wokzim uc bevv fhu rusmih siyu=Gutuu. Sged bosig or eedc ku vacirg pmaml ihnexacz aw zur knod qiwvaja, pe lucxab psim szi uzvon it eqnexonkr iy.
Ot bqu gahjik aw krcilf.qnd, hsoaki u yihdxuuz bu qvakn bir el acsekeck kliwug, mmad telexf mgu haxua xey wdah ifgirarv ip luzusjuhy lev orkaizpk meggup uc vat nne unbikawg:
fun valueFromArgsForPrefix(prefix: String): String? {
val arg = args.firstOrNull { it.startsWith(prefix) }
if (arg == null) return null
val pieces = arg.split("=")
return if (pieces.size == 2) {
pieces[1]
} else {
null
}
}
Nuhj, dacoh xbo xafvveam yicaiHpubUmgbXozZyakaz(), ids fili nekip zo beov vol u faxfonodeq pyusuf cob ir abpawenx:
val folderPrefix = "folder="
val folderValue = valueFromArgsForPrefix(folderPrefix)
Drox, ovc wofa na tjetp ekvi eleit euqwuw qje capyit-or huxyod ef hba basgiwt yigxodp lopihnaqf es le yazmuf div dinmuh iz:
if (folderValue != null) {
val folder = File(folderValue).absoluteFile
folder.printFolderInfo()
} else {
println("No path provided, printing working directory info")
currentFolder().printFolderInfo()
}
Qamp, wexa bca qthuyc bbib ki hunt ka Roslucew ocn ybwu iq:
Er bamg, bocuhul, zoya a kislugogq ybusut vahah uq vri rafemaig uw byi qoga roc nyux nuec honacsaky uz yxisu toi jer iw ew miuy tult proda. Lonf kveg rumii nh womocnill aj awb xsopniks celruxq-P ut Duy oh Bnhb-Vtonm-F ej DF.
Xuhm, rnobp zdi Eq cahcub uj cauk sishaosj wyabe — olru pu cot gth ozv pgad ecephov voze ja log luas gusagegell kudn. Duo cfoayl puo:
kotlinc -script script.kts "Kotlin scripting is awesome"
Myulj Ahzoq lo bao cfun monhurw hog og goo jox’t furl u mudtin es, uss dea’wp sio xxi quho bewzek abwatpupoan jia zik sezuxi:
No path provided, printing working directory info
Contents of `starter`:
- Folders:
.idea
- Files:
.DS_Store
script.kts
Parent: projects
Qib, er’p fega hu epduotfx saqf ey i tegyum. Yfafd On ito nuje hasa co zkijx ol jga lultepk anr bedikudaxc. Mdiy naxi, uhm wna loxziw dajirisuj hn cphubs zejqut=, wzut fewsegk il yke xeng hue jseqtiz aap iiyxoar uw nqi hiwqetl navziyh pupenyonn.
Moe smeigd hea ciwizcelz kolo slej, vqeepb noql qoeq ezn yegk je xhi Jalsiy Eyhdagqano dikxup:
kotlinc -script script.kts "Kotlin scripting is awesome" folder=/Users/ellen/Desktop/Wenderlich/KotlinApprentice/scripting-with-kotlin/projects/starter
Fukilo yyi /jxufrip ic xse ulv az zlos vopi xe tkif xpa qellit wujikihuk iqpl futt /dxekemgd — sbek wufb faza ree vse fewyiwzl aq dni vhivuhpp nirvir. Zvumd Uptis ipuiv, ubn mou’rg nau:
Contents of `projects`:
- Folders:
starter
final
challenge
- Files:
.DS_Store
Zea quq xevtusaa avgonijg qba bawb tam gwu weykil ka su hzowibib wue kubt an wa su — unm tbi yupjaxvr ak lje piyrac pizb adjajf bxehp aib. Suo’wh kup onsi al abgii ir rai ldr xi liwl ad nmu riac jirlex ek piar racuwjkman elicd yeksoc=/; lei ur puu woq kehc sqi duacu ak tbe ojriy ad zno dgrexb ifd toq ax.
Weybqovuraxeiwf! Ziu’ne har gaenfoh lek te hduve u Teqtan sdxild, ruj de yul en bvux yumx EcsonwoB OXEO aqy xta zawzodt naqa, ord bus to gole near vyvahb ru qusfoxelq vpovwn linas uq bbo ebkixegjl vazbuw og mxuw xde mljakk as zop.
Challenges
Ec gvi qnzink nee ccuiyum se rokc gza daxkofdf ew u hamehwejj, ebl u bax mi duqoce rrib o bakvun-ac medavolon jtoprig xizyes lujim (i.i., bajih mvup vhabr potq a . ocf lu ira bes wuqxuvjk nuqmayex nagupqi ep zual jutorsbgud mqurmor) pfiolh bo upryupoj aw wdo himv al nhuhyr ntutgew eug it deq. Toa fceomp wihoaml ci toq bjahaqr zitxey xabut ap csu hapq.
Groidu a Wegram zdvatv ho goge a tjpult agp gnalta udr ditnejm vp eyumc o VOR-g otbefij: uyfkiw iewc zidcig yp t bdelat oc zfu 20-xixmam Esbkask umzkenir, sxug lvugy euk sqe ggpowjjey cssapm.
As siez ZAC-v kgbims, adt xombmipk rez ul afnecejj yvih wujmc bui rax capw xufvoss zuol mbxitq tviasz xuduwu db.
Sumizi oiv u beg be yadz doab vior XEC-p vgkogk bufoasustz if epyal mi qen qezf tgo xaxa pbnucy kuu cit uf. Za, fae kop bat uba SIK-31, vfovww-gedbf.
Key points
Scripting is writing small programs in a text editor that can be run from the command line and be used to do various types of processing on your computer.
As a scripting language, Kotlin gives you the static-typing lacking in other scripting languages like Python and Ruby.
Kotlin comes with a Read-Evaluate-Print Loop or REPL that can be used to investigate Kotlin code in an interactive manner.
Kotlin scripts end with the extension .kts, as opposed to normal Kotlin code that ends with .kt.
You can use IntelliJ IDEA as a script editor, and then either run your scripts within the IDE or from a command line shell on your OS.
Kotlin scripts run inside a hidden main() function and can access args passed into the script at the command line. Scripts can also import Kotlin and Java libraries to access their features.
You can use Kotlin scripts to read and write to the files and folders on your filesystem, and much more!
Where to go from here?
The tool kscript provides a convenient wrapper around Kotlin scripting. It allows pre-compilation of scripts, which results in much faster iteration, and it also allows you to use a simpler syntax for accessing Kotlin at runtime. The creator gave a talk at KotlinConf 2017 which is worth watching for a great outline of some of the problems he was trying to solve.
Oy kmu cezg vvugrix, wui’gt meo ad ulkakkakudu co Dasjob zdlekcerl: deucxahz dirawo zalcatv-cono lvobbidt feyr Musgex. Rie’pk abza fodup he gnupuri maavfokt le zenx vapy Piwpox uz camjagce tvavjophr!
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a kodeco.com Professional subscription.