1
Ohjelmointi, palvelimet ja muu edistyneempi käyttö / Vs: Ohjeita shell-skriptaukseen (bash)
« : 05.02.26 - klo:11.16 »
Yksi uusi käsky on hitaampi kuin vanhoista käskyistä kasatut isot skriptit. Uudet käskyt ovat niin tautisen hitaita ettei ole mielekästä niillä numeroita käsitellä. Ja sopii ihmetellä niitä yleisesti hyväksyttyjä harhaluuloja BASH:in kyvyttömyydestä joita vielä opetetaankin edelleen - sillä tosiasiassa BASH kykenee vanhoilla käskyillään mihin hyvänsä.
Kehittämisen arvoisia näillä vanhoilla käskyillä toteutetut skriptit tosiaan ovat sillä skriptien rivimäärän kasvaessa suoritus-aika kasvaa hyvin hitaasti - voi tarvittaessa lisätä ehtoja ja looppeja melko suruttomasti - mutta vaatimus on ettei uusia käskyjä saa skriptissä olla yhtään - tai onhan uusissakin käskyissä nopeita. Eihän lopputulos sittenkään nopea ole mutta tästä elämästä kerkiää hautaan hitaamminkin - sillä eihän näillä rahaa tehdä vaan ajankuluahan nämä vain ovat. Ja saa samalla haukkua BASH:in opettajia.
---
Edellä esitetyn jako-skriptin epäilyttävin kohta on siinä tehtävässä suuruusluokan määrityksessä ( esitetyssä skriptissä se oli käskyrivi: apu=$((${#int2}-${#int1})) ).
Tosin toistaiseksi paranneltu jako-skripti toimii vain alle 18-numeroisille kokonaisluvuille ja vielä pienemmille desimaaliluvuille. Eihän tämä vielä moitteton ole mutta yritetään sentään:
Kehittämisen arvoisia näillä vanhoilla käskyillä toteutetut skriptit tosiaan ovat sillä skriptien rivimäärän kasvaessa suoritus-aika kasvaa hyvin hitaasti - voi tarvittaessa lisätä ehtoja ja looppeja melko suruttomasti - mutta vaatimus on ettei uusia käskyjä saa skriptissä olla yhtään - tai onhan uusissakin käskyissä nopeita. Eihän lopputulos sittenkään nopea ole mutta tästä elämästä kerkiää hautaan hitaamminkin - sillä eihän näillä rahaa tehdä vaan ajankuluahan nämä vain ovat. Ja saa samalla haukkua BASH:in opettajia.
---
Edellä esitetyn jako-skriptin epäilyttävin kohta on siinä tehtävässä suuruusluokan määrityksessä ( esitetyssä skriptissä se oli käskyrivi: apu=$((${#int2}-${#int1})) ).
Tosin toistaiseksi paranneltu jako-skripti toimii vain alle 18-numeroisille kokonaisluvuille ja vielä pienemmille desimaaliluvuille. Eihän tämä vielä moitteton ole mutta yritetään sentään:
Koodia: [Valitse]
function suuruusluokka () { # kuinka monta numeroa tuloksen kokonais-osassa tulee olemaan - tai etu-nollaa.
# set -x; trap "echo paina: return;read x" DEBUG # skriptin suoritus käsky kerrallaan
tulosta=: # yhdessä paikassa päätetään tulostetaanko välituloksia. Vaihtoehdot:tulosta=echo ja tulosta=:
[[ $1 = ${1/./} && $2 = ${2/./} ]] && { apu=$(($1/$2)); echo ${#apu}; return ;} # jos kummatkin ovat kokonaislukuja
[[ ${1//[^.]/} ]] && luku1=$1 || luku1=$1".0"; $tulosta luku1:$luku1
[[ ${2//[^.]/} ]] && luku2=$2 || luku2=$2".0"; $tulosta luku2:$luku2
merkki=''; koko1=${luku1%%.*}; koko2=${luku2%%.*}; desi1=${luku1##*.}; desi2=${luku2##*.}
(( $koko1 < $koko2 )) && { apu=$koko1; koko1=$koko2; koko2=$apu; apu=$desi1; desi1=$desi2; desi2=$apu; merkki=- ;}
#[[ $koko1 = $koko2 ]] && [[ $desi1 > $desi2 ]] && { apu=$koko1; koko1=$koko2; koko2=$apu; apu=$desi1; desi1=$desi2; desi2=$apu; merkki=- ;}
# desimaaliosien tulee olla yhtäpitkät. Lyhyemmän perään kirjoitetaan nollia sillä desimaaliosan lopussa ne eivät muuta arvoa.
(( ${#desi1} >= ${#desi2} )) && desipituus=${#desi1} || desipituus=${#desi2}
desi1=$desi1'00000000000000000000'
desi2=$desi2'00000000000000000000'
desi1=${desi1:0:$desipituus}; $tulosta desi1:$desi1
desi2=${desi2:0:$desipituus}; $tulosta desi2:$desi2
luku1=$koko1$desi1; luku1=${luku1:0:18}; $tulosta luku1:$luku1
luku2=$koko2$desi2; luku2=${luku2:0:18}; $tulosta luku2:$luku2
(( 10#$luku1 > 10#$luku2 )) && kokonaisia=$((10#$luku1/10#$luku2)) || kokonaisia=$((10#$luku2/10#$luku1)) ; echo $merkki${#kokonaisia} ;
}
suuruusluokka 19.99999999999999 2
suuruusluokka 20.0 2
suuruusluokka 77.9 0.00001
suuruusluokka 2 19.99999999999999
suuruusluokka 2 20.00000000000000
suuruusluokka 0.00001 77.9
