10
« Uusin viesti kirjoittanut petteriIII 17.05.24 - klo:07.07 »
Matriisit ovat BASH:issa vähän omituisia. Esimerkiksi matriisin: jokunimi=(1 2 3 4 5 6 7 8 9) kuvaus on:
declare -a jokunimi=([0]="1" [1]="2" [2]="8" [3]="4" [4]="5" [5]="6" [6]="7" [7]="8" [8]="9")
Siitä erotetaan tekstijono joka kuvaa muuttuja arvoja: ([0]="1" [1]="2" [2]="8" [3]="4" [4]="5" [5]="6" [6]="7" [7]="8" [8]="9"). Tekstijono on nykykäsityksen mukaan kummallinen koska on totuttu siihen että matriisin jäsenistä ilmoitetaan vain niiden arvo - mutta tosiasiassa matriisin jokaisella jäsenellä on sekä arvo että osoite. Muitten kielien matriisit vaan ovat sellaisia että niiden osoitteet alkavat aina ykkösestä ja kasvavat yhdellä seuraavalla jäsenellä joten osoite on sama kun jäsenen järjestysluku. Mutta BASH:issa ei ole näin vaan matriisin jokaisella osoitteella voi olla ihan mikä positiivinen arvo tahansa joten sekä arvoa että osoitetta täytyy raahata perässään - kuvatulla tavalla muodostetuilla matriiseilla on erinomaisia lisä-ominaisuuksia mutta noiden lisä-ominaisuuksen soveltaminen käytäntöön on ihmisille niin vaikeaa käsittää että käytännössä niitä ei nykyään enää sovelleta - mutta jokatapauksessa tässä toiminta on otettu huomioon eikä rikottu BASH:in matriisien rakennetta.
- joten luetaan matriisin kuvaus muuttujaan apu1.
- muuttujan apu2 muodostamiseksi annetaan käsky:
declare ${apu1:8:2} apu2=$tekstijono
- tämänjälkeen apu2 on klooni alkuperäisestä muuttujasta - muuten paitsi nimi on apu2 - siis sillä on sama tyyppi ja samat arvot olipa se numero- tai tekstimuuttuja, matriisi tai assosiatiivinen matriisi.
Jälleen selitystä:
käsky:declare täytyy kirjoittaa itse, se ei kopiosta toimi - muu osa kuvauksesta toimii kopiosta mutta muuttujanimi täytyy muuttaa. Koska tuon -a paikalla on muuttujan määreet niin sillä paikalla lukee milloin mitäkin, mutta koska se on aina samalla paikalla niin sillä paikalla oleva kopioidaan - se on tuo ${apu1:8:2}
- muuttujan määreitä ovat: onko kyseessä tavallinen muuttuja vaiko matriisi - tai assosiatiivinen matriisi - ja ovatko parametrien alkiot read-only, integer ...
- jokaista skriptiin lähetettävää muuttujaa kohden täytyy muodostaa oma apu1 ja apu2, apu3 ja apu4, apu5 ja apu6 ... . Ensimmäisen muuttujan nimi on apu2. Seuraavista muuttujista tulisi apu4, apu6, apu8 .... Muuttujat: apu1, apu3, apu5 ... ovat vain väliaikaisia talletuspaikkoja.
- matriiseja saa nimiparametreissa olla kuinkamonta vaan ja ne voivat sijaita kutsussa missävaan.