1
Ohjelmointi, palvelimet ja muu edistyneempi käyttö / Vs: Ohjeita shell-skriptaukseen (bash)
« : 04.04.26 - klo:09.13 »
Linux-BASH:in vanhat käskyt kuuluvat tulkkiin joten ne ovat yli kymmenen kertaa nopeampia kuin uudet käskyt jo yksinäänkin. Koska skriptiä hidastaa eniten tulkkaus ja koska peräkkäiset vanhat käskyt tulkataan kerralla niin niiden 'joukkonopeus' on vielä kymmeniä kertoja suurempi - siis jokainen uusi käsky aloittaa uuden tulkkauksen.
Vanhat käskyt osaavat myös tehdä yhteistyötä funktio-muotoon kirjoitetuissa skripteissä ja se johtaa siihen että niillä voi poikkeuksetta tehdä nopean funktion mahdottominakin pidettyihin tehtäviin - voit unohtaa kaikki 'BASH ei osaa' puheet - lisäksi kaiken voi tehdä itse eikä tukeutua tehtyihin ratkaisuihin - ilmeisesti juuri sitä pelättiin kun päätettiin tuhota BASH - sillä eihän montaakaan virtuoosia silloin tarvittaisi.
Vanhoilla käskyillä on ihan samat sisäiset loopit ja matriisit kuin uusillakin joten yleensä ne ovat yksinäänkin yhtä kykeneviä kuin uudetkin. Mutta kyllä kumpiakin silti tarvitaan sillä kumpikin on toisen tehtävissä surkea - siis vanhat käskyt loistavat muistin käsittelyssä ja vanhat käskyt loistavat tiedostojen käsittelyssä. Lisäksi jotkin uusista käskyistä ovat todella isoja C-kielisiä ohjelmia eikä niitä ole helppo korvata.
Tehdyt funktiot on pakko lisätä tiedostoon ~/.bashrc jotta ne toimisivat kaikissa skripteissä tekemättä mitään - siis skriptisi nopeutuisivat paljon, oppisivat matematiikkaa ja kaikkea sellaista joista sanotaan: 'BASH ei osaa'. Lisäyksissä pitää kuitenkin käyttää järkeä sillä ei kaikkea kannata sinne laittaa ja vaarallistakin se on jos ei tiedä kuinka se on tehtävä.
BASH:issa on myös kymmenin tuhansin käskyjä jotka toimivat uusien käskyjen kanssa niin huonosti ettei niiden käyttämisessä ole mitään järkeä - joten ne ovat melkein hävinneet historiaan. Niissä taitaa lymytä seuraava vallankumous sillä ne toimivat vanhojen käskyjen kanssa loistavasti. Taidan vaan olla niin vanha ja väsynyt etten jaksa tutkia.
Melkein kaikki kuvaukset vanhoista käskyistä on tuhottu määräysten mukaan - tosin BASH raamatussakin on kuvaus muutamista vanhoista käskyistä mutta niiden nopeudesta ja vielä suuremmasta ryhmänopeudesta, suuresta lukumäärästä ja ryhmä-työskentelyn mukanaan tuomasta kyvykkyydestä ei ole minkäänlaista lausuntoa siellä eikä muuallakaan. Vasta koottuani vanhoja käskyjä ison joukon aloin aavistelemaan niiden kyvykkyyttä sillä kyvyt ilmenevät vasta kun vanhoja käskyjä tuntee riittävä monia jotta ryhmätyöskentely onnistuisi.
Eivät vanhat käskyt sittenkään tuo mukanaan paljoakaan 'vallankumouksellista' vaan lähes kaikki toimisi kyllä uusillakin käskyillä - tosin tautisen hitaasti ja hankalasti - esimerkiksi seuraava kerro9 skripti toimisi kyllä mutta aikaa kuluisi sekunteja. Täytyy ihmettellä mikseivät virtuoosit ole sellaista tehneet sillä ei se ole raketti-tiedettä.
Vanhoihin käskyihin oppii liittämään monia ennentuntemattomia toimintoja - seuraavassa kerro9 funktiossa taas pari:
Kopioi koko koodikenttä kerralla päätteeseen ja paina enter. Näytölle tulee välittömästi:
Tarkistus siitä että desimaalipiste siirtyy oikealla hetkellä. Lukujen siirto nimiparametreina
9.9999999989350756
10.0000000305578522
-9.9999999989350756
-10.0000000305578522
9.9999999989350756
10.0000000305578522
Tarkistus siitä että desimaalipiste siirtyy oikealla hetkellä. Lukujen siirto arvoparametreina
9.9999999989350756
10.0000000305578522
-9.9999999989350756
-10.0000000305578522
9.9999999989350756
10.0000000305578522
- eihän yhden matematiikkaa hallitsemattoman ukon tekoset voi olla matemaattisessa mielessä moitteettomia vaan helposti syyllistyy johonkin hölmöyteen - mutta se piirre näillä funktioilla on että korjaus on aina mahdollinen ja yleensä korjaus on nopea ja helppo tehdä.
Vanhat käskyt osaavat myös tehdä yhteistyötä funktio-muotoon kirjoitetuissa skripteissä ja se johtaa siihen että niillä voi poikkeuksetta tehdä nopean funktion mahdottominakin pidettyihin tehtäviin - voit unohtaa kaikki 'BASH ei osaa' puheet - lisäksi kaiken voi tehdä itse eikä tukeutua tehtyihin ratkaisuihin - ilmeisesti juuri sitä pelättiin kun päätettiin tuhota BASH - sillä eihän montaakaan virtuoosia silloin tarvittaisi.
Vanhoilla käskyillä on ihan samat sisäiset loopit ja matriisit kuin uusillakin joten yleensä ne ovat yksinäänkin yhtä kykeneviä kuin uudetkin. Mutta kyllä kumpiakin silti tarvitaan sillä kumpikin on toisen tehtävissä surkea - siis vanhat käskyt loistavat muistin käsittelyssä ja vanhat käskyt loistavat tiedostojen käsittelyssä. Lisäksi jotkin uusista käskyistä ovat todella isoja C-kielisiä ohjelmia eikä niitä ole helppo korvata.
Tehdyt funktiot on pakko lisätä tiedostoon ~/.bashrc jotta ne toimisivat kaikissa skripteissä tekemättä mitään - siis skriptisi nopeutuisivat paljon, oppisivat matematiikkaa ja kaikkea sellaista joista sanotaan: 'BASH ei osaa'. Lisäyksissä pitää kuitenkin käyttää järkeä sillä ei kaikkea kannata sinne laittaa ja vaarallistakin se on jos ei tiedä kuinka se on tehtävä.
BASH:issa on myös kymmenin tuhansin käskyjä jotka toimivat uusien käskyjen kanssa niin huonosti ettei niiden käyttämisessä ole mitään järkeä - joten ne ovat melkein hävinneet historiaan. Niissä taitaa lymytä seuraava vallankumous sillä ne toimivat vanhojen käskyjen kanssa loistavasti. Taidan vaan olla niin vanha ja väsynyt etten jaksa tutkia.
Melkein kaikki kuvaukset vanhoista käskyistä on tuhottu määräysten mukaan - tosin BASH raamatussakin on kuvaus muutamista vanhoista käskyistä mutta niiden nopeudesta ja vielä suuremmasta ryhmänopeudesta, suuresta lukumäärästä ja ryhmä-työskentelyn mukanaan tuomasta kyvykkyydestä ei ole minkäänlaista lausuntoa siellä eikä muuallakaan. Vasta koottuani vanhoja käskyjä ison joukon aloin aavistelemaan niiden kyvykkyyttä sillä kyvyt ilmenevät vasta kun vanhoja käskyjä tuntee riittävä monia jotta ryhmätyöskentely onnistuisi.
Eivät vanhat käskyt sittenkään tuo mukanaan paljoakaan 'vallankumouksellista' vaan lähes kaikki toimisi kyllä uusillakin käskyillä - tosin tautisen hitaasti ja hankalasti - esimerkiksi seuraava kerro9 skripti toimisi kyllä mutta aikaa kuluisi sekunteja. Täytyy ihmettellä mikseivät virtuoosit ole sellaista tehneet sillä ei se ole raketti-tiedettä.
Vanhoihin käskyihin oppii liittämään monia ennentuntemattomia toimintoja - seuraavassa kerro9 funktiossa taas pari:
Koodia: [Valitse]
function kerro9 () { # tulo on korkeintaan 18 numeroinen desimaali-luku. Sekä nimi- että arvoparametrit toimivat. Tulos tulee kerro9 nimiseen muuttujaan.
[[ ${1:0:1} =~ [-+.0-9] ]] && { apu1=$1; apu2=$2 ;} || { eval apu1=\$${1/\.*}; eval apu2=\$${2/\.*} ;}
apu=$((${apu1/\.*}*${apu2/\.*}))
kokonaisia=${#apu}
tulos=$((${apu1/\./}*${apu2/\./}))
[[ ${tulos:$apu<1:2} -eq 10 ]] && kokonaisia=$(($kokonaisia+1)) # tämä lause varmistaa että desimaalipiste siirtyy oikealla hetkellä
# ${tulos:$apu<1:2} --> totuusarvon (tai yleensäkin arvon) tulostavaa funktiota voi käyttää
# muuttujana - ja muuttuja jolla on parametrit (~tarkenteet) on aikaisemmin BASH:issa tuntematon ilmaus.
# aikaisemmin käsky oli: ${tulos:1-$apu>1:2} -> kaksoispilkun jälkeisessä osassa matematiikka on ihan normaalia
read<<<${tulos:0:$kokonaisia}.${tulos:$kokonaisia} $FUNCNAME ;}
echo; echo Tarkistus siitä että desimaalipiste siirtyy oikealla hetkellä. Lukujen siirto nimiparametreina
luku1=3.16227766; luku2=3.16227766; kerro9 luku1 luku2; echo $kerro9
luku1=3.16227766; luku2=3.16227767; kerro9 luku1 luku2; echo $kerro9
luku1=3.16227766; luku2=-3.16227766; kerro9 luku1 luku2; echo $kerro9
luku1=3.16227766; luku2=-3.16227767; kerro9 luku1 luku2; echo $kerro9
luku1=-3.16227766; luku2=-3.16227766; kerro9 luku1 luku2; echo $kerro9
luku1=-3.16227766; luku2=-3.16227767; kerro9 luku1 luku2; echo $kerro9
echo; echo Tarkistus siitä että desimaalipiste siirtyy oikealla hetkellä. Lukujen siirto arvoparametreina
luku1=3.16227766; luku2=3.16227766; kerro9 $luku1 $luku2; echo $kerro9
luku1=3.16227766; luku2=3.16227767; kerro9 $luku1 $luku2; echo $kerro9
luku1=3.16227766; luku2=-3.16227766; kerro9 $luku1 $luku2; echo $kerro9
luku1=3.16227766; luku2=-3.16227767; kerro9 $luku1 $luku2; echo $kerro9
luku1=-3.16227766; luku2=-3.16227766; kerro9 $luku1 $luku2; echo $kerro9
luku1=-3.16227766; luku2=-3.16227767; kerro9 $luku1 $luku2; echo $kerro9
Kopioi koko koodikenttä kerralla päätteeseen ja paina enter. Näytölle tulee välittömästi:
Tarkistus siitä että desimaalipiste siirtyy oikealla hetkellä. Lukujen siirto nimiparametreina
9.9999999989350756
10.0000000305578522
-9.9999999989350756
-10.0000000305578522
9.9999999989350756
10.0000000305578522
Tarkistus siitä että desimaalipiste siirtyy oikealla hetkellä. Lukujen siirto arvoparametreina
9.9999999989350756
10.0000000305578522
-9.9999999989350756
-10.0000000305578522
9.9999999989350756
10.0000000305578522
- eihän yhden matematiikkaa hallitsemattoman ukon tekoset voi olla matemaattisessa mielessä moitteettomia vaan helposti syyllistyy johonkin hölmöyteen - mutta se piirre näillä funktioilla on että korjaus on aina mahdollinen ja yleensä korjaus on nopea ja helppo tehdä.
