Ubuntun käyttö > Ohjelmointi, palvelimet ja muu edistyneempi käyttö

Skriptiajuri

(1/16) > >>

petteriIII:
Skriptiajuri on tarkoitettu skriptien tekemiseen ja tehdyistä huolehtimiseen. Skriptiajuri on silkkaa versionhallintaa: kaikki skripti-versiot, kaikki skriptien dokumentti-versiot ja skriptien kaikki tulosteet talletetaan ja ylläpidetään niistä ristiinviittauksia.

Skriptien nimillä ei ole muotovaatimuksia vaan kaikkea voi käyttää mitä näppäimistä irti saa - merkki / on kylläkin ongelmallinen sillä bash tajuaa sen tiedostonimeksi. Skriptejä ylläpidetään koti-kansion kansiossa nimeltään OMATSKRIPTIT.

Skriptiajuria on helpointa ajaa omalta kovalevyltä kun sille on ensin bootattu. Ajamiseen voi käyttää Skriptiajurille tehtyä käynnistintä joka on paras sijoittaa työpöydälle ja vielä parempi on ctrl-raahata se käynnistyspalkkiin. Skriptiajuria voi ajaa myös päätteessä käskyllä: . ~/OMATSKRIPTIT/Skriptiajuri. Skriptiajuria voi ajaa myös nautiluksella mistä hyvänsä. Yksi tapas on bootata live-CD:llä ja ajaa live-CD:n nautiluksella Skriptiajuria siitä koneesta johon on bootattu tai sitten USB-muistitikulta. Ja skriptiajurilla taas voi ajaa MidnightCommanderia jolloin on pääsy lähes kaikkialle mikä on liitetty siihen koneeseen jolta on bootattu.

Skriptiajurin paras ominaisuus on se ettei mitään tekemistään tarvitse harkita eikä mitään tarvitse muistaa, sillä pahin seuraus paniikki-kohelluksestakin on se että äskettäin tekemänsä joutuu tekemään osittain uudelleen. Sillä teetpä mitä hyvänsä: painat ctrl-c vahingossa tai tahallasi, boottaat, potkit konettasi ympäri kämppää ... niin aloitettaessa skriptiajuri uudelleen se aloittaa siitä paikasta joka viimeksi toimi. Kannattaa kuitenkin tallettaa työnsä vähänväliä ettei joutuisi kirjoittamaan pitkää litaniaa uudelleen.
- skriptaamisen merkittävin asia on puhua kaikista asioista niin pitkillä ja kuvaavilla nimillä että ne muistaa kuolemansa jälkeenkin. BASH itse puhuu arvoituksin mutta älä sinä puhu.
- nimissä kannattaa välttää erikoismerkkejä, ääkkösia ja välilyöntejä. Kuitenkin jos selvyys vaatii niin niitä täytyy käyttää mikäli BASH:in saa ne hyväksymään; vaikeuksia ei saa vältellä.
- tietysti skriptien tekeminen on nopeampaa jos muisti pelaa eikä koskaan kohella. Mutta jos ei muista edes perusasioita ja koheltaa vähänväliä tulee työskentelystä vain hirveän hidasta mutta eteneminen on kuitenkin varmaa.

Skriptiajurin backup:ista ei tarvitse huolehtia sillä skriptiajuri kirjoittaa välittömästi kaikki muutoksensa USB-muistitikulle jos muistitikulla on kansio OMATSKRIPTIT. Muistitikun OMATSKRIPTIT kansio voi olla tyhjäkin jolloin sille kirjoitetaan koko kansio OMATSKRIPTIT.
- ominaisuuden saa toimimaan myös SSH:n yli.
- backupin tekeminen kestää skriptiajurin kannalta 2ms.
- backup tehdään jokaiselle muistitikulle joka on liitetty johonkin USB-porttiin mikäli siinä on kansio OMATSKRIPTIT. USB-porteissa voi olla muistitikku tai ei ja niillä voi olla kansio OMATSKRIPTIT tai ei. Backup toimii kaikille käyttäjille, eikä backupin toiminta ei riipu muistitikun nimestä, uuid:stä tai mistään. Tiedostomuodosta ei välitetä kunhan koneessta löytyy ajurit.
- niin pientä muistitikkua ei olekaan ettei se riittäisi, eikä sillä ole väliä minkätyypin USB se on. Siis on mahdollista käyttää monimutkaistakin backup-menetelmää usealle muistitikulle.
- muistitikulla olevasta OMATSKRIPTIT-kansiosta ei koskaan poisteta mitään vaan ainoastaan lisätään. Tällätavoin menetellen siellä on enemmän myös roskaa, mutta toisaalta sellaista vikaa ei voi tulla että jotain katoaa edes melkoisen hölmöilyn seurauksena. Muistitikulla olevan  OMATSKRIPTIT-kansion koon kasvaminen ei aiheuta ongelmia.

Skriptejä tehtäessä ei riitä, että skriptien tekeminen on helppoa ja siihen kelpaakin moni viritelmä. Mutta ongelma ei olekaan skriptien teko sinänsä, vaan se että jokainen ongelma voidaan ratkaista ziljoonalla erilaisella tavalla ja jokaisella on omat vahvuutensa ja heikkoutensa - ja tilanteeseen sopivan menetelmän valintaan tarvitaan opastusta. Tarkoitan että melkein kaikki skriptit ovat väkisin tehtyja ja huomattavasti liian isoja ja hitaita, sillä BASH:in logiikka ei sovi normaalilla tavoilla ajatteleville.   

Skriptiajuri on tehty BASH:illa sen osoittamiseksi että BASH ei ole rajoittunut pieniin skripteihin. Jo kauan on kaiken voinut tehdä käytettävyyden kannalta mielekkäimmällä tavalla sillä skriptiajurin toiminta-nopeus on usein jo turhankin suuri.

Monet järjestelmät kehuvat, että niiden koodi on editoitavissa niillä itsellään, mutta käytännössä niitä ei voi editoida millään tavalla. Sensijaan kehitettäessä skriptiajuriin uusia ominaisuuksia sitä editoidaan poikkeuksetta itsellään.

Skriptit ovat ohjelmia parempia ennenkaikkea järjestelmän hoitamisessa sillä ne ovat lyhyitä ja niissä BASH toimii vain mitättömän ajan sillä pääosa aikaa kuluu ulkoisissa ohjelmissa. Mutta skriptausta kannattaa käyttää myös silloin kun tulevasta ohjelmasta täytyy nopeasti saada mielikuva. Syy skriptien käyttämiseen on se, että skriptit kykenevät kaikkeen samaan kuin expertitkin ja ne toimivat nopeammin ja virheettömämmin. Mutta yksi skripti kykenee vain erittäin rajoitettuun toimintaan joten skriptejä tulee olla tuhansia jo vaatimattomassakin tehtävässä. Mutta suuresta skriptijoukosta valinta on hidasta, ja valinta jo tuhannesta skriptistä on tavanomaisin keinoin hankalaa mutta skriptiajurille tuommoiset mitättömät määrät eivät tunnu mitenkään.

Skriptiajuri hallitseekin skriptejään tiedostopuussa, jossa nimien pituutta tai merkkivalikoimaa ei ole rajoitettu: mikä hyvänsä merkki kelpaa lukuunottamatta merkkiä: /
 
Skriptiajuri pitää kokoajan kirjaa siitä missä se on, joten voi rauhassa painaa ctrl-c tai peräti bootata kun tehtävä skripti villiintyy tai muuttuu hiljaiseksi.

vaikka yleensä onkin yhdentekevää millaisessa koneessa skripti toimii niin usein olisi mukavaa saada se helposti selville - ja joillain harvoilla skripteillä se on "pakko". Skriptiajuri hoitaa  ottaa aina selville koneen piirteitä mutta tulostaa ne sellaiseen paikkaan joka normaalisti on näkymättömissä. Nämä koneesta kertovat viestit saat esiin kun heti skriptiajuri alkaessa toimimaan pyörittää hiiren rullaa. Näyttö palaa normaaliksi heti kun teet jotakin muuta, esimerkiksi painat nuoli-näppäintä.
- skriptiajurin näyttöä voi aina selailla oltaessa pääte-tilassa. Siellä on muunmuassa kaikki ne viestit mitä skriptisi on tehnyt: enää ei tarvitse pähkäillä että mikä viesti siellä näytössä vilahti vaan voi mennä katsomaan. Näitä viestejä voi olla kymmeniä sivuja.
 
- kaiki mitä on joskus tehty löytyy arkistosta. Editoitaessa koodeja tai dokumentteja haetaan arkistosta editoriin myös muutamia viimeisimmistä versioista ja editoitaessa koodeja haetaan editoriin myös käytetyt kirjastot.
- editoitava tiedosto tarkistetaan mentäessä ajamaan skriptiä tai editoimaan skriptiä ja mikäli koodaus-virheitä löytyy mennään editointiin ja viedään lista käännösvirheestä omalle sivulle.
- vastaus jokaiseen skriptiajurin kysymykseen talletetaan historiatietoihin. Jokaiselle kysymykselle on oma historia joten tarvittava löytyy nopeasti. Historiatietoja voi selata nuolinäppäimillä niinkuin normaalistikin tai käyttää etsintää.
- hakuja on monia erilaisia; ja nimenomaan sellaisia hakuja jotka pystyvät löytämään skripteissä olevaa kapulakieltä - internetin hakukoneet eivät muuten pysty.
- kaikki ohjelmointi perustuu kopiointiin vaikkakaan sitä ei tajuta koska kirjastot ovat kopiointi-automaatteja.
- muutokset skriptiajuriin tai sen kirjastoihin tehdään yleensä skriptiajurissa itsessään. Ulkoisia ohjelmilla voi lisätä skriptiajuriin mitä vaan mutta poistamisessa on paljon ehtoja.
- mitään ei koskaan tuhota ellei erikseen pyydetä tuhoamaan. Jokainen tehty versio talletetaan arkistoon omalla numerollaan. Numero on kasvava. Editoitaessa esitetään muutama viimeinen versio.
- arkistoon voi myös mennä kokeilemaan mikä siellä olevista versioista toimii ajettuna parhaiten ja kopioida sen koodi tehtävän skriptin paikalle.
- myös näppäin-versiossa hiirellä on suuri merkitys: sillä valitaan editorissa näytettävä lehti ja hiiren rullalla saa esimerkiksi selattua päätettä; esimerkiksi aloitusviestit saa sillä näkyviin.

 


 

petteriIII:
/home/käyttäjänimi/OMATSKRIPTIT/FUNKTIOKIRJASTO/valikkohiirelle


--- Koodia: ---#!/bin/bash   
# Valikkohiirelle (rullahiirelle)  petteriIII 2.4.2013
# Selostus tunnetuista funktioista ja niiden parametreista:
# 1. ValitseValittavistaYksi: [otsikko [avaimet [ValitunNumero]]] . Erittely:
# otsikko=vapaata tekstiä koko toinen rivi näytöllä. Jos se on annettu sitä käytetään mutta jos ei ole niin otsikko muodostetaan automaattisesti. otsikko:sta otetaan CRC-32 muuttujaan crc ja se yksilöikin kutsujan hyvin. Ulkopuolinen ohjelma saattaa käyttää sitä.
# avaimet= merkit 38-157 rivillä 1. Valikkohiirelle ohjelmassa ne eivät ole varsinaisia avaimia, vaan lisä-otsikko
# ValitunNumero= valittuna olevan järjestysnumero.

# 2. ohjeet: kaikki ~/OMATSKRIPTIT/OHJEITA/"Skriptiajuri, hiiriversio tai: Skriptiajuri, näppäinversio" ohje-kansion tiedostot viedään editoriin. Tiedostoja voi lisätä tai poistaa ja Skriptiajuri ottaa muutoksen automaattisesti huomioon.
# ohjeista ei voi esittää akrkistokappaleita editorissa. Arkistokappaleet kuitenkin tehdään paikkaan: ~/OMATSKRIPTIT/OHJEITA/ARKISTO/SKRIPTIT/tiedoston nimi/monotonisesti kasvava arkistonumero

# 3. etsiä_missä_skripti_on_kun_muistaa_sen_nimestä_jotakin                 
# 4. etsiä_kysyttävää_ilmaisua_skriptien_tekstistä
# 5. etsiä_esimerkkirivejä_kuinka_jotakin_käskyä_käytetään
# 6. ajaa_valitun_skriptin

echo -e "funktiot paikasta:"${0%/OMATSKRIPTIT*}"/OMATSKRIPTIT/FUNKTIOKIRJASTO/valikkohiirelle  liitetään koodiin"

function ValitseValittavistaYksi () {
function AsetaPaate { 
RivienLuku=$(($(tput lines)-6)) # näytön riviluku. 6 on otsikon+yläpalkin viemä tila
RivinPituus=$(tput cols)        # näyttörivin merkkiluku.
echo -e 'Näyttö-funktio kirjastoa kutsuva ohjelma: ' $(basename "$0")'\nnäytön riviluku:'$RivienLuku'   rivinpituus:'$RivinPituus
# gconftool ja gnome-terminal ovat gnomessa, mate:ssa on mateconftool-2 ja mate-terminal. Seuraava on testi onko mate vai joku muu
[[ $(cat /var/lib/dpkg/status  | grep \ mate-terminal) ]] && (
apu=$(mateconftool-2 -g /apps/mate-terminal/profiles/Default/default_size_columns)
mateconftool-2 -s /apps/mate-terminal/profiles/Default/use_custom_default_size --type bool true
mateconftool-2 -s /apps/mate-terminal/profiles/Default/default_size_columns --type integer 240
mateconftool-2 -s /apps/mate-terminal/profiles/Default/default_size_rows --type integer 60     
mateconftool-2 -s /apps/mate-terminal/profiles/Default/scrollback_unlimited --type bool true # rajoittamaton vieritys 
mateconftool-2 -s /apps/gedit-2/preferences/editor/line_numbers/display_line_numbers --type bool true
[[ $apu = 240 ]] || (echo 'avaa uusi pääte ja käynnistä siinä uudelleen'; sleep 3; killall mate-terminal)
)

[[ $(cat /var/lib/dpkg/status  | grep \ gnome-terminal) ]] && (
apu=$(gconftool -g /apps/gnome-terminal/profiles/Default/default_size_columns)
gconftool -s /apps/gnome-terminal/profiles/Default/use_custom_default_size --type bool true
gconftool -s /apps/gnome-terminal/profiles/Default/default_size_columns --type integer 240 # Näyttörivin maximi pituus
gconftool -s /apps/gnome-terminal/profiles/Default/default_size_rows --type integer 60     # Näyttörivien maximi määrä
gconftool -s /apps/gnome-terminal/profiles/Default/scrollback_unlimited --type bool true
gconftool -s /apps/gedit-2/preferences/editor/line_numbers/display_line_numbers --type bool true
[[ "$apu" = 240 ]] || (echo 'avaa uusi pääte ja käynnistä siinä uudelleen'; sleep 3; killall gnome-terminal)
)
valintalukko=1 # negatiivinen logiikka, valinta on nyt mahdollista suorittaa
# avaimet=''     # ohjelma perisi muuten avaimet edelliseltä ohjelmalta
raja=112\101\116\116\101\114\105\73\73\73
}

function MuutaValittuPunaiseksi {
tput cup 2 $(($RivinPituus-95))
tput sgr0; echo "näpäytä_tästä_käyttöohjeet erikoistoimet  dokumentoi koodaa"
tput cup 0 $(($RivinPituus-45)) #; tput el tyhjää loppurivi
apu=$kanta/"$KansionNimi"/'ARKISTO/SKRIPTIT/'"${Valittavat[ValitunNumero-1]}" # dokumenttien määrää ei pitäisikään näyttää
[[ $ValitunNumero>1 ]] && Tiedostonaika="" && [[ -a $kanta/"$KansionNimi"/"${Valittavat[ValitunNumero-1]}" ]] && Tiedostonaika=$(stat --printf %y $kanta/"$KansionNimi"/"${Valittavat[ValitunNumero-1]}"  | awk '{ print $1" "$2"  "}' | tr -d '\n')           
[[ -f $kanta/"$KansionNimi"/"${Valittavat[ValitunNumero-1]}" ]] && echo -n ${Tiedostonaika:0:16} && [[ -d $apu ]] && echo -n " Koodeja:"$(ls "$apu" | sort -g | tail -n 1) && tput el
[[ -d $kanta/"$KansionNimi"/"${Valittavat[ValitunNumero-1]}" ]] && echo "kansiossa tiedostoja:"$(ls $kanta/"$KansionNimi"/"${Valittavat[ValitunNumero-1]}" | wc -l)"          " 
[[ ${Valittavat[ValitunNumero-1]} = .edellinen_kansio. ]] && tput el
Xkoordinaatti=$(((ValitunNumero - 1 - $(((ValitunNumero - 1) / RivienLuku))) / RivienLuku)); Ykoordinaatti=$((ValitunNumero - $((RivienLuku * Xkoordinaatti -1))+3));tput cup $((Ykoordinaatti - Xkoordinaatti - 2)) $((Xkoordinaatti * SarakkeenPituus));  tput setf 4; echo "${Valittavat[ValitunNumero-1])}"
}

function MuutaKaikkiValintarivitVihreiksi {
tput cup 3 0 ; tput setf 3
cat /home/petteri/OMATSKRIPTIT/ARKISTO/APUTIEDOSTOT/näyttö
}

function TulostaValittavat {
clear
rm /home/petteri/OMATSKRIPTIT/ARKISTO/APUTIEDOSTOT/näyttö
tput sgr0
echo -e 'Skriptiajurin hiiriversio\n'$otsikko'\n'                     
ValittavienLuku=${#Valittavat[@]}
SarakkeidenLuku=$(($((ValittavienLuku-3))/RivienLuku+1))  # oli:SarakkeidenLuku=$(($((ValittavienLuku-2))/RivienLuku+1))
SarakkeenPituus=$((RivinPituus/SarakkeidenLuku))
tput setf 3
for (( Rivi=0; Rivi<=RivienLuku; Rivi++ )) # -1 ei vissiin onnistunut
do
  for (( Sarake=0; Sarake<=SarakkeidenLuku-1; Sarake++ ))   
  do
    naytettava=${Valittavat[Sarake*RivienLuku+Sarake+Rivi]}"                                                                                                  "
    nayttoRivi="$nayttoRivi"${naytettava:0:$SarakkeenPituus}  # mitä sarakkeita näyttörivillä ennestään onkin ja uusi sarake lisää
  done
  echo "${nayttoRivi}"; echo -e "${nayttoRivi}" >> /home/petteri/OMATSKRIPTIT/ARKISTO/APUTIEDOSTOT/näyttö; naytto[$Rivi]=${nayttoRivi:0:$RivinPituus}; nayttoRivi='' 
done 
}

function MuutaValittuNuolinappaimilla {
MuutaValittuPunaiseksi
 echo -en "\e[?1000h"; read -n6 -s -t0.02 key ; echo -en "\e[?1001h"
stty -echo
[[ ${key:3:1} = "a" ]] && MuutaValittua -1  # rullaus ylös
[[ ${key:3:1} = "\`" ]] && MuutaValittua 1  # rullaus alas
if [[ ${key:3:1} = "#" ]]; then valintatehty=1; x=$(LC_CTYPE=C printf '%d' "'${key:4:1}"); y=$(LC_CTYPE=C printf '%d' "'${key:5:1}")
  [[ $y = 33 ]] && [[ $x < 40 ]] && Tapahtuma=palaa && valintatehty=1 && return
  [[ $y = 33 ]] && [[ $x < 70 ]] && Tapahtuma=uusi && valintatehty=1 && return
  [[ $y = 35 ]] && [[ $x > $(($RivinPituus-10)) ]] && Tapahtuma=koodaa && valintatehty=1 && return
  [[ $y = 35 ]] && [[ $x > $(($RivinPituus-18)) ]] && Tapahtuma=dokumentoi && valintatehty=1 && return
  [[ $y = 35 ]] && [[ $x > $(($RivinPituus-36)) ]] && Tapahtuma=erikoistoimet && valintatehty=1 && return
  [[ $y = 35 ]] && [[ $x > $(($RivinPituus-57)) ]] && Tapahtuma=käyttöohjeet && valintatehty=1 && return
  [[ $y > 35 ]] && MuutaKaikkiValintarivitVihreiksi && ValitunNumero=$((y-34+(((RivienLuku+1)*((x-34)/SarakkeenPituus)))-1)) && MuutaValittuPunaiseksi && return
valintatehty=0
fi                                                         
}

function MuutaValittua () {
MuutaKaikkiValintarivitVihreiksi
ValitunNumero=$(($ValitunNumero+$1))
[[ $ValitunNumero -lt 1 ]] && TulostaValittavat && ValitunNumero=1 # TulostaValittavat lisätty
[[ $ValitunNumero -gt $ValittavienLuku ]] && ValitunNumero=$ValittavienLuku # apu->ValittavienLuku; -2 lisätty poistettu
}
 
# function ValitseValittavistaYksi () {
[[ $3 ]] && ValitunNumero=$3
[[ ${#Valittavat} == 0 ]] && echo 'ei ole valittavaa' && sleep 2 && valintatehty=1 && break
AsetaPaate
local otsikko key valintatehty=0 Xkoordinaatti Ykoordinaatti   
[[ ! $ValitunNumero || $ValitunNumero -lt 1 || $ValitunNumero -gt ${#Valittavat[@]} ]] && ValitunNumero=1
setterm -cursor off 
otsikko="$1"; [[ ! "$otsikko" ]] && otsikko='Ohjelma: '$0' pyytää valitsemaan näistä'
crc=$(echo $otsikko | cksum | awk {'print $1'}) # cksum=32bittinen crc, sha1sum ->160bittinen ...
TulostaValittavat
valintatehty=0
Tapahtuma=""
while [ $valintatehty -lt 1 ] ; do MuutaValittuNuolinappaimilla;  done
clear; tput sgr0; stty echo # setterm -reset # värit normaaleiksi # clear lisätty
ValitunTeksti=${Valittavat[ValitunNumero-1]}
[[ ! ${ValitunArvo[ValitunNumero-1]} ]] && ValitunArvo='ei määritelty' || ValitunArvo=${ValitunArvo[ValitunNumero-1]}
}

# loput funktiot ovat Skriptiajuri:n hiiriversiota varten eivätkä sotke mitään. Näppäinversiossa paremmat funktiot?
function etsiä_missä_skripti_on_kun_muistaa_sen_nimestä_jotakin () {
avaimet='palaa Skriptiajuri:en        uusi hakutermi'
while true
do
  clear; cat $kanta/OMATSKRIPTIT/ARKISTO/APUTIEDOSTOT/grepin_määreet; echo; echo
  lue_näppäimistöltä hakusana "mitä ilmausta etsit kansioiden tai skriptien nimistä (teksti voi olla keskelläkin sanaa)?"
  eval Valittavat=(" "$(find /home/petteri/OMATSKRIPTIT |  grep "$hakusana" | grep -v /ARKISTO/ | grep -v *sgml | sed 's/^ */"/g;s/ *$/"/g'))
  ValitunNumero=$(cat $kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/haku2)
  ValitseValittavistaYksi "ilmaus löytyi näiden skriptien nimistä: tutki valittu painamalla enter sen kohdalla" "$avaimet"
  [[ $Tapahtuma = "palaa" ]] && break
  [[ $Tapahtuma = "uusi" ]] ||  echo 'editoin tiedostoa: '/home/petteri/OMATSKRIPTIT/palautuspiste "$ValitunTeksti" && gedit "$ValitunTeksti" && break
done
echo $ValitunNumero > $kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/haku2
}

function etsiä_kysyttävää_ilmaisua_skriptien_tekstistä {
kansio_josta_ei_haeta='\/ARKISTO\/'
clear; cat $kanta/OMATSKRIPTIT/ARKISTO/APUTIEDOSTOT/grepin_määreet; echo; echo ; echo
lue_näppäimistöltä hakusana "mitä ilmausta etsit kaikista omista skripteistä ?"
optiot="-lr" 
apu=${hakusana%% *}
[[ ${hakusana:0:1} = "-" ]] && optiot="-lr"${apu:1} && hakusana=${hakusana#* }
[[ $(echo $hakusana | grep ^man) ]] && $hakusana > ${hakusana:4} && gedit ${hakusana:4} haku=CTRL-f && rm ${hakusana:4} && return
eval Valittavat=($(grep $optiot "$hakusana" $kanta/OMATSKRIPTIT | grep -v $kansio_josta_ei_haeta | grep -v kopio | sed 's/\/home\/petteri\/OMATSKRIPTIT\///g' | sed 's/^ */"/g;s/ *$/"/g'  ))
[[ -f $kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/haku2 ]] && ValitunNumero=$(cat $kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/haku2)
while true
do
  avaimet='palaa Skriptiajuri:een  uusi hakutermi' # end=palaa Skriptiajuri:en   f2=anna uusi hakutermi
  ValitseValittavistaYksi "ilmaus löytyi näistä skripteistä: valitse editoitava valitsemalla se ja painamalla enter" "$avaimet" 
  [[ $Tapahtuma = "palaa" ]] && break
  [[ $Tapahtuma = "uusi" ]] && etsiä_kysyttävää_ilmaisua_skriptien_tekstistä
  gedit /home/$(whoami)/OMATSKRIPTIT/"$ValitunTeksti"
done
echo $ValitunNumero > $kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/haku2
}

function etsiä_esimerkkirivejä_kuinka_jotakin_käskyä_käytetään { # lisätty
clear; cat $kanta/OMATSKRIPTIT/ARKISTO/APUTIEDOSTOT/grepin_määreet; echo; echo
lue_näppäimistöltä hakusana "millaisia esimerkkirivejä etsit kaikista omista skripteistä ?"
find ~/OMATSKRIPTIT ! -path '*ARKISTO*' ! -path *sgml -type f  -exec grep "$hakusana" {} \;
read -p 'hiirellä voi vieritää näyttöä. paina enter jatkaakseesi'
}

function ohjeet { # home. kaikkia ohjekansion tiedostoja tarjotaan editoitaviksi. Tiedostoja voi lisätä tai poistaa ja Skriptiajuri ottaa muutoksen automaattisesti huomioon.
# paikassa: $kanta/OMATSKRIPTIT/OHJEITA/ARKISTO/SKRIPTIT/"Skriptiajuri, hiiriversio"/<tiedoston nimi>/<monotonisesti kasvava arkistonumero> on kopio kaikista muuttuneista tiedostoista
gedit & # tämä käsky aiheuttaa sen että pääohjelma ei pysähdy tuleviin gedit-käskyihin vaan jatkaa taustalla ilman näppäimiä ja fyysistä näyttöä
täytä_valittavat $kanta/OMATSKRIPTIT/OHJEITA/"Skriptiajuri, hiiriversio"
for (( n=2; n<=${#Valittavat[@]}-1; n++ )); do 
TiedostonAikaleimaAlussa[$n]=$(stat --printf %y $kanta/OMATSKRIPTIT/OHJEITA/"Skriptiajuri, hiiriversio"/"${Valittavat[$n]}" | awk '{ print $2 }')
gedit $kanta/OMATSKRIPTIT/OHJEITA/"Skriptiajuri, hiiriversio"/"${Valittavat[$n]}"
done
reset; read -p 'paina enter'
# sen varalta että joku ohje on muuttunut lisätään sen kopio arkistoon. Samalla poistuvat nollatut:
täytä_valittavat $kanta/OMATSKRIPTIT/OHJEITA/"Skriptiajuri, hiiriversio"
for (( n=2; n<=${#Valittavat[@]}-1; n++ )); do
  [[ ! -d $kanta/OMATSKRIPTIT/OHJEITA/ARKISTO/SKRIPTIT/"Skriptiajuri, hiiriversio"/"${Valittavat[$n]}" ]] && mkdir -p $kanta/OMATSKRIPTIT/OHJEITA/ARKISTO/SKRIPTIT/"Skriptiajuri, hiiriversio"/"${Valittavat[$n]}" && touch $kanta/OMATSKRIPTIT/OHJEITA/ARKISTO/SKRIPTIT/"Skriptiajuri, hiiriversio"/"${Valittavat[$n]}"/0
  [[ ${TiedostonAikaleimaAlussa[$n]} = $(stat --printf %y $kanta/OMATSKRIPTIT/OHJEITA/"Skriptiajuri, hiiriversio"/"${Valittavat[$n]}" | awk '{ print $2 }' ) ]] && continue
  Suurin_numero_ohjeissa=$(ls $kanta/OMATSKRIPTIT/OHJEITA/ARKISTO/SKRIPTIT/"Skriptiajuri, hiiriversio"/"${Valittavat[$n]}" | sort -g | tail -n 1)
  cp $kanta/OMATSKRIPTIT/OHJEITA/"Skriptiajuri, hiiriversio"/"${Valittavat[$n]}"  $kanta/OMATSKRIPTIT/OHJEITA/ARKISTO/SKRIPTIT/"Skriptiajuri, hiiriversio"/"${Valittavat[$n]}"/$(($Suurin_numero_ohjeissa+1))
done
}

function ajaa_valitun_skriptin {
[[ $ValitunTeksti = '.edellinen_kansio.' ]] && KansionNimi=$(dirname "$KansionNimi") && echo "$KansionNimi">$kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/KansionNimiAloituksessa && HaeSenRinvinNumeroJollaViimeksiTyöskenneltiinTässäKansiossa "$KansionNimi" && return
[[ -d $kanta/"$KansionNimi"/"$ValitunTeksti" ]] && KansionNimi="$KansionNimi"/"$ValitunTeksti" && return
[[ $(echo "$ValitunTeksti" | grep -e '.PDF' -e '.pdf') ]] && evince $kanta/"$KansionNimi"/"$ValitunTeksti" && return # html:lle myös
[[ $(echo "$ValitunTeksti" | grep -e '\.doc' -e .html -e .odt -e .sgml -e .xml) ]] && /usr/bin/libreoffice $kanta/"$KansionNimi"/"$ValitunTeksti" && return
[[ ! -d $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti" ]] && mkdir -p $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti" #?
bash -n $kanta/"$KansionNimi"/"$ValitunTeksti" &>$kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"/virhe
[[ ! -f $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"/virhe ]] && echo "" > $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"/virhe
[[ $(cat -b $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"/virhe) > 0 ]] && echo 'tulkkauskelvoton, mennään koodaamaan' && sleep 0.2 && koodaa && return
[[ $(cat $kanta/"$KansionNimi"/"$ValitunTeksti" | grep \$1) ]] && LueParametrit # jos skriptissä on viittauksia parametreihin käydään lukemassa niitä
clear && echo -e 'suoritan skriptin: '$kanta/"$KansionNimi"/$ValitunTeksti'\n' && bash $kanta/"$KansionNimi"/"$ValitunTeksti" $Parametrit && read -p 'jatkaakseesi paina enter' || ( reset; echo "skriptisi päätyi virheeseen virhe-statuksella: "$? ; read -p "jatkaakseesi paina enter"; /home/petteri/OMATSKRIPTIT/"Skriptiajuri, hiiriversio" )
}

--- Koodi päättyy ---

petteriIII:
~/OMATSKRIPTIT/FUNKTIOKIRJASTO/valikkonäppäimille


--- Koodia: ---#!/usr/bin/env bash   
# valikkonäppäimille  petteriIII 2.4.2013
# Selostus tunnetuista funktioista ja niiden parametreista:
# 1. ValitseValittavistaYksi: [otsikko [avaimet [ValitunNumero]]] . Erittely:
# otsikko=vapaata tekstiä koko toinen rivi näytöllä. Jos se on annettu sitä käytetään mutta jos ei ole niin otsikko muodostetaan automaattisesti. otsikko:sta otetaan CRC-32 muuttujaan crc ja se yksilöikin kutsujan hyvin. Ulkopuolinen ohjelma saattaa käyttää sitä.
# avaimet= merkit 38-157 rivillä 1. Tämä on tekstiä jossa esiintyy mahdollisten avaimien nimet (f1-f4, home, end, insert ja delete). Kannatta selventää kirjoittamalla mitä mikin tekee: f2=<mitä se tekee> insert=<mitä se tekee> ...   avaimet joiden nimeä ei ole mainittu eivät toimi
# ValitunNumero= valittuna olevan järjestysnumero.

# 2. ohjeet: kaikki ~/OMATSKRIPTIT/OHJEITA/"Skriptiajuri, hiiriversio tai: Skriptiajuri, näppäinversio" ohje-kansion tiedostot viedään editoriin. Tiedostoja voi lisätä tai poistaa ja Skriptiajuri ottaa muutoksen automaattisesti huomioon. Tyhjäämällä ohjesivun se tuhotaan kun editorista poistutaan.
# ohjeista ei voi esittää arkistokappaleita editorissa. Arkistokappaleet kuitenkin tehdään paikkaan: ~/OMATSKRIPTIT/OHJEITA/ARKISTO/SKRIPTIT/tiedoston nimi/monotonisesti kasvava arkistonumero

# 3. etsiä_missä_skripti_on_kun_muistaa_sen_nimestä_jotakin                 
# 4. etsiä_kysyttävää_ilmaisua_skriptien_tekstistä
# 5. etsiä_esimerkkirivejä_kuinka_jotakin_käskyä_käytetään
# 6. ajaa_valitun_skriptin
 

function ValitseValittavistaYksi () {                   
function AsetaPaate () {  # yritetään tehdä päätteen ja geditin asetukset
RivienLuku=$(($(tput lines)-6)) # näytön riviluku. 6 on otsikon+yläpalkin viemä tila
RivinPituus=$(tput cols)        # näyttörivin merkkiluku.
echo -e 'Näyttö-funktio kirjastoa kutsuva ohjelma: ' $(basename "$0")'\nnäytön riviluku:'$RivienLuku'   rivinpituus:'$RivinPituus
# gconftool ja gnome-terminal ovat gnomessa, mate:ssa on mateconftool-2 ja mate-terminal.
[[ $(cat /var/lib/dpkg/status  | grep \ mate-terminal) ]] && (
apu=$(mateconftool-2 -g /apps/mate-terminal/profiles/Default/default_size_columns)
mateconftool-2 -s /apps/mate-terminal/profiles/Default/use_custom_default_size --type bool true
mateconftool-2 -s /apps/mate-terminal/profiles/Default/default_size_columns --type integer 240
mateconftool-2 -s /apps/mate-terminal/profiles/Default/default_size_rows --type integer 60     
mateconftool-2 -s /apps/mate-terminal/profiles/Default/scrollback_unlimited --type bool true # rajoittamaton vieritys 
mateconftool-2 -s /apps/gedit-2/preferences/editor/line_numbers/display_line_numbers --type bool true
[[ $apu = 240 ]] || (echo 'avaa uusi pääte ja käynnistä siinä uudelleen'; sleep 3; killall mate-terminal)
)

[[ $(cat /var/lib/dpkg/status  | grep \ gnome-terminal) ]] && (
apu=$(gconftool -g /apps/gnome-terminal/profiles/Default/default_size_columns)
gconftool -s /apps/gnome-terminal/profiles/Default/use_custom_default_size --type bool true
gconftool -s /apps/gnome-terminal/profiles/Default/default_size_columns --type integer 240 # Näyttörivin maximi pituus
gconftool -s /apps/gnome-terminal/profiles/Default/default_size_rows --type integer 60     # Näyttörivien maximi määrä
gconftool -s /apps/gnome-terminal/profiles/Default/scrollback_unlimited --type bool true
gconftool -s /apps/gedit-2/preferences/editor/line_numbers/display_line_numbers --type bool true
[[ "$apu" = 240 ]] || (echo 'avaa uusi pääte ja käynnistä siinä uudelleen'; sleep 3; killall gnome-terminal)
)
valintalukko=1 # negatiivinen logiikka, valinta on nyt mahdollista suorittaa
raja=112\101\116\116\101\114\105\73\73\73
}

function MuutaValittuPunaiseksi () {
tput sgr0 # värit normaaleiksi
tput cup 0 $(($RivinPituus-42)); tput el # kursorin asettaminen ja loppurivin tyhjääminen
apu=$kanta/"$KansionNimi"/'ARKISTO/SKRIPTIT/'"${Valittavat[ValitunNumero-1]}" # dokumenttien määrää ei pitäisikään näyttää
[[ -f $kanta/"$KansionNimi"/"${Valittavat[ValitunNumero-1]}" ]] && Tiedostonaika=$(stat --printf %y $kanta/"$KansionNimi"/"${Valittavat[ValitunNumero-1]}"  | awk '{ print $1" "$2"  "}' | tr -d '\n') && echo -n ${Tiedostonaika:0:16} && [[ -d $apu ]] && echo -n " Koodi:"$(ls "$apu" | sort -g | tail -n 1)" " 
[[ -d $kanta/"$KansionNimi"/"${Valittavat[ValitunNumero-1]}" ]] && echo "kansiossa tiedostoja:"$(ls $kanta/"$KansionNimi"/"${Valittavat[ValitunNumero-1]}" | wc -l) 
Xkoordinaatti=$(((ValitunNumero - 1 - $(((ValitunNumero - 1) / RivienLuku))) / RivienLuku)); Ykoordinaatti=$((ValitunNumero - $((RivienLuku * Xkoordinaatti -1))+3));tput cup $((Ykoordinaatti - Xkoordinaatti - 2)) $((Xkoordinaatti * SarakkeenPituus));  tput setf 4; echo "${Valittavat[ValitunNumero-1])}"
}

function MuutaKaikkiValintarivitVihreiksi () {
tput cup 3 0 ; tput setf 3
cat $kanta/OMATSKRIPTIT/ARKISTO/APUTIEDOSTOT/näyttö
}

function TulostaOtsikot () {
clear
tput sgr0
[[ $valintalukko = 1 ]] && echo -n 'enter=valitse tämä   ' || echo -n 'paina nuoliylös-alas  '
echo -e "$avaimet"'\n'$otsikko'\n' 
}

function TulostaValittavat () {
TulostaOtsikot
rm $kanta/OMATSKRIPTIT/ARKISTO/APUTIEDOSTOT/näyttö                     
# ValittavienLuku=${#Valittavat[@]}
SarakkeidenLuku=$(($((ValittavienLuku-3))/RivienLuku+1))  # oli: SarakkeidenLuku=$(($((ValittavienLuku-2))/RivienLuku+1))
SarakkeenPituus=$((RivinPituus/SarakkeidenLuku))
tput setf 3
for (( Rivi=0; Rivi<=RivienLuku; Rivi++ ))
do
  for (( Sarake=0; Sarake<=SarakkeidenLuku-1; Sarake++ ))   
  do
    naytettava=${Valittavat[Sarake*RivienLuku+Sarake+Rivi]}"                                                                                                  "
    nayttoRivi="$nayttoRivi"${naytettava:0:$SarakkeenPituus}  # mitä sarakkeita näyttörivillä ennestään onkin ja uusi sarake lisää
  done
  echo "${nayttoRivi}"; echo -e "${nayttoRivi}" >> $kanta/OMATSKRIPTIT/ARKISTO/APUTIEDOSTOT/näyttö; nayttoRivi='' 
done 
}

function MuutaValittuNuolinappaimilla () {
MuutaValittuPunaiseksi
read -sn 1 key
stty -echo
[[ -z $key ]] && Tapahtuma='enter' && valintatehty=$valintalukko && valintalukko=0 && return  # enter
set +e
[[ ! ${key#*[PQRSHF23]} ]] && Tapahtuma=${avain[$key]} && valintatehty=${valintasallittu[$key]} # f1,f2,f3,f4,home,end,insert tai delete
[[ ! ${key#*[ABCD]} ]] && MuutaKaikkiValintarivitVihreiksi && tput cup 0,0 && echo -n 'enter=valitse tämä   ' && valintalukko=1 && ${avain[$key]} # nuolinäppäimet
read -sn1 -t .001 key # tuntuu auttavan
set -e
}

function MuutaValittua () {
ValitunNumero=$(($ValitunNumero+$1))
[[ $ValitunNumero -lt 1 ]] && ValitunNumero=1
apu=${#Valittavat[*]}
[[ $ValitunNumero -gt $apu ]] && ValitunNumero=$apu
}
 
# function ValitseValittavistaYksi () {
ValittavienLuku=${#Valittavat[@]}; [[ $ValittavienLuku = 0 ]] && echo "ei valittavia" && Tapahtuma="end" && sleep 2 && return
AsetaPaate
[[ $3 ]] && ValitunNumero=$3 # valintalukko=1 # mikäli on annettu kolme parametria niin entereitä voi kerätä varastoon
avaimet=$2
declare -A valintasallittu avain
avain['A']='MuutaValittua -1' 
avain['B']='MuutaValittua 1'
avain['C']='MuutaValittua '$((RivienLuku+1))
avain['D']='MuutaValittua -'$((RivienLuku+1))
[[ ! $(echo $avaimet | grep f1) ]] && valintasallittu['P']=0 || valintasallittu['P']=1 && avain['P']='f1'
[[ ! $(echo $avaimet | grep f2) ]] && valintasallittu['Q']=0 || valintasallittu['Q']=1 && avain['Q']='f2'
[[ ! $(echo $avaimet | grep f3) ]] && valintasallittu['R']=0 || valintasallittu['R']=1 && avain['R']='f3'
[[ ! $(echo $avaimet | grep f4) ]] && valintasallittu['S']=0 || valintasallittu['S']=1 && avain['S']='f4'
[[ ! $(echo $avaimet | grep home) ]] && valintasallittu['H']=0 || valintasallittu['H']=1 && avain['H']='home'
[[ ! $(echo $avaimet | grep end) ]] && valintasallittu['F']=0 || valintasallittu['F']=1  && avain['F']='end'
[[ ! $(echo $avaimet | grep insert) ]] && valintasallittu['2']=0 || valintasallittu['2']=1 && avain['2']='insert' 
[[ ! $(echo $avaimet | grep delete) ]] && valintasallittu['3']=0 || valintasallittu['3']=1 && avain['3']='delete'
local otsikko key valintatehty=0 Xkoordinaatti Ykoordinaatti   
[[ ! $ValitunNumero || $ValitunNumero -lt 1 || $ValitunNumero -gt ${#Valittavat[@]} ]] && ValitunNumero=1
setterm -cursor off 
otsikko="$1"; [[ ! "$otsikko" ]] && otsikko='Ohjelma: '$0' pyytää valitsemaan näistä'
crc=$(echo $otsikko | cksum | awk {'print $1'}) # cksum=32bittinen crc, sha1sum ->160bittinen ...
TulostaValittavat
valintatehty=0
Tapahtuma=''
while [ $valintatehty -lt 1 ] ; do MuutaValittuNuolinappaimilla;  done
clear; tput sgr0; setterm -reset; stty echo # clear lisätty
ValitunTeksti=${Valittavat[ValitunNumero-1]}
[[ $ValitunTeksti = '.edellinen kansio.' ]] && valintalukko=1
[[ ! ${ValitunArvo[ValitunNumero-1]} ]] && ValitunArvo='ei määritelty' || ValitunArvo=${ValitunArvo[ValitunNumero-1]}
}

# loput funktiot ovat Skriptiajuria varten
function etsiä_missä_skripti_on_kun_muistaa_sen_nimestä_jotakin () {
avaimet='end=palaa Skriptiajuriin        f2=uusi hakutermi'
while true
do
  clear; cat $kanta/OMATSKRIPTIT/ARKISTO/APUTIEDOSTOT/grepin_määreet; echo; echo
  lue_näppäimistöltä hakusana "mitä ilmausta etsit kansioiden tai skriptien nimistä (teksti voi olla keskelläkin sanaa)?"
  eval Valittavat=(" "$(find $kanta/OMATSKRIPTIT |  grep  "$hakusana" | grep -v /ARKISTO/ | grep -v *sgml | sed 's/^ */"/g;s/ *$/"/g'))
  ValitunNumero=$(cat $kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/haku2)
  ValitseValittavistaYksi "ilmaus löytyi näiden skriptien nimistä: valitse editoitava näpäyttämällä sitä hiiriosoittimella." "$avaimet"
  [[ $Tapahtuma = "end" ]] && break
  [[ $Tapahtuma = "f2" ]] ||  echo 'editoin tiedostoa: '$kanta/OMATSKRIPTIT/palautuspiste "$ValitunTeksti" && gedit "$ValitunTeksti" && break
done
echo $ValitunNumero > $kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/haku2
}

function etsiä_kysyttävää_ilmaisua_skriptien_tekstistä { # etsi_näistä, -v ?
clear; cat $kanta/OMATSKRIPTIT/ARKISTO/APUTIEDOSTOT/grepin_määreet; echo
lue_näppäimistöltä hakusana "mitä ilmausta etsit kaikista omista skripteistä ?"
optiot="-lr"; [[ ${hakusana:0:3} = '-i ' ]]  && optiot=${hakusana%% *}lr && hakusana=${hakusana#* }
[[ ${hakusana:0:3} = '-E ' ]]  && optiot=${hakusana%% *}lr && hakusana=${hakusana#* }
eval Valittavat=($(grep $optiot "$hakusana" $kanta/OMATSKRIPTIT | grep -v /ARKISTO/ | grep -v kopio | sed 's/^ */"/g;s/ *$/"/g'  ))
for (( n=0; n<=${#Valittavat[@]}-1 ; n++ )); do Valittavat[$n]=${Valittavat[$n]##*OMATSKRIPTIT\/}; done
[[ -f $kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/haku2 ]] && ValitunNumero=$(cat $kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/haku2)
while true
do
  avaimet='end=palaa Skriptiajuriin  f2=uusi hakutermi'
  ValitseValittavistaYksi "ilmaus löytyi näistä skripteistä: valitse editoitava nuolinäppäimillä ja paina enter" "$avaimet" 
  [[ $Tapahtuma = "end" ]] && break
  [[ $Tapahtuma = "f2" ]] && etsiä_kysyttävää_ilmaisua_skriptien_tekstistä
  gedit  $kanta/OMATSKRIPTIT/"$ValitunTeksti"
done
echo $ValitunNumero > $kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/haku2
}

function etsiä_esimerkkirivejä_kuinka_jotakin_käskyä_käytetään {
clear; cat $kanta/OMATSKRIPTIT/ARKISTO/APUTIEDOSTOT/grepin_määreet; echo; echo
lue_näppäimistöltä hakusana "millaisia esimerkkirivejä etsit kaikista omista skripteistä ?"
find ~/OMATSKRIPTIT ! -path '*ARKISTO*' ! -path *sgml -type f  -exec grep "$hakusana" {} \;
read -p 'hiirellä voi vieritää näyttöä. paina enter jatkaakseesi'
}

function ohjeet { # home. kaikkia ohjekansion tiedostoja tarjotaan editoitaviksi. Tiedostoja voi lisätä tai poistaa ja Skriptiajuri ottaa muutoksen automaattisesti huomioon.
# paikassa: $kanta/OMATSKRIPTIT/OHJEITA/ARKISTO/SKRIPTIT/"Skriptiajuri, näppäinversio"/<tiedoston nimi>/<monotonisesti kasvava arkistonumero> on kopio kaikista muuttuneista tiedostoista
gedit & # tämä käsky aiheuttaa sen että pääohjelma ei pysähdy tuleviin gedit-käskyihin vaan jatkaa taustalla ilman näppäimiä ja fyysistä näyttöä
täytä_valittavat $kanta/OMATSKRIPTIT/OHJEITA/"Skriptiajuri, näppäinversio"
for (( n=2; n<=${#Valittavat[@]}-1; n++ )); do 
TiedostonAikaleimaAlussa[$n]=$(stat --printf %y $kanta/OMATSKRIPTIT/OHJEITA/"Skriptiajuri, näppäinversio"/"${Valittavat[$n]}" | awk '{ print $2 }')
gedit $kanta/OMATSKRIPTIT/OHJEITA/"Skriptiajuri, näppäinversio"/"${Valittavat[$n]}"
done
reset; read -p 'paina enter'
# sen varalta että joku ohje on muuttunut lisätään sen kopio arkistoon. Samalla poistuvat tyhjätyt ohjeet
täytä_valittavat $kanta/OMATSKRIPTIT/OHJEITA/"Skriptiajuri, näppäinversio"
for (( n=2; n<=${#Valittavat[@]}-1; n++ )); do
  [[ ! -d $kanta/OMATSKRIPTIT/OHJEITA/ARKISTO/SKRIPTIT/"Skriptiajuri, näppäinversio"/"${Valittavat[$n]}" ]] && mkdir -p $kanta/OMATSKRIPTIT/OHJEITA/ARKISTO/SKRIPTIT/"Skriptiajuri, näppäinversio"/"${Valittavat[$n]}" && touch $kanta/OMATSKRIPTIT/OHJEITA/ARKISTO/SKRIPTIT/"Skriptiajuri, näppäinversio"/"${Valittavat[$n]}"/0
  [[ ${TiedostonAikaleimaAlussa[$n]} = $(stat --printf %y $kanta/OMATSKRIPTIT/OHJEITA/"Skriptiajuri, näppäinversio"/"${Valittavat[$n]}" | awk '{ print $2 }' ) ]] && continue
  Suurin_numero_ohjeissa=$(ls $kanta/OMATSKRIPTIT/OHJEITA/ARKISTO/SKRIPTIT/"Skriptiajuri, näppäinversio"/"${Valittavat[$n]}" | sort -g | tail -n 1)
  cp $kanta/OMATSKRIPTIT/OHJEITA/"Skriptiajuri, näppäinversio"/"${Valittavat[$n]}"  $kanta/OMATSKRIPTIT/OHJEITA/ARKISTO/SKRIPTIT/"Skriptiajuri, näppäinversio"/"${Valittavat[$n]}"/$(($Suurin_numero_ohjeissa+1))
done
}

function ajaa_valitun_skriptin {
# [[ $ValitunTeksti = '.edellinen_kansio.' ]] && KansionNimi=$(dirname "$KansionNimi") && echo "$KansionNimi">$kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/KansionNimiAloituksessa && HaeSenRinvinNumeroJollaViimeksiTyöskenneltiinTässäKansiossa "$KansionNimi" && return
[[ -d $kanta/"$KansionNimi"/"$ValitunTeksti" ]] && KansionNimi="$KansionNimi"/"$ValitunTeksti" && return
[[ $(echo "$ValitunTeksti" | grep -e '.PDF' -e '.pdf') ]] && evince $kanta/"$KansionNimi"/"$ValitunTeksti" && return
[[ $(echo "$ValitunTeksti" | grep -e '\.doc' -e .html -e .odt -e .sgml -e .xml) ]] && /usr/bin/libreoffice $kanta/"$KansionNimi"/"$ValitunTeksti" && return
# [[ ! -d $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti" ]] && mkdir -p $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"
bash -n $kanta/"$KansionNimi"/"$ValitunTeksti" &>$kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"/virhe
[[ ! -f $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"/virhe ]] && echo "" > $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"/virhe
[[ $(cat -b $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"/virhe) > 0 ]] && echo 'tulkkauskelvoton, mennään koodaamaan' && sleep 0.5 && koodaa && return
[[ $(cat $kanta/"$KansionNimi"/"$ValitunTeksti" | grep \$1) ]] && LueParametrit # jos skriptissä on viittauksia parametreihin käydään lukemassa niitä
clear && echo -e 'suoritan skriptin: '$kanta/"$KansionNimi"/$ValitunTeksti'\n' && time bash $kanta/"$KansionNimi"/"$ValitunTeksti" $Parametrit && read -p 'jatkaakseesi paina enter' || ( reset; echo "skriptisi päätyi virheeseen virhe-statuksella: "$? ; read -p "jatkaakseesi paina enter"; $kanta/OMATSKRIPTIT/"Skriptiajuri, näppäinversio" )
}

--- Koodi päättyy ---

petteriIII:
liitä koodi tiedostoon: ~/OMATSKRIPTIT/FUNKTIOKIRJASTO/IDEfunktiot1

IDE1funktiot ja IDE2funktiot tarjoavat skriptiajurille sen tarvitsemat funktiot.


--- Koodia: ---#!/bin/bash  
# petteriIII 2.4.2013 # trap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 notify-send -hint?????  xmessage
echo -e "funktiot paikasta:"${0%/OMATSKRIPTIT*}"/OMATSKRIPTIT/FUNKTIOKIRJASTO/IDEfunktiot1 liitetään koodiin"

function tehdä_uuden_skriptin_tähän_kansioon () {
while true; do
  lue_näppäimistöltä SkriptinNimi "mikä tulee uuden skriptin nimeksi: "
  [[ ! -f $kanta/"$KansionNimi"/"$SkriptinNimi" ]] && break || echo 'sen niminen on jo' && sleep 2
done
etsi_samannimiset_skriptit "$SkriptinNimi"
[[ ! $SkriptinNimi ]] && return
echo -e '#!/bin/bash'>$kanta/"$KansionNimi"/"$SkriptinNimi"
gedit $kanta/"$KansionNimi"/"$SkriptinNimi"
muuta_uusi_nimi_valituksi
}

function etsi_samannimiset_skriptit () {
avaimet="end=palaa Skriptiajuriin jatkamaan skriptintekoa           home=peru skriptinteko"
hakusana="$1"
ValitunNumero=1
eval Valittavat=(" "$(find $kanta/OMATSKRIPTIT |  grep  "$hakusana" | grep -v /ARKISTO/ | grep -v *sgml | sed 's/^ */"/g;s/ *$/"/g'))
while true
do  
  [[ ! ${Valittavat[0]} ]] && break
  ValitseValittavistaYksi "näillä skripteillä on samankaltainen nimi: katso enteriä painamalla onko joku samanlainen kuin se minkä aiot tehdä" "$avaimet"
  [[ $Tapahtuma = "end" ]] && break
  [[ $Tapahtuma = "home" ]] && SkriptinNimi="" && return
  gedit "$ValitunTeksti"
  let ValitunNumero++
done
}

function rajoittaa_tämän_skriptin_arkistossa_koodien_lukua {
for apu in SKRIPTIT # dokumentteja tuskin kertyy rajoitettavaksi
do
  echo -n 'ARKISTO/'$apu/"$ValitunTeksti"' tilatarve sanoja: '; (echo 0; find $kanta/"$KansionNimi"/ARKISTO/$apu/"$ValitunTeksti" -printf '%s +\n'; echo p) | dc
  Suurin_numero=$(($(ls --ignore=*'_dokumentti' $kanta/"$KansionNimi"/ARKISTO/$apu/"$ValitunTeksti" | sort -g | tail -n 1)-10))
  Pienin_numero=$(ls --ignore=*'_dokumentti' --ignore=ARKISTO $kanta/"$KansionNimi"/ARKISTO/$apu/"$ValitunTeksti" | sort -g | head -n 1)
  [[ Suurin_numero-Pienin_numero -gt 99 ]] && echo $apu'  ARKISTO-kopioiden lukumäärä: '$((Suurin_numero-Pienin_numero))'  vähennetään 99:ään' || echo 'ei vähennettävää'
  for (( n=Pienin_numero; n<=Suurin_numero-99; n++ ));do
    [[ -f $kanta/"$KansionNimi"/ARKISTO/$apu/"$ValitunTeksti"/$n ]] && rm $kanta/"$KansionNimi"/ARKISTO/$apu/"$ValitunTeksti"/$n
  done
done
read -p 'paina enter jatkaakseesi'
}

function tehdä_uuden_kansion_tähän_kansioon () {
lue_näppäimistöltä UusiKansio "mikä tulee uuden kansion nimeksi: "
UusiKansio=$(echo "$UusiKansio" | tr [:lower:] [:upper:])
echo 'Luon kansiot nimeltä: '$kanta/"$KansionNimi"/"$UusiKansio"' ja sille arkistot'
mkdir -p $kanta/"$KansionNimi"/"$UusiKansio"/ARKISTO/{SKRIPTIT,DOKUMENTIT,HISTORIAT,POISTETUT}
echo 1 > $kanta/"$KansionNimi"/"$UusiKansio"/ARKISTO/ViimeksiValittuSkriptiTässäKansiossa
}

function poistaa_tämän_valitun_kohdan () {
echo 'siirrän: '$kanta/"$KansionNimi"/"$ValitunTeksti"'  POISTETTUIHIN. Sieltä se löytyy jos haluat takaisin'
[[ ! -d $kanta/"$KansionNimi"/ARKISTO/POISTETUT ]] && mkdir $kanta/"$KansionNimi"/ARKISTO/POISTETUT
mv $kanta/"$KansionNimi"/"$ValitunTeksti" $kanta/"$KansionNimi"/ARKISTO/POISTETUT/"$ValitunTeksti"
# rm -R $kanta/"$KansionNimi"/ARKISTO/{SKRIPTIT,DOKUMENTIT,HISTORIAT}/"$ValitunTeksti"  
sleep 1
}

function muuttaa_tämän_kohdan_nimeä () {
SkriptinNimi="$ValitunTeksti"
lue_näppäimistöltä  SkriptinNimi 'Nimeämisen voi tehdä ainoastaan samaan kansioon. Nimi on nyt: '"$ValitunTeksti""\nmiksi haluat muuttaa sen: "
mv $kanta/"$KansionNimi"/"$ValitunTeksti" $kanta/"$KansionNimi"/"$SkriptinNimi"
[[ -f $kanta/"$KansionNimi"/"$SkriptinNimi" ]] && ( # tiedostosta kyseenollen arkistot uudellen-nimetään myös # rivi lisätty; kokeile toiminta ja poista kommentti
mv $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti" $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$SkriptinNimi"
mv $kanta/"$KansionNimi"/ARKISTO/DOKUMENTIT/"$ValitunTeksti"/"$ValitunTeksti"_dokumentti $kanta/"$KansionNimi"/ARKISTO/DOKUMENTIT/"$ValitunTeksti"/"$SkriptinNimi"_dokumentti
mv $kanta/"$KansionNimi"/ARKISTO/DOKUMENTIT/"$ValitunTeksti" $kanta/"$KansionNimi"/ARKISTO/DOKUMENTIT/"$SkriptinNimi"
mv $kanta/"$KansionNimi"/ARKISTO/HISTORIAT/"$ValitunTeksti" $kanta/"$KansionNimi"/ARKISTO/HISTORIAT/"$SkriptinNimi" )
muuta_uusi_nimi_valituksi
}

function siirtää_osoitettavaan_kansioon_osoitettavat_kansiot_tai_skriptit () {  
KansioJohonSiirretaan="OMATSKRIPTIT"
avaimet="valitse kansio johon siirretään ja paina f3 kun olet siinä kansiossa     f2=palaa Skriptiajuriin"
while true
do  
  täytä_valittavat "$KansioJohonSiirretaan"
  ValitseValittavistaYksi "Nyt ollaan kansiossa: ""$KansionNimi" "$avaimet" 1 valinta
  [[ $Tapahtuma = f3 ]] && break
  [[ $Tapahtuma = f2 ]] && return
  [[ $ValitunTeksti = ".edellinen_kansio." ]] && KansioJohonSiirretaan=$(dirname "$KansioJohonSiirretaan") && KansionNimi="$KansioJohonSiirretaan"
  [[ -d "$KansioJohonSiirretaan"/"$ValitunTeksti" ]] && KansioJohonSiirretaan="$KansioJohonSiirretaan"/"$ValitunTeksti" && KansionNimi="$KansioJohonSiirretaan"
done
KansionNimi='OMATSKRIPTIT'
avaimet="f3=lopeta  f4=siirrä tämä"
while true
do
  täytä_valittavat $kanta/"$KansionNimi"
  ValitseValittavistaYksi "Valittu siirretään painettaessa f4 kansioon:""$KansioJohonSiirretaan" "$avaimet"
  [[ $ValitunTeksti = '.edellinen kansio.' ]] && KansionNimi=$(dirname "$KansionNimi") && continue
  [[ $Tapahtuma = f3 ]] && return
  [[ $Tapahtuma = 'enter' ]] && [[ -d $kanta/"$KansionNimi"/"$ValitunTeksti" ]] && KansionNimi=/"$KansionNimi"/"$ValitunTeksti"
  [[ $Tapahtuma = f4 ]] && {
  [[ -d $kanta/"$KansionNimi"/"$ValitunTeksti" ]] &&  mv -u $kanta/"$KansionNimi"/"$ValitunTeksti"  "$KansioJohonSiirretaan"/"$ValitunTeksti" && continue
    mv -u $kanta/"$KansionNimi"/"$ValitunTeksti"  "$KansioJohonSiirretaan"/"$ValitunTeksti"
    mv -u $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"  "$KansioJohonSiirretaan"/ARKISTO/SKRIPTIT/"$ValitunTeksti" # tiedostosta kyseenollen arkistot siirretään myös
    mv -u $kanta/"$KansionNimi"/ARKISTO/DOKUMENTIT/"$ValitunTeksti"  "$KansioJohonSiirretaan"/ARKISTO/DOKUMENTIT/"$ValitunTeksti"
    mv -u $kanta/"$KansionNimi"/ARKISTO/HISTORIAT/"$ValitunTeksti"  "$KansioJohonSiirretaan"/ARKISTO/HISTORIAT/"$ValitunTeksti"    
                           }
done
}


 
function koodaa { # f2
[[ -d $kanta/"$KansionNimi"/"$ValitunTeksti" ]] && echo kansiota ei voi koodata. Valinta siirtyy takaisin tiedoston kohdalle && read -p 'paina enter' && continue
[[ $(echo "$KansionNimi" | grep ARKISTO) ]] && apu=$arkistoonpoikettu/"${KansionNimi##*\/}" && gedit $kanta/"$KansionNimi"'/'"$ValitunTeksti" "$apu" && continue # toimia ARKISTOssa ei arkistoida, ainoastaan käydään hakemassa koodi 178 uusikoe
[[ ! -f $kanta/"$KansionNimi"/'ARKISTO/SKRIPTIT/'"$ValitunTeksti"/1 ]] && cp $kanta/"$KansionNimi"/"$ValitunTeksti"  $kanta/"$KansionNimi"/'ARKISTO/SKRIPTIT'/"$ValitunTeksti"'/'1
Suurin_numero=$(ls $kanta/"$KansionNimi"/'ARKISTO/SKRIPTIT/'"$ValitunTeksti" | sort -g | tail -n 1)
apu=$kanta/\'"$KansionNimi"\'/\'"$ValitunTeksti"\'
for n in $(ls --hide=0 $kanta/"$KansionNimi"/'ARKISTO/SKRIPTIT/'"$ValitunTeksti" | sort -g | tail -n 6); do apu="$apu"' '$kanta/\'"$KansionNimi"\'/'ARKISTO/SKRIPTIT/'\'"$ValitunTeksti"\'/$n; done
## laheta kirjasto-funktion kopio arkistoon mikäli kirjastoa kutsutaan
funktiokirjasto=$(grep  FUNKTIOKIRJASTO $kanta/"$KansionNimi"'/'"$ValitunTeksti" | grep -v ARKISTO | awk {'print $2'}  | tr "\n" "  " );  
[[ "$KansionNimi" = OMATSKRIPTIT/FUNKTIOKIRJASTO ]] && funktiokirjasto='' # funktiokirjastossa ei liitetä toisia kirjastoja
[[ $funktiokirjasto ]] && {
apu="$apu"' '"$funktiokirjasto"; echo # lisää kirjastot editoitaviin
}
# apuu testaa onko kyseessä skripti
apuu=$(cat $kanta/"$KansionNimi"/"$ValitunTeksti" | awk '{print $1}'); [[ $(echo ${apuu:2:5}) = "/bin/" ]] && bash -n $kanta/"$KansionNimi"/"$ValitunTeksti" &>$kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"/virhe
[[ -f $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"/virhe ]] && [[ $(cat -b $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"/virhe) < 1 ]] && rm $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"/virhe
[[ -f $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"/virhe ]] && apu="$apu"" "$kanta/\'"$KansionNimi"\'/ARKISTO/SKRIPTIT/\'"$ValitunTeksti"\'/virhe
TiedostonAikaleimaAlussa=$(stat --printf %y $kanta/"$KansionNimi"/"$ValitunTeksti" | awk '{ print $2 }')
eval gedit "$apu"
while [ $TiedostonAikaleimaAlussa = $(stat --printf %y $kanta/"$KansionNimi"/"$ValitunTeksti" | awk '{ print $2 }' ) ]; do clear; read -t 1 -N 1 -p "paina näppäimistöstä jotain nappulaa" apu; [[ $apu ]] && TiedostonAikaleimaAlussa=1; done
# wait $! # $!=edellisen prosessin PID. Wait odottaa prosessin PID loppumista.
[[ -f $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"/virhe ]] && rm $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"/virhe
DIFF=$(diff $kanta/"$KansionNimi"/"$ValitunTeksti"  $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"'/'$Suurin_numero )
[[ "$DIFF" != "" ]] && cp $kanta/"$KansionNimi"/"$ValitunTeksti"  $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"'/'$(($Suurin_numero+1))
echo ""
}

function dokumentoi { # f4
[[ $(echo "$KansionNimi" | grep ARKISTO) ]] && gedit $kanta/"$KansionNimi"'/'"$ValitunTeksti" $kanta/"$KansionNimi"'/'"${KansionNimi##*\/DOKUMENTIT\/}_dokumentti" && continue # ehdon tarkoitus:toimia ARKISTOssa ei arkistoida
[[ -d "$KansionNimi"/"$ValitunTeksti" ]] && echo 'kansion dokumentti' && sleep .1
[[ ! -d $kanta/"$KansionNimi"/ARKISTO/DOKUMENTIT/"$ValitunTeksti" ]] && mkdir -p $kanta/"$KansionNimi"/ARKISTO/DOKUMENTIT/"$ValitunTeksti"
[[ ! -f $kanta/"$KansionNimi"/ARKISTO/DOKUMENTIT/"$ValitunTeksti"/0 ]] && touch $kanta/"$KansionNimi"/ARKISTO/DOKUMENTIT/"$ValitunTeksti"/0
Suurin_numero=$(ls --hide="$ValitunTeksti"'_dokumentti' $kanta/"$KansionNimi"/ARKISTO/DOKUMENTIT/"$ValitunTeksti" | sort -g | tail -n 1)
apu=''
for n in $(ls --hide=*_dokumentti --hide=0 $kanta/"$KansionNimi"/ARKISTO/DOKUMENTIT/"$ValitunTeksti" | sort -g | tail -n 6); do  apu="$apu"$kanta"/"\'"$KansionNimi"\'/ARKISTO/DOKUMENTIT/\'"$ValitunTeksti"\'/$n' '; done
TiedostonAikaleimaAlussa=$(stat --printf %y $kanta/"$KansionNimi"/ARKISTO/DOKUMENTIT/"$ValitunTeksti"/"$ValitunTeksti"'_dokumentti' | awk '{ print $2 }' )
eval gedit $kanta/\'"$KansionNimi"\'/ARKISTO/DOKUMENTIT/\'"$ValitunTeksti"\'/\'"$ValitunTeksti"\'_dokumentti\  $apu
while [ $TiedostonAikaleimaAlussa = $(stat --printf %y $kanta/"$KansionNimi"/ARKISTO/DOKUMENTIT/"$ValitunTeksti"/"$ValitunTeksti"'_dokumentti' | awk '{ print $2 }' ) ]; do clear; read -t 1 -N 1 -p "paina näppäimistöstä jotain nappulaa" apu; [[ $apu ]] && TiedostonAikaleimaAlussa=1; done
DIFF=$(diff $kanta/"$KansionNimi"/ARKISTO/DOKUMENTIT/"$ValitunTeksti"/"$ValitunTeksti"_dokumentti  $kanta/"$KansionNimi"/ARKISTO/DOKUMENTIT/"$ValitunTeksti"/$Suurin_numero )
[[ "$DIFF" != "" ]] && cp $kanta/"$KansionNimi"/ARKISTO/DOKUMENTIT/"$ValitunTeksti"/"$ValitunTeksti"'_dokumentti'  $kanta/"$KansionNimi"/ARKISTO/DOKUMENTIT/"$ValitunTeksti"/$(($Suurin_numero+1))
reset;  
}

function hexeditoida_osoitettua_skriptiä { bless $kanta/"$KansionNimi"/"$ValitunTekstiTalteen"; }

--- Koodi päättyy ---

petteriIII:
liitä koodi tiedostoon: ~/OMATSKRIPTIT/FUNKTIOKIRJASTO/IDEfunktiot2

--- Koodia: ---#!/bin/bash  
# petteriIII 2.4.2013
echo -e "funktiot paikasta:"${0%/OMATSKRIPTIT*}"/OMATSKRIPTIT/FUNKTIOKIRJASTO/IDEfunktiot2 liitetään koodiin"

function lue_näppäimistöltä () { # Vanhoja vastauksia voi selata ja editoida. Historiatiedosto on nimetty kysymyksen tekstin mukaan. Jokaisessa kansiossa on omat historiatiedostot.
# kutsu: lue_näppäimistöltä <kysyttävän muuttujan nimi> <kysymysteksti jonka merkkivalikoimaa ei ole rajoitettu> . Kysytyn muuttujan arvo tosiaan muuttuu.
historiatiedosto=$kanta/"$KansionNimi"/ARKISTO/HISTORIAT/"$2"
[[ ! -f "$historiatiedosto" ]] && echo 'historian alku' > "$historiatiedosto"   # kysymykselle luodaan kysymyksen tekstin mukainen historia-tiedosto # clear
apu=$(eval echo \$$1)
[[ "$apu" != $(tail -1  "$historiatiedosto") ]] &&  echo "$apu" >>  "$historiatiedosto" # kysytty arvo viedään heti historiaan josta sitä voi siis kutsua jo ensimmäisellä kerralla
echo -e "\nEdellisiä vastauksia voi selailla nuolinäppäimillä. Myös editointi toimii. Kirjoita vaikkei kysymysmerkkiä näykään"
echo -e "ctrl-r tuo esiin historian normaalin reverse-search:in. Jos annat pelkästään ¤ niin palataan Skriptiajuriin\n"$2
HISTFILE="$historiatiedosto"
set -o history
read -e $1 # $1 on muuttujan nimi
HISTFILE=~/.bash_history
set -o history
[[ $(eval echo \$$1) = ¤ ]] && $kanta/OMATSKRIPTIT/"Skriptiajuri, näppäinversio" # mahdollinen ongelma
eval echo \$$1 >>  "$historiatiedosto" # arvo menee sekä historistiedostoon että palautuu kysyttyyn muuttujaan $1
}
 
function täytä_valittavat () {
kansio=$@ # kun listattavaksi tulee kansio jonka nimessä on välilyöntejä siirtyy jokainen sana omassa parametrissaan ja ne täytyy liittää yhteen
find "$kansio" -size 0b -delete; find "$kansio" -type f -name ?*'\~' -delete; find "$kansio" -type f -name delme -delete
[[ $(echo "$kansio" | grep ARKISTO) ]] && eval Valittavat=(".edellinen_kansio." " "     $(ls "$kansio" -Qv --group-directories-first)) || eval Valittavat=(".edellinen_kansio." " "     $(ls "$kansio" -Q --group-directories-first))
}

function HaeSenRinvinNumeroJollaViimeksiTyöskenneltiinTässäKansiossa() {
ValitunNumero=1
[[ ! -d $kanta/"$KansionNimi"/ARKISTO ]] && mkdir $kanta/"$KansionNimi"/ARKISTO && echo 1 > $kanta/"$KansionNimi"/ARKISTO/ViimeksiValittuSkriptiTässäKansiossa
[[ -f $kanta/"$KansionNimi"/ARKISTO/ViimeksiValittuSkriptiTässäKansiossa ]] && ValitunNumero=$(cat $kanta/"$KansionNimi"/ARKISTO/ViimeksiValittuSkriptiTässäKansiossa)
}

function synkronoida_kovalevyn_ja_tikun_omatskriptit {
lue_näppäimistöltä kansio "mikä on kansion nimi tikulla (tyhjä nimi käy myös): "
rsync --existing -arcuv /media/tikku/$kansio/OMATSKRIPTIT ~
rsync --existing -arcuv ~/OMATSKRIPTIT /media/tikku/$kansio
read -p 'paina enter jatkaakseesi'
}

function LueParametrit () { lue_näppäimistöltä Parametrit "$ValitunTeksti"" saattaa vaatia parametreja. Annapa niitä jos asiallisena pidät:"; }

function VarmistaEttäArkistotOnTehty () {
[[ $(echo "$KansionNimi"/"$ValitunTeksti" | grep /ARKISTO) ]] && return # ARKISTOon ei tehdä arkistoa
[[ -d $kanta/"$KansionNimi"/"$ValitunTeksti" ]] && [[ ! -d $kanta/"$KansionNimi"/"$ValitunTeksti"/ARKISTO/POISTETUT ]] && mkdir -p $kanta/"$KansionNimi"/"$ValitunTeksti"/ARKISTO/POISTETUT && return
[[ ! -d $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti" ]] && ( mkdir -p $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"; touch $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"/0 )
[[ ! -d $kanta/"$KansionNimi"/ARKISTO/DOKUMENTIT/"$ValitunTeksti" ]] && ( mkdir -p $kanta/"$KansionNimi"/ARKISTO/DOKUMENTIT/"$ValitunTeksti"; touch $kanta/"$KansionNimi"/ARKISTO/DOKUMENTIT/"$ValitunTeksti"/0; echo " " > $kanta/"$KansionNimi"/ARKISTO/DOKUMENTIT/"$ValitunTeksti"/"$ValitunTeksti"_dokumentti )
# tavitaanko enää? [[ ! -d $kanta/"$KansionNimi"/ARKISTO/HISTORIAT/"$ValitunTeksti" ]] && mkdir -p $kanta/"$KansionNimi"/ARKISTO/HISTORIAT/"$ValitunTeksti"
echo '' # funktiossa on ehdottomasti tehtävä jotakin  ja noista muista lauseista ei ehkä suoriteta yhtään, ehdollisia kun ovat
}

function TalletaSenRinvinNumeroJollaNytTyöskenneltiinTässäKansiossa() {
echo $ValitunNumero > $kanta/"$KansionNimi"/ARKISTO/ViimeksiValittuSkriptiTässäKansiossa #koe
}

function TalletaMistäKansiostaEnsikerrallaAloitetaan {
apu=${KansionNimi%%[[:alnum:]]*}; KansionNimi=${KansionNimi:${#apu}} # siistitään kansionnimi alkamaan aakkosnumerolla
apu=${KansionNimi%[[:alnum:]]*}; KansionNimi=${KansionNimi:0:$((${#apu}+1))} # siistitään kansionnimi päättymään aakkosnumeroon
echo "$KansionNimi">$kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/KansionNimiAloituksessa
}

function muuttaa_tämän_kansion_nimen_suurille_kirjaimille () {
SkriptinNimi="$ValitunTeksti"
SkriptinNimi=$(echo "$SkriptinNimi" | tr [:lower:] [:upper:])
mkdir $kanta/"$KansionNimi"/"$SkriptinNimi"
cp -rf $kanta/"$KansionNimi"/"$ValitunTeksti"/*  $kanta/"$KansionNimi"/"$SkriptinNimi"/; rm $kanta/"$KansionNimi"/"$ValitunTeksti"  # ARKISTOT seuraa mukana
muuta_uusi_nimi_valituksi
}

function muuta_uusi_nimi_valituksi {
täytä_valittavat $kanta/"$KansionNimi"
for (( n=1; n<=${#Valittavat[@]}; n++ )); do [[ $SkriptinNimi = "${Valittavat[n-1]}" ]] && break; done
echo $n > $kanta/"$KansionNimi"/ARKISTO/ViimeksiValittuSkriptiTässäKansiossa # kokeiltava toimiiko
}

function sovellusvalikko {
[[ -f $kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/haku1 ]] && ValitunNumero=$(cat $kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/haku1)
avaimet="end=palaa Skriptiajuriin   home=lopeta Skriptiajuri"
Valittavat=('tehdä uuden skriptin tähän kansioon' 'tehdä uuden kansion tähän kansioon' 'poistaa tämän valitun kohdan' 'siirtää osoitettavaan kansioon osoitettavat kansiot tai skriptit' 'muuttaa tämän kohdan nimeä' 'muuttaa tämän kansion nimen suurille kirjaimille' ' ' 'etsiä esimerkkirivejä kuinka jotakin käskyä käytetään' 'etsiä kysyttävää ilmaisua skriptien tekstistä' 'etsiä missä skripti on kun muistaa sen nimestä jotakin' 'synkronoida kovalevyn ja tikun omatskriptit' 'rajoittaa tämän skriptin arkistossa koodien lukua' 'hexeditoida osoitettua skriptiä' 'ajaa valitun skriptin' 'muuttaa sanan kaikkialla OMATSKRIPTIT kansiossa' 'hakea man sivun ss64 comista' 'etsiä millä man_sivuilla puhutaan siitä toiminnosta jota pitäisi käyttää' 'etsiä skriptistä kontrollimerkit' 'kuvata tiedosto graafisesti')
ValitunTekstiTalteen=$ValitunTeksti
ValitseValittavistaYksi "Minkä toiminnon haluat suorittaa tälle: ""$ValitunTeksti" "$avaimet"
[[ $Tapahtuma = end ]] && return
[[ $Tapahtuma = home ]] && exit
Toimi="$ValitunTeksti"
ValitunTeksti=$ValitunTekstiTalteen
echo $ValitunNumero > $kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/haku1
$(echo $Toimi  | tr ' ' _ ) # välilyönnit muutetaan alleviivauksiksi.  huomioi että tämä on funktiokutsu
}

function kuvata_tiedosto_graafisesti () {
  gnuplot <<_EOF_
    set term postscript enhanced color
    set output "$kanta/testResults.dat.eps"
    set title 'testResults'
    p "$kanta/testResults.dat" u 1:2 w l
_EOF_
evince $kanta/testResults.dat.eps
}

function etsiä_skriptistä_kontrollimerkit () {
echo "Kontrollimerkit ovat joskus tarpeellisia eivätkä tarpeettomatkaan aina aikaansaa vikoja, mutta joskus ne invalidisoivat ja lisäksi niin ettei se näy ja usein ei huomaa etsiä."
echo "Ensiksi etsitään kontrollimerkit tyyppiä \n, nämä ovat yleensä tarpeellisia:"
[[ -f $kanta/"$KansionNimi"/"$ValitunTeksti" ]] && cat $kanta/"$KansionNimi"/"$ValitunTeksti" | tr -dc '[:cntrl:]' | od -c && echo && echo
echo 'Ja sitten kontrollimerkit tyypiltään:  M- ja: C- (Nämä ovat yleensä merkki "kontrollimerkeistä" ja usein tarpeettomia. Huomioi että ääkköset on poistettu)'; echo
cp $kanta/"$KansionNimi"/"$ValitunTeksti" /tmp/delme1
cat /tmp/delme1 | tr -d äöÄÖ > /tmp/delme2
cat -v /tmp/delme2 | grep -e M- -e C-
#    M-
read -p 'paina enter selattuasi'
}


function etsiä_millä_man_sivuilla_puhutaan_siitä_toiminnosta_jota_pitäisi_käyttää () {
lue_näppäimistöltä kiinnostuksen_aihe "mistä man-sivuilla pitäisi puhua: "
apropos $kiinnostuksen_aihe
read -p 'paina return'
}

function muuttaa_sanan_kaikkialla_OMATSKRIPTIT_kansiossa () {
echo "tämä toiminta vaatii koodin puukottamista. Koodi on paikassa: ~/OMATKRIPTIT/FUNKTIOKIRJASTO/IDEfunktiot2. Suojele välilyönnit ja erikoismerkit kenolla. Toiminta kestää noin minuutin jona aikana tulostuu yksi"
read -p "tai useampi kysymysmerkki. Muutettuasi koodia sammuta Skriptiajuri ja aloita sitten uudestaan. Aloittaakseesi paina enter"
# muutoslausekkeen selvitys: $'g/mikä/s//miksi/g\nw\nq' . Vain mikä ja miksi muutetaan.
shopt -s globstar
for file in $kanta/OMATSKRIPTIT/**/*; do
    [[ -f $file ]] && ed -s "$file" <<< $'g/IDE\ BASH-skripteille/s//Skriptiajuri/g\nw\nq'
done
shopt -u globstar
}

function hakea_man_sivun_ss64_comista () {
Valittavat=($(cat /home/petteri/OMATSKRIPTIT/ARKISTO/APUTIEDOSTOT/käskyluettelo))
ValitseValittavistaYksi "valitse mistä käskystä haluat man-sivun"
firefox  http://ss64.com/bash/$ValitunTeksti.html
}

function muodosta_Skriptiajurin_tiedostorakenne () {
mkdir -p $kanta/OMATSKRIPTIT/ARKISTO/{SKRIPTIT,DOKUMENTIT,HISTORIAT,ASETUKSET,APUTIEDOSTOT}
mkdir -p $kanta/OMATSKRIPTIT/{"KOE- JA ESIMERKKISKRIPTIT",FUNKTIOKIRJASTO,OHJEITA}/ARKISTO/{SKRIPTIT,DOKUMENTIT,HISTORIAT}
echo "OMATSKRIPTIT" > $kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/KansionNimiAloituksessa
echo 1 > ~/OMATSKRIPTIT/ARKISTO/ViimeksiValittuSkriptiTässäKansiossa
echo 1 > ~/OMATSKRIPTIT/"KOE- JA ESIMERKKISKRIPTIT"/ARKISTO/ViimeksiValittuSkriptiTässäKansiossa
echo 1 > ~/OMATSKRIPTIT/FUNKTIOKIRJASTO/ARKISTO/ViimeksiValittuSkriptiTässäKansiossa
echo 1 > ~/OMATSKRIPTIT/OHJEITA/ARKISTO/ViimeksiValittuSkriptiTässäKansiossa
echo " " > ~/OMATSKRIPTIT/ARKISTO/APUTIEDOSTOT/näyttö
}

function command_not_found_handle () {
# käyttöjärjestelmä kutsuu automaattisesti tämännimistä funktiota mikäli skriptissä viitataan käskyyn jollaista ei löydy.
komennon_nimi=$1
shift
echo "ohjelma:"${BASH_SOURCE}" Rivino:"${BASH_LINENO}
echo "seuraavaa käskyä ei löydy: \""$komennon_nimi\"""
echo "käskyn argumentit ovat: ""$@"
echo
kaskysta_on_puhuttu_paketeissa=$(apt-cache search $komennon_nimi)
[[ $(echo $kaskysta_on_puhuttu_paketeissa | grep ^$1) ]] && paketin_nimi=$(echo $kaskysta_on_puhuttu_paketeissa | grep ^$1) ||
paketin_nimi= $(echo $kaskysta_on_puhuttu_paketeissa | awk {'print $1'})
echo " paketin määrittelyä: "$paketin_nimi
sudo apt-get install ${komennon_nimi} || echo "siitä on puhuttu paketeissa: "$kaskysta_on_puhuttu_paketeissa
exit
}

--- Koodi päättyy ---

 

Navigaatio

[0] Viestien etusivu

[#] Seuraava sivu

Siirry pois tekstitilasta