Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: Tommi-The-Man - 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?
-
#!/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
-
Kiitokset. Tälläisen tekeleen sain aikaan:
#!/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
-
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.
#!/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
-
Kysyisin vielä kohdasta
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?
-
Kysyisin vielä kohdasta
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?
-
Kysyisin vielä kohdasta
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):"
$ 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.
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.
Tou komento "ecas" ihmetyttää myös mitä se tekee?
Se on "esac" ja se päättää case-komennon.
$ 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.
[...]
-
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.
-
Noniin nyt alkoi homma selviämään. Kiitokset