đ Strontium
TĂ€rpit
Tarpeelliset komennot
TÀmÀn osion tehtÀvissÀ avuksi ovat ainakin seuraavat kohdat GNU-manuaalista:
Hakasulkeiden mÀÀrÀ
Huomaa, ettÀ yksittÀiset hakasulkeet, eli [ jotain ]
, ovat sama asia kuin komento test
. Kyseinen komento on POSIX-yhteensopiva ja sitÀ kÀytetÀÀn usein ehtolauseissa, jos haluat koodin toimivan kaikilla Unix-johdannaisilla kÀyttöjÀrjestelmillÀ. Jos tiedÀt, ettÀ koodia ajetaan nimenomaan Bash-shellillÀ, niin voit kÀyttÀÀ kaksoishakasulkeita, eli [[ jotain ]]
. Kaksoishakasulkeet ovat extensio Bashille ja niissÀ on muutamia etuja, kuten parempi merkkijonon kÀsittely ja parempi looginen operaattorien tuki.
#!/bin/bash
if [ 2 -gt 1 -a 1 -lt 2 -a 3 -eq 3 ]; then
echo "[POSIX] 2>1 ja 1<2 ja 3 on yhtÀ suuri kuin 3"
fi
# TÀmÀ on Bash-spesifi
if [[ 2 -gt 1 && 1 -lt 2 && 3 -eq 3 ]]; then
echo "[[BASH]] 2>1 ja 1<2 ja 3 on yhtÀ suuri kuin 3"
fi
# Arithmetic Bash
if (( 2 > 1 && 1 < 2 && 3 == 3 )); then
echo "((BASH)) 2>1 ja 1<2 ja 3 on yhtÀ suuri kuin 3"
fi
Warning
Huomaa, ettÀ vÀlilyönnit ovat tÀrkeitÀ Bash-skripteissÀ - myös (haka)sulkeiden kanssa. Katso alta esimerkki toimivasta ja ei-toimivasta koodista.
#!/bin/bash -e
answer="no"
# âïž Huonoa koodia; puuttuva vĂ€lilyönti tekee ehdosta
# epÀpÀtevÀn, ja one-linerin logiikka hajoaa vaarallisesti!
if [ "$answer" != "yes"]; then exit 1; fi
echo "Case 1: should not print"
# â
HyvÀÀ koodia; koodista otetaan exit ellei vastaus ole 'yes'
if [ "$answer" != "yes" ]; then exit 1; fi
echo "Case 2: should not print"
Tulostuu:
Staattinen analyysi
Viime luvussa opimme debuggausta bash:n optioneilla. Nyt kÀytÀmme lintteriÀ. Voit kokeilla sen online-versiota osoitteessa shellcheck.net. TehtÀvÀ-osiossa sinÀ otat sen kÀyttöön skriptauksen ja Dockerin avulla.
TehtÀvÀt
TehtÀvÀ: Arvaa numero
Luo ohjelma, joka generoi luvun vÀliltÀ 1-1000 ja pyytÀÀ kÀyttÀjÀÀ arvaamaan sen. Ohjelma antaa vihjeen, onko arvattu luku suurempi vai pienempi kuin generoitu luku. Ohjelma lopettaa, kun kÀyttÀjÀ arvaa oikein.
#!/bin/bash
max_number=1000
declare -i correct=500 # IMPLEMENT! Generoi satunnainen
declare -i guess=0
echo "Arvaa luku vÀliltÀ 1-${max_number}."
echo "Negatiivinen luku poistuu ohjelmasta."
# IMPLEMENT! Logiikka kÀyttÀen while-silmukkaa.
Kannattaa tutkia, minkÀ arvon kokonaisluku guess
saa, jos syöte on jotain muuta kuin validi numero.
TehtÀvÀ: Reminder
TÀmÀn tehtÀvÀn idean pohjana toimii Dave Taylorin ja Brandon Perryn Wicked Cool Shell Scripts, 2nd Edition. Luo kaksi ohjelmaa, jotka toimivat yhdessÀ. Toinen luo, toinen nÀyttÀÀ muistiinpanoja.
Jotta tehtÀvÀ ei olisi pelkkÀ copy-paste kirjan repositoriosta löytyvistÀ tiedostoista, niin luodaan ohjelma, joka on merkittÀvÀsti yksinkertaisempi. Voit poistaa koodista monimutkaisimmat osiot (cat
ja grep
). TypistÀ koodin toiminnallisuus siten, ettÀ vain vÀlttÀmÀtön on jÀljellÀ. Jos haluat lisÀhaastetta, ÀlÀ katso kirjan esimerkkikoodia laisinkaan.
install_remind.sh
- LisÀÀ
remember
jaremind
-komennot/usr/local/bin
-hakemistoon symbolisina linkkeinÀ, jotta niitÀ voi kutsua ilman tiedostopolkua nimillÀremember
jaremind
.
- LisÀÀ
remember
- Kysyy
read
-komennon avulla kÀyttÀjÀltÀ muistutuksia, jotka tallennetaan$HOME/.reminder
-tiedostoon. TyhjÀ syöte lopettaa muistutusten kirjoittamisen. - Formaatti:
[timestamp] Muistutus
- Kysyy
reminder
- Tulostaa koko muistutustiedoston sisÀllön.
Vihje PATH:iin
ln -s /app/jotain.sh /usr/local/bin/jotain
Alla esimerkki asennuksen ja kummankin sovelluksen toiminnasta. Komentojen vÀliin on lisÀtty tyhjÀ rivi lukemisen helpottamiseksi:
root$ /app/remind_install.sh
[INFO] Added remember and remind commands to /usr/local/bin
root$ remember
Enter note (quit with empty note)
>>> Buy egg
>>> Buy ham
>>> Buy sausage
>>> ???
>>> Profit
>>>
root$ remind
Your reminders are as follows:
[1738583804] Buy egg
[1738583806] Buy ham
[1738583809] Buy sausage
[1738583814] ???
[1738583815] Profit
Komennoissa on UNIX-timetamp eli sekunteja 1970-luvun alusta, joten olisi tÀysin mahdollista toteuttaa ohjelma, joka poistaa yli n viikkoa vanhat muistutukset. Vaihtoehtoisesti olisi tehtÀvissÀ menu, joka kysyy, mitkÀ muistutukset halutaan poistaa. Emme kuitenkaan toteuta nÀitÀ tÀssÀ tehtÀvÀssÀ.
TehtÀvÀ: Staattinen analyysi (Shellcheck)
Latasit aiemmassa luvussa readbash.sh
-skriptin. Ota siitÀ ja ShellCheck GitHub repositoriosta mallia. Luo skripti, jolla voit ajaa ShellCheckin valitsemillesi skripteille.
Ehdot:
- HyödyntÀÀ
shellcheck:stable
-imagea Docker Hubista. - On ajettavissa alla nÀkyvÀn docsin examplejen mukaisesti
Nice-to-have:
- VĂ€rit tulostuvat oikein, jotta output on helpompi lukea.
#!/bin/bash
#: Title : static.sh
#: Date : 202x-xx-xx
#: Author : xxx xxxxx
#: Version : 1.0
#: Description : Static code analysis for bash scripts.
#
#: Options : [script_name(s)]
#
#: === Examples ====
#: static.sh scripts/*.sh
#: static.sh scripts/foo.sh
#: static.sh scripts/foo.sh scripts/bar.sh
#: static.sh scripts/{foo,bar}.sh
# ... IMPLEMENT !
TehtÀvÀ: Korjaa skriptit
Aja yllÀ luomasi skripti kaikkia scripts/
-hakemiston skriptejĂ€ vasten â eli testaa kaikki kurssin skriptit. Korjaa virheet, joita ShellCheck löytÀÀ. LöydĂ€t virheistĂ€ lisĂ€tietoa ShellCheck WikistĂ€. Korvaa urlissa viimeinen SCxxxx
-osa oikealla virhekoodilla.
Ota samalla tavoitteeksi ajaa jatkossa kaikki skriptisi ShellCheckin lÀpi ennen kuin pÀÀstÀt niitÀ kÀsistÀsi. Huomaa, ettÀ ShellCheck ei palauta mitÀÀn, jos skripti on virheetön.