Assembler-tyyppisiä käskyjä on tuhansia joten normaalilla tavalla niitä ei voi esittää vaan ne täytyy esittää monella merkillä, esimerkiksi: ${muuttujanimi##*joku-merkki} tai jotain muuta ihan toisenlaista merkkisotkua - merkkisotkua siksi että niitä voisi lajitella senmukaan minkätyyppistä toimintaa ne edustavat - tosin täydelliset määrittelyt ovat hävinneet historian kätköihin ja vain muutamia on saanut kaivettua takaisin esiin.
- mutta kaikissa on tuo: joku-merkki - ja se voi olla yksittäinen merkki, merkkiryhmä, regex, matemaattinen toiminto, funktiokutsu parametreineen ... tai jokin niiden yhdistelmä ... tai jotain muuta jonka BASH tuntee.
- niin kauan kuin yksinomaan assembler-tyyppisiä käskyjä on peräkkäin tulkataan ne kaikki samalla kerralla - ja lisäksi tulkki on järjestelmä-funktio joten se taitaa pystyä omissa tehtävissään moniajoon.
- assembler-tyyppiset käskyt toimivat myös matriisien kanssa - ja niillä voi määritellä käsittelyyn jonkun tietyn jäsenen tai määrätä kaikki jäsenet käytäväksi läpi
- regex:illä voi käsittelyyn määrätä matriisista halutun osajoukon - siis esimerkiksi jäsenet väliltä 4-7 tai kun arvossa on jokin määritelty sana (elikä vain matriisien suhteen toimiva 'super grep')
- joten assembler-tyyppiset käskyt ovat se keino jolla C-kieli alistetaan BASH:in palvelijaksi - kokemuksia ei vielä paljoa ole joten voi sanoa vain: ainakin jossainmäärin - mutta toisaalta on ihan mahdollista että edistyneemmästäkin matematiikasta saa nopeaa. Muuten aikanaan kun joku tosi isokenkäinen huomasi assembler-tyyppisten kyvyt riensi hän valmis-ohjelmien avuksi etteivät ne ihan reensijalle olisi jääneet ja laski sumuverhon 'Parameter Expansioitten' ylle.
On vain yksi paikka mistä assembler-tyyppisiä käskyjä löytää esimerkki-muotoisina ja kunnollisten selitysten kera: kansainvälisiltä foorumeilta vanhojen koodareiden kauan sitten kirjoittamista vastauksista toisten esittämiin kysymyksiin - silloin kauan sitten internetissä puhuivat vain totiset torvensoittajat ja kaikkeen saattoi luottaa - niitä viestejä kun lukee lukemattoman monia niin assembler-tyyppisten käskyjen muutkin hyödyt alkavat selvitä: niiden nopeus, vakaus, se että niitä voi ketjuttaa kuinka monta tahansa nopeuden paljoakaan laskematta eikä sitä että ketjuttamalla vain muutamia assembler-tyypisiä käskyjä saa aikaan uskomattoman monimutkaisia toimintoja - jotka edelleen ovat nopeita.
Mutta noiden esimerkkien löytymiselle on yksi suuri hidaste: oikeita hakusanoja - esimerkiksi googleen - on hyvin vaikea määritellä - oikeat löytyvät usein vasta lukemattomien harha-iskujen jälkeen. Toisaalta sellaista aihepiiriä ei ole jota joku ei olisi ratkaissut - elikä: etsi niin varmasti löydät jos jaksat yrittää. Mutta joudut kyllä silloin-tällöin kantamaan myös oman kortesi kekoon - joten jaa keräämiäsi tietoja jotta jaksaisit jatkaa.
- kuinkahan tekoäly löytää kun oppii määrittelemään 'Parameter Expansion' yleisiä piirteitä?
Mutta ilmeisesti noiden vastauksien olemassa-olo ei ole ollut jonkun mieleen sillä nuo viestit on pyritty häivyttämään pois - ja koska netistä on puoli-mahdotonta poistaa toisten kirjoituksia niin ne on haudattu lukemattomien sellaisten vastausten alle joissa on vain tavanomaisia ratkaisuja. Koska niin tapahtuu poikkeuksetta niin voiko kyseessä olla ihmisten normaali toiminta sillä assembler-tyyppinen ei ole koskaan kysymyksen monien vastauksien loppu- eikä alkupuolellakaan vaan keskellä josta se on varmasti hidas löydettävä?
Jos jaksaa kerätä noita assembler-tyyppisiä käskyjä niin lopulta saa koottua niitä niin paljon ettei niin suurta kokonaisuutta hallitse ukko-uotinenkaan - joten ratkaisuksi voi koota niistä järjestettyjä joukkoja yhteen luntti-lappuun jota sitten voi selata editorissa. Ja kutsua niitä assembler-tyyppisiksi käskyiksi.
---
Toinen tapa esittää äsköinen asia: koska BASH toimii tulkatun kielen hitaudella niin saavuttaakseen nopeuden se pistääkin käännetyn ja moni-ajoon kykenevän ja siten nopean C-kielen tekemään työn. Vanhat virtuoosit - ne 50 vuoden takaiset - osasivat suorittaa asiat noin. Jostain syystä hekään eivät kertoneet saavutuksestaan kunnolla - esimerkiksi äsköisillä sanoilla. Eivätkö he tajunneet mitä olivat saaneet aikaiseksi? Vai älytettiinkö heitäkin - siis uskoteltiin ettei semmoista kykyä saa hyödyntää?
Nykyään RUST-ohjelmointikieli on tunkemassa Linuxiin. Sillä on tämä sama kyky ja Pythonilaiset ovat kitkeriä.
---
BASH:ia on siis vahingoitettu paljon pahemmin kuin tähänmennessä on varmistettu toimivilla skripteillä: se BASH josta normaalisti puhutaan muodostaa prosentin murto-osan siitä mikä BASH:issa toimii moitteetta: joukko-opit, bitti-operaatiot, bit-wise operaatiot ja monet muut. Mutta koska on esitetty ettei BASH:in oma desimaali-matematiikka toimi niin kaikkea tuota käytetäm erittäin vähän. Mutta koska noiden joukkojen jäsenet toimivat hyvin assembler-tyyppisissä käskyissä jotka lisäksi mahdollistavat nopean desimaali-matematiikan niin sehän johtaa mullistavasti parempaan BASH:iin - ihan toinen asia on onko BASH:ista sittenkään enää mihinkään koska se on päästetty rappeutumaan jo vuosikymmeniä. Ja vielä epä-selvempää on kuinka aikaavievää on opetella tuota uutta BASH:ia - tai ensinhän sitä hyödyntämään täytyisi tehdä monia skriptejä esimerkeiksi - sillä täysin varmasti se on joillekuille niin kammottava asia että he tappelevat vastaan puukoin ja puntarein.
***
BASH-raamattu eli 'man bash' ei käsittele ollenkaan käsitettä nimiparametri (=namedparameter - tai millälailla se haluaankin kirjoittaa). Mutta tosi-suuret skriptit tarvitsevat niitä sillä funktiokutsussa voi arvoparametreja käytettäessä olla vain yksi tekstijono ja senkin täytyy olla viimeisenä - mutta nimiparametreilla tämmöistä rajoitusta ei ole. Mutta BASH haluttiin rajoittaa toimimaan vain pienissä skripteissä joten ei kerrottu että toimivathan ne nimiparametritkin BASH:issa. Mutta sen nimiparametrien käsittelemättä jättäminen tekee sen että luullaan etteivät nimiparametrit toimi.
Kyllä nimiparametrienkin toiminnoista on kerrottu ihan samassa BASH-raamatussa kuin kaikesta muustakin mutta sen osat on ripoteltu sinnetänne - eihän sitä tosin voi vannoa että BASH-raamatun tekijät olisivat tajuneet että heidä kuvaamansa toiminnot muodostavat yhdessä nimiparametrin mutta olen varma että ovat tienneet.
Teoriassa nimiparametritkin ovat yksinkertaisia koska konekin ne käsittää - mutta se käsittää ne vain kun esitystapa on sille sopiva - ja ihminenkin käsittää ihan yhtähyvin jos asia esitetään hänelle sopivalla tavalla - ja koneen ja ihmisen tavat ovat ihan erilaisia. Nyt voi vain yrittää tehdä esimerkkejä ja koettaa kuvata miten BASH:in nimiparametrit toimivat.
Kyse on kahdesta osasta:
1. käsky: set. Käsky set on tarkoitettu arvoparametrien muodostamiseen muuttujan arvoista ja käsky toimii aivan samallatavalla sekä pää-ohjelmassa että funktiossa - siis se tekee aivan nuo samat $1, $2, $3 .... $n parametrit kuin arvoparametritkin ovat - ja näinhän BASH-raamatussa sanotaankin.
2. nimestä set tekee parametrin $1 joka tulostettuna on sama nimi kuin ennenkin. Mutta funktiossa oltaessa siihen tulleiden parametrien arvot voi tulostaa käskyllä: ${!parametrin numero} ja jos set otetaankin siitä niin saadaankin arvoparametrien joukko ja senjälkeen voidaan toimia täysin samallatavalla kuin olisi alunperinkin toimitettu funktioon arvoparametrit - elikä jo tehdyt skriptit toimivat samallatavoin kuin ennenkin vaikka niille toimitetaankin tämänjälkeen muuttujista vain nimet.
Tai asia voitaisiin esittää näinkin: myös BASH pitää kirjaa muuttujistaan ja antaa kirjanpitonsa kaikille luettavaksi. Kun pääohjelmassa on määritelty:
apu1="kaliberi:7.62 nopeus:2km/t yö-aikaan" niin tulkki tekee siitä muuttuja-taulukkoon rivin: declare -- apu1="kaliberi:7.62 nopeus:2km/t yö-aikaan". Tai:
apu2=77 niin tulkki tekee siitä muuttuja-taulukkoon rivin: declare -- apu2="77"
- matriisista tulkki tekee hieman toisenlaisen rivin joten ei sotketa esitystä matriiseilla.
Kun annetaan funktio-kutsu:
function arvoparametrien_muodostaminen_funktioon_passatusta_muuttujan_nimestä () { apu=$1; set -- "${!1}"; echo muuttujan nimeltä:$apu arvot ovat: $@ ;}
apu1="kaliberi:7.62 nopeus:2km/t yö-aikaan"; apu2=77
arvoparametrien_muodostaminen_funktioon_passatusta_muuttujan_nimestä apu1 apu2 ja sitten seuravat loput parametrit jos niitä on. # siis kutsussa on apu eikä $apu
niin kutsutussa funktiossa käsky: set "${!1}" neuvoo tulkkia hakemaan muuttujien kuvauksista rivin jonka alussa lukee teksti: 'declare -- apu1=' ja tulostamaan siitä eteenpäin - joten siitä tulee: kaliberi:7.62 nopeus:2km/t yö-aikaan. Minut kai hirtetään jos sanon että tämä tehdään osoitin-laskentana.
- "${!1}":ssä tuo 1 viittaa ensimmäiseen parametriin; sitä muuttamalla voit tulostaa minkähyvänsa parametrin arvot - joten #${!1} tulostaa:kaliberi:7.62 nopeus:2km/t yö-aikaan - ja "${!2}" tulostaa:77. Onhan tämä sotkuisempaa kuin muissa kielissä varsinkin jos nimi-parametreja on useampia mutta toiminta on silloinkin nopeaa. Muuten parametrin $1 arvo muuttuu set-käskyssä joten se kannattaa kopioida johonkin apu-muuttujaan ihan aluksi.
- samassa kutsussa saa olla sekaisin vaikka kuinkamonia nimi- ja arvoparametreja eikä sillä ole väliä missä järjestyksesä ne ovat. Arvoparametrin ensimmäinen merkki on $ ja nimiparametrin ensimmäinen merkki on yleensä aakkonen.
- set:in kytkimetkin kuvataan BASH-raamatussa ihan hyvin. Muuten tuo set:in perässä oleva -- on ilmoitus tulkille että onpa kytkimiä ollut tai ei niin jokatapauksessa tämänjälkeen niitä ei enää tule - joten seuraavan luettavan edessä mahdollisesti oleva miinusmerkki on tosiaan miinusmerkki eikä siis kyse ole uudesta kytkimestä.
- ei tätä tapaa yleensä kannata käyttää vaan sitä aikaisemmin esitettyä joka hyväksyy matriisitkin - mutta esitin tämän sillä tämä on yksinkertaisempi.
---
se aikaisemmin esitetty tapa joka joka tuntee kaikentyyppisistä muuttujista ihan kaiken ja toimii silti nopeasti on sekin BASH-raamatun tiedoista kasattu mutta vielä useammista kohdista. Sitä kannattaa käyttää ja mutta siitä täytyy tehdä funktio sillä ei tällainen pitkä litania muistissa pysy. Samanlaisia pitkiä funktioita on todella paljon joten 'kirjastikielto' on todella pahantahtoinen teko ja tarkoitettu romuttamaan kieli. Mutta tähän tehtävään sovellettuna tuo parempi tapa olisi:
function arvoparametrien_muodostaminen_funktioon_passatusta_muuttujan_nimestä () { apu2=$(declare -p $1); declare ${apu2:8:2} apu=${apu2#*=}; echo muuttujan nimeltä:$1 arvot ovat: ${apu[@]} ;}
apu1="kaliberi:7.62 nopeus:2km/t yö-aikaan"; apu2=77
arvoparametrien_muodostaminen_funktioon_passatusta_muuttujan_nimestä apu1 apu2 ja sitten seuravat loput parametrit jos niitä on. # siis kutsussa on apu eikä $apu
- ainoastaan nimiparametrit voi palauttaa. BASH:in ei tosin tarvitse palauttaa mitään mutta jos kuitenkin halutaan tehdä parametrien palauttamista vastaava toiminto annetaan BASH:issa funktion lopussa käsky: read $1<<< $apu. Tässäkin ykkösen paikalla on palautettavan parametrin numero.
- BASH:issa ei tosiaan ole automatiikkaa juuri mihinkään vaan kaikki on hoidettava itse - puhe opetuskielestä on siis ihan vakavaa sillä tämä BASH-toteutus kertoo kuinka kaikissa kielissä asiat tehdään siellä esiripun takana - toiminnan nopeus ei paljoakaan kärsi mutta monimutkaisen tuntuistahan tämä on.