HyppÀÀ sisÀltöön

🎆 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.

compare_brackets.sh
#!/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.

bracket_space_problem.sh
#!/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:

🐳 stdout
./thingy.sh: line 6: [: missing `]'
Case 1: should not print

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.

arvaaluku.sh
#!/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 guesssaa, 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 ja remind-komennot /usr/local/bin-hakemistoon symbolisina linkkeinĂ€, jotta niitĂ€ voi kutsua ilman tiedostopolkua nimillĂ€ remember ja remind.
  • remember
    • Kysyy read-komennon avulla kĂ€yttĂ€jĂ€ltĂ€ muistutuksia, jotka tallennetaan $HOME/.reminder-tiedostoon. TyhjĂ€ syöte lopettaa muistutusten kirjoittamisen.
    • Formaatti: [timestamp] Muistutus
  • 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:

🐳 Bash
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.
static.sh
#!/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.