Kirjoittaja Aihe: Vuoravaikutteinen script [ratkaistu]  (Luettu 3273 kertaa)

Tommi-The-Man

  • Käyttäjä
  • Viestejä: 174
    • Profiili
Vuoravaikutteinen script [ratkaistu]
« : 22.12.07 - klo:19.59 »
Miten olisi mahdollista tehdä scripti joka vaikka kysyisi haluatko suorittaa komennon a tai b. Kun käyttäjä kirjoittaisi a suoritettaisiin komento a jos käyttäjä vastaisi b suoritettaisiin b. Ehtolauseella tämä varmaan tehdään, mutta miten?
« Viimeksi muokattu: 25.12.07 - klo:16.57 kirjoittanut Tommi-The-Man »

mgronber

  • Käyttäjä
  • Viestejä: 1458
    • Profiili
Vs: Vuoravaikutteinen script
« Vastaus #1 : 23.12.07 - klo:01.52 »
Koodia: [Valitse]
#!/bin/bash

default="A"

cat <<EOF
Valikko
    A: suorita komento A
    B: suorita komento B
    C: suorita komento C
EOF

echo -n "Valitse ($default): "
read selection

selection="${selection:-$default}"

case "$selection" in
    a|A)
        echo "Suoritetaan komento A"
        ;;
    b|B)
        echo "Suoritetaan komento B"
        ;;
    c|C)
        echo "Suoritetaan komento C"
        ;;
    *)
        echo "Tuntematon vaihtoehto: $selection"
        exit 1
        ;;
esac

Tommi-The-Man

  • Käyttäjä
  • Viestejä: 174
    • Profiili
Vs: Vuoravaikutteinen script
« Vastaus #2 : 23.12.07 - klo:10.00 »
Kiitokset. Tälläisen tekeleen sain aikaan:
Koodia: [Valitse]
#!/bin/bash
clear
echo "En tiedä nimeäsi. Joten kerro nimesi."

nimi="nimi"


read selection

uusi_nimi="${selection:-$nimi}"
clear
echo "Hei $uusi_nimi, Onko kaikki hyvin. Ole hyvä ja vastaa on tai ei"

mielentila="mieli"


read selection

uusi_mielentila="${selection:-$mieli}"

case "$selection" in
    on)
        echo "No hyvä"
        ;;
    ei)
        echo "Harmi, tässä hyvä terapeutistin numero 045-1234567"
        ;;
    *)
        echo "Etkö nyt tuotakaan osannut"
        exit 1
        ;;
esac

mgronber

  • Käyttäjä
  • Viestejä: 1458
    • Profiili
Vs: Vuoravaikutteinen script
« Vastaus #3 : 24.12.07 - klo:13.30 »
Näyttäisi siltä olet ymmärtänyt hieman väärin oletusarvon asettamiseen käytetyn ${parameter:-word} -rakenteen. Ainakin muuttujan uusi_mielentila asettamisessa käytetään oletusarvona muuttujaa mieli jota ei ole olemassa. Lisäksi mielentilalle ei ole tarvetta käyttää oletusarvoa koska oletuksena suoritetaan viimeinen oletusehto case-testissä.

Alla oma versioni tuosta skriptistäsi.

Koodia: (terapiantarpeessa.sh) [Valitse]
#!/bin/bash

defaultName="$(whoami)"

clear
echo "En tiedä nimeäsi. Joten kerro nimesi."
echo -n "Vastaus ($defaultName): "
read name

name="${name:-$defaultName}"

clear
echo "Hei $name, Onko kaikki hyvin. Ole hyvä ja vastaa on tai ei"

read response

case "$response" in
    on)
        echo "No hyvä"
        ;;
    ei)
        echo "Harmi, tässä hyvän terapeutistin numero 045-1234567"
        ;;
    *)
        echo "Etkö nyt tuotakaan osannut"
        exit 1
        ;;
esac

Tommi-The-Man

  • Käyttäjä
  • Viestejä: 174
    • Profiili
Vs: Vuoravaikutteinen script
« Vastaus #4 : 24.12.07 - klo:14.31 »
Kysyisin vielä kohdasta
Koodia: [Valitse]
echo "En tiedä nimeäsi. Joten kerro nimesi."
echo -n "Vastaus ($defaultName): "

Tuo -n tarkoittaako se sitä että jos ei vastaa mitään niin tulostetaan teksti "Vastaus ($defaultName):"

Tuon oletusarvonhan voi siis jättää pois mikäli tuolla casella tekee nuo vaihtoehdot.

Tou komento "ecas" ihmetyttää myös mitä se tekee?

Tommi-The-Man

  • Käyttäjä
  • Viestejä: 174
    • Profiili
Vs: Vuoravaikutteinen script
« Vastaus #5 : 24.12.07 - klo:15.16 »
Kysyisin vielä kohdasta
Koodia: [Valitse]
echo "En tiedä nimeäsi. Joten kerro nimesi."
echo -n "Vastaus ($defaultName): "

Tuo -n tarkoittaako se sitä että jos ei vastaa mitään niin tulostetaan teksti "Vastaus ($defaultName):"

Tou komento "ecas" ihmetyttää myös mitä se tekee?

mgronber

  • Käyttäjä
  • Viestejä: 1458
    • Profiili
Vs: Vuoravaikutteinen script
« Vastaus #6 : 24.12.07 - klo:16.30 »
Kysyisin vielä kohdasta
Koodia: [Valitse]
echo "En tiedä nimeäsi. Joten kerro nimesi."
echo -n "Vastaus ($defaultName): "

Tuo -n tarkoittaako se sitä että jos ei vastaa mitään niin tulostetaan teksti "Vastaus ($defaultName):"

Koodia: (man echo) [Valitse]
$ man echo
[...]
       -n     do not output the trailing newline
[...]

Se siis tulostaa rivin ilman rivinvaihtoa. Näin käyttäjä pääsee antamaan vastauksen suoraan tuon rivin perään. Sulkeissa näytetään oletusarvo jos käyttäjä ohittaa vastauksen pelkällä enterin painalluksella. Oletusarvoksi asetin skriptin alussa komennon whoami tulosteen.

Lainaus
Tuon oletusarvonhan voi siis jättää pois mikäli tuolla casella tekee nuo vaihtoehdot.

Näin juuri mutta esimerkiksi nimen tapauksessa on luontevaa tehdä se minun tekemälläni tavalla, koska silloin käytettävä oletusarvo näkyy selkeästi skriptissä ja lisäksi sen pystyy helposti esittämään käyttäjälle.

Jos jälkimmäisessä kysymyksessä oletusarvo olisi "on" tai "ei" niin silloin sekin olisi luontevaa tehdä samalla tavalla kuin käyttäjän nimen kysyminen. Nythän jälkimmäisessä kysymyksessä ei varsinaisesti ole mitään oletusarvoa ja tyhjä syöte käsitellään samalla tavalla kuin mikä tahansa virheellinen syöte.

Lainaus
Tou komento "ecas" ihmetyttää myös mitä se tekee?

Se on "esac" ja se päättää case-komennon.

Koodia: (man bash) [Valitse]
$ man bash
[...]
       case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
              A case command first expands word, and tries to match it against  each  pattern  in
              turn,  using the same matching rules as for pathname expansion (see Pathname Expan‐
              sion below).  The word is expanded using tilde expansion,  parameter  and  variable
              expansion,  arithmetic substitution, command substitution, process substitution and
              quote removal.  Each pattern examined is expanded using tilde expansion,  parameter
              and  variable expansion, arithmetic substitution, command substitution, and process
              substitution.  If the shell option nocasematch is enabled, the match  is  performed
              without  regard  to  the case of alphabetic characters.  When a match is found, the
              corresponding list is executed.  After the first match, no subsequent  matches  are
              attempted.   The  exit  status is zero if no pattern matches.  Otherwise, it is the
              exit status of the last command executed in list.
[...]

janne

  • Käyttäjä
  • Viestejä: 5150
    • Profiili
Vs: Vuoravaikutteinen script
« Vastaus #7 : 24.12.07 - klo:23.14 »
Lainaus
Tou komento "ecas" ihmetyttää myös mitä se tekee?

Se on "esac" ja se päättää case-komennon.

jos tätä nyt vielä selittäisi... siis tuo sanahan tulee siitä, että esac on case kirjoitettuna takaperin. aivan samalla tavalla kuin if(-else)-lohkon päättää komento fi. tosin logiikka ei kanna ihan loppuun asti koska for(/while/until)-loopin sisältö rajataan sanoilla do ja done.
Janne

Tommi-The-Man

  • Käyttäjä
  • Viestejä: 174
    • Profiili
Vs: Vuoravaikutteinen script
« Vastaus #8 : 25.12.07 - klo:09.51 »
Noniin nyt alkoi homma selviämään. Kiitokset