Ryhmittelykomennot

Olen hieman hämmentynyt siitä, mitä nämä operaattorit tekevät eri tavalla, kun käytetään bashissa (suluissa, kaksoissulkeissa, suluissa ja kaksoissulkeissa).

[[ , [ , ( , (( 

Olen nähnyt ihmisten käyttävän niitä, jos tällaiset lausekkeet:

if [[condition]] if [condition] if ((condition)) if (condition) 

Kommentit

  • Liittyvät aiheet: yhden tai kahden hakasulkeen avulla – bash
  • Sulkeet ja hakasulkeet eivät ole ’ t, joita on helppo etsiä dokumentaatiosta, ja että ’ s kaikki mitä sinulla on, jos et ’ tiedä näiden ominaisuuksien nimiä.

Vastaa

Bournen kaltaisissa kuorissa if -lauseke näyttää tyypillisesti tältä:

if command-list1 then command-list2 else command-list3 fi 

Lauseke then suoritetaan, jos komentojen luettelo on nolla. Jos poistumiskoodi ei ole nolla, lauseke else suoritetaan. command-list1 voi olla yksinkertainen tai monimutkainen. Se voi olla esimerkiksi yhden tai useamman putkijonon sekvenssi, jonka erottaa yksi operaattoreista ;, &, &&, || tai uusi viiva. Alla olevat if -olosuhteet ovat vain command-list1 -tapauksia:

  1. if [ condition ]

    [ on toinen nimi perinteiselle test -komennolle. [ / test on tavallinen POSIX-apuohjelma. Kaikissa POSIX-kuoreissa on se sisäänrakennettu (tosin POSIX² ei vaadi sitä). test -komento asettaa poistumiskoodin ja if -käskyn toimii tyypillisesti. Tyypillisiä testejä ovat, onko tiedosto olemassa vai onko yksi numero sama kuin toinen.

  2. if [[ condition ]]

    Tämä on uusi päivitetty muunnelma kohteelle test ¹ osoitteesta ksh , joka on bash , zsh , yash , busybox sh tukee myös. Tämä [[ ... ]] -rakenne asettaa myös poistumiskoodin ja if -lauseke toimii vastaavasti. Laajennettujen ominaisuuksiensa joukossa se voi testata, vastaako merkkijono jokerimerkkiä (ei busybox sh : ssä).

  3. if ((condition))

    Toinen ksh -laajennus, jota myös bash ja zsh tukevat. Tämä suorittaa aritmeettisen arvon. Aritmeettisen toiminnan tuloksena asetetaan poistumiskoodi ja lauseke if toimii acco rdingly. Se palauttaa nollakoodin (tosi), jos aritmeettisen laskennan tulos on nolla. Kuten [[...]], tämä lomake ei ole POSIX eikä siksi ole kannettava.

  4. if (command)

    Tämä suorittaa komennon alikuoressa. Kun komento on valmis, se asettaa poistumiskoodin ja lauseke if toimii vastaavasti.

    Tyypillinen syy tällaisen alikuoren käyttämiseen on rajoittaa command jos command vaaditaan muuttujien määrityksiä tai muita muutoksia kuoren ympäristöön. Tällaiset muutokset eivät jää alikuoren valmistumisen jälkeen.

  5. iv if command

    komento suoritetaan ja lauseke if toimii sen poistumiskoodin mukaan.


¹ vaikka se ei oikeastaan ole komento vaan erityinen kuorirakenne, jolla on oma erillinen syntaksinsa normaalin komennon kanssa, ja vaihtelee merkittävästi kuorintoteutusten välillä

² POSIX vaatii erillisen test ja [ järjestelmän apuohjelmat, vaikka [, useiden Linux-jakelujen tiedetään olevan m käyttää sitä.

Kommentit

  • Kiitos, että sisällytit viidennen vaihtoehdon. Tämä ’ avain ymmärtämään, miten tämä todella toimii, ja on yllättävän alikäytetty.
  • Huomaa, että [ on itse asiassa binaarinen, ei sisäinen komento tai symboli. Asuu yleensä /bin.
  • @JulienR. itse asiassa [ on sisäänrakennettu, samoin kuin test. Yhteensopivuussyistä on saatavana binaariversioita. Tutustu help [ ja help test.
  • Huomaa, että vaikka ((ei ole POSIX, $(( ts. aritmeettinen laajennus on ja ’ on helppo sekoittaa ne. Usein kiertotapa on käyttää jotain [ $((2+2)) -eq 4 ] käyttää aritmeettista lauseketta
  • toivon, että voisin äänestää tätä vastausta useammin kuin kerran.

vastaus

  • (…) sulkeet osoittavat alikuori . Mikä niiden sisällä ei ole lauseke kuten monilla muilla kielillä. Se on luettelo komennoista (aivan kuin suluissa). Nämä komennot suoritetaan erillisessä aliprosessissa, joten sulkeissa suoritetuilla uudelleenohjauksilla, määrityksillä jne. Ei ole vaikutusta sulkeiden ulkopuolella.
    • Johtavan dollarin merkki, $(…) on -komennon korvaus : suluissa on komento ja komennon lähtö käytetään komentorivin osana (ylimääräisten laajennusten jälkeen, ellei korvaus ole lainausmerkkien välissä, mutta ”s toinen tarina ).
  • { … } aaltosulkeet ovat kuin sulkeet siinä mielessä, että ne ryhmittävät komennot, mutta ne vaikuttavat vain jäsentämiseen, ei ryhmittelyyn. Ohjelma x=2; { x=4; }; echo $x tulostaa 4, kun taas x=2; (x=4); echo $x tulostaa 2. (Myös avainsanat olkaimet on erotettava ja löytyi komentoasemasta (siten välilyönti { ja ; jälkeen }) suluissa ei ”t”. Se on vain syntaksin oivallus.)
    • Johtavan dollarinmerkin kanssa ${VAR} on parametrilaajennus , laajenee muuttujan arvoon mahdollisten ylimääräisten muunnosten avulla. ksh93 -kuori tukee myös ${ cmd;} -komennon korvaamisen muotoa, joka ei synny alikuorta.
  • ((…)) kaksoissulkeet ympäröivät aritmeettista käskyä eli kokonaislukujen laskentaa syntaksi, joka muistuttaa muita ohjelmointikieliä. Tätä syntaksia käytetään enimmäkseen tehtävissä ja ehdollisissa. Tämä on olemassa vain ksh / bash / zsh-tiedostoissa, ei tavallisessa sh: ssä.
    • Samaa syntaksia käytetään aritmeettisissa lausekkeissa $((…)), jotka laajenevat lausekkeen kokonaislukuun.
  • [ … ] ympäröivät yksittäiset sulkeet ehdolliset lausekkeet . Ehdolliset lausekkeet rakennetaan enimmäkseen -operaattoreille , kuten -n "$variable" testataksesi, onko muuttuja tyhjä, ja -e "$file" testattaaksesi, onko tiedosto olemassa. Huomaa, että jokaisen ympärillä on välilyönti operaattori (esim. [ "$x" = "$y" ], ei [ "$x"="$y" ] ) ja välilyönti tai merkki, kuten ; sekä suluissa että niiden ulkopuolella (esim. [ -n "$foo" ], ei [-n "$foo"] ).
  • [[ … ]] kaksoissulkeet ovat vaihtoehtoinen ehdollisten lausekkeiden muoto muodossa ksh / bash / zsh, muutama lisäominaisuus, esimerkiksi voit kirjoittaa [[ -L $file && -f $file ]] testataksesi, onko tiedosto symbolinen linkki tavalliseen tiedostoon, kun taas yksittäiset suluissa vaaditaan [ -L "$file" ] && [ -f "$file" ]. Katso Miksi parametrin laajentaminen välilyönteillä ilman lainausmerkkejä toimii kaksoissulkeissa [[mutta ei yksittäisiä hakasulkeita [? ] saadaksesi lisätietoja tästä aiheesta.

Kuoressa jokainen komento on ehdollinen komento: jokaisella komennolla on palautustila, joka on joko 0, joka osoittaa onnistumisen, tai kokonaisluku välillä 1 ja 255 (ja mahdollisesti enemmän joissakin kuorissa), joka osoittaa epäonnistuminen. [ … ] -komento (tai [[ … ]] syntaksimuoto) on erityinen komento, joka voidaan myös kirjoittaa test … ja onnistuu, kun tiedosto on olemassa, tai kun merkkijono ei ole tyhjä, tai kun numero on pienempi kuin toinen, jne. ((…)) -syntaksimuoto onnistuu, kun numero ei ole nolla .Tässä on muutama esimerkki komentosarjan ehdollisista:

  • Testaa, sisältääkö myfile merkkijono hello:

    if grep -q hello myfile; then … 
  • Jos mydir on hakemisto, vaihda se ja tee asioita:

    if cd mydir; then echo "Creating mydir/myfile" echo "some content" >myfile else echo >&2 "Fatal error. This script requires mydir to exist." fi 
  • Testaa, onko tiedostoa nimeltä myfile nykyisessä hakemistossa:

    if [ -e myfile ]; then … 
  • Sama, mutta myös riippuvia symbolisia linkkejä:

    if [ -e myfile ] || [ -L myfile ]; then … 
  • Testaa, onko x -arvon (jonka oletetaan olevan numeerinen) arvo vähintään 2, kannettavasti:

    if [ "$x" -ge 2 ]; then … 
  • Testaa, onko x -arvon (jonka oletetaan olevan numeerinen) on vähintään 2, muodossa bash / ksh / zsh:

    if ((x >= 2)); then … 

kommentit

  • Huomaa, että yksi haarukointi tukee -a -tunnusta &&, joten voidaan kirjoittaa: [ -L $file -a -f $file ], joka on sama määrä merkkejä sulkeissa ilman ylimääräisiä [ ja ]
  • @AlexisWilke Operaattorit -a ja -o ovat ongelmallinen, koska ne voivat johtaa virheellisiin jäsentämiseen, jos jotkut mukana olevista operandeista näyttävät operaattoreilta. Että ’ s miksi en mainitse niitä: heillä ei ole etua ja don ’ ei aina toimi. Älä koskaan kirjoita noteeraamattomia muuttujien laajennuksia ilman syytä: [[ -L $file -a -f $file ]] on hieno, mutta yksittäisillä suluilla tarvitset [ -L "$file" -a -f "$file" ] (mikä on ok, esim. div id = ”fbec67d83e”>

alkaa aina/tai./).

  • Huomaa, että se ’ s [[ -L $file && -f $file ]] (ei -a [[...]] -vaihtoehto).
  • Vastaa

    [ vs [[

    Tämä vastaus kattaa [ vs [[ kysymyksen osajoukko.

    Joitakin eroja Bash 4.3.11:

    • POSIX vs Bash -laajennus:

    • säännöllinen komento vs. taika

      • [ on vain tavallinen komento, jolla on outo nimi.

        ] on vain viimeinen argumentti [.

      Ubuntu 16.04: lla on itse asiassa suoritettava tiedosto osoitteessa /usr/bin/[, jonka tarjoaa coreutils , mutta bashin sisäänrakennettu versio on etusijalla.

      Mitään ei muuteta tavalla, jolla Bash jäsentää komennon.

      Erityisesti < on uudelleenohjaus, && ja || yhdistää useita komentoja, ( ) tuottaa alikuoret, ellei \ vältty, ja sanojen laajentaminen tapahtuu tavalliseen tapaan. yksittäinen rakenne, joka tekee X: n jäsentämisen maagisesti. <, &&, || ja () käsitellään erityisesti, ja sananjakosäännöt ovat erilaiset.

      On myös muita eroja, kuten = ja =~ .

    Bashese: [ on sisäänrakennettu komento ja [[ on avainsana: https://askubuntu.com/questions/445749/whats-the-difference-between-shell-builtin-and-shell-keyword

  • <

  • iv && ja ||

    • [[ a = a && b = b ]]: tosi, looginen ja
    • [ a = a && b = b ]: syntaksivirhe, && jäsennetty AND-komennon erottajana cmd1 && cmd2
    • [ a = a ] && [ b = b ]: luotettava POSIX-vastaava
    • [ a = a -a b = b ]: melkein vastaava, mutta POSIX hylkäsi sen, koska se on hullua ja epäonnistuu joidenkin a – tai b -arvojen kuten ! tai ( joka tulkitaan loogisiksi operaatioiksi
  • (

    • [[ (a = a || a = b) && a = b ]]: väärä. Ilman ( ) olisi totta, koska [[ && ]] on suurempi etusija kuin [[ || ]]
    • [ ( a = a ) ]: syntaksivirhe, () tulkitaan alikuoreksi
    • [ \( a = a -o a = b \) -a a = b ]: vastaava, mutta (), -a ja -o on vanhentunut kirjoittanut POSIX. Ilman \( \) olisi totta, koska -a on tärkeämpi kuin -o
    • { [ a = a ] || [ a = b ]; } && [ a = b ] ei-poistettu POSIX-vastaava. Tässä nimenomaisessa tapauksessa olisimme voineet kirjoittaa vain: [ a = a ] || [ a = b ] && [ a = b ], koska || ja && kuorioperaattoreilla on sama etusija kuin toisin kuin [[ || ]] ja [[ && ]] ja -o, -a ja [
  • sananjako ja tiedostonimen luominen laajennusten yhteydessä (split + glob )

    • x="a b"; [[ $x = "a b" ]]: true, lainausmerkkejä ei tarvita
    • x="a b"; [ $x = "a b" ]: syntakse virhe, laajenee [ a b = "a b" ]
    • x="*"; [ $x = "a b" ]: syntaksivirhe, jos nykyisessä hakemistossa on enemmän kuin yksi tiedosto .
    • x="a b"; [ "$x" = "a b" ]: POSIX-vastaava
  • =

    • [[ ab = a? ]]: true, koska se vastaa mallia ( * ? [ ovat maagisia). Ei laajene kohtaan f kuvat nykyisessä hakemistossa.
    • [ ab = a? ]: a? glob laajenee. Joten voi olla totta tai väärää nykyisessä hakemistossa olevista tiedostoista riippuen.
    • [ ab = a\? ]: väärä, ei globaalia laajennusta
    • = ja == ovat samat sekä [ että [[, mutta == on Bash-laajennus.
    • case ab in (a?) echo match; esac: POSIX-vastaava
    • [[ ab =~ "ab?" ]]: false, menettää taikuuden "" kanssa Bash 3.2: ssa ja uudemmissa ja edellyttäen, että yhteensopivuus bash 3.1: n kanssa ei ole käytössä (kuten BASH_COMPAT=3.1)
    • [[ ab? =~ "ab?" ]]: totta
  • =~

    • [[ ab =~ ab? ]]: true, POSIX laajennettu säännöllinen lauseke vastaa, ? ei laajene globaalisti
    • [ a =~ a ]: syntaksivirhe. Ei bash-vastaavuutta.
    • printf "ab\n" | grep -Eq "ab?": POSIX-vastaavuus (vain yhden rivin tiedot)
    • awk "BEGIN{exit !(ARGV[1] ~ ARGV[2])}" ab "ab?": POSIX-vastaava.
  • Suositus: käytä aina []

    Jokaiselle [[ ]] rakenteelle, jonka olen nähnyt, on POSIX-ekvivalentteja.

    Jos käytät [[ ]] sinua:

    • menetät siirrettävyyden
    • pakota lukija oppimaan toisen bash-laajennuksen yksityiskohdat. [ on vain tavallinen komento, jolla on outo nimi, eikä mitään erityistä semantiikkaa ole mukana.

    Kiitos Stéphane Chazelas tärkeistä korjauksista ja lisäyksistä.

    Kommentit

    • @St é phaneChazelas kiitos tiedoista! Olen ’ lisännyt expr vastaukseen. Termi ” Bash ex jännityksen ” ei ole tarkoitettu tarkoittavan, että Bash oli ensimmäinen kuori, joka lisäsi syntaksin, POSIX sh vs Bashin oppiminen riittää jo hulluksi.
    • Katso man test jos yritit man [ ja eksyit. Se selittää POSIX-muunnelman.
    • Korjaus: ] on argumentti komennolle [, mutta se ei ’ älä estä uusien argumenttien käyttöä. ] on oltava viimeinen argumentti [, mutta se voi esiintyä myös testilausekkeen osana. Esimerkiksi if [ "$foo" = ] ]; then testaa, onko muuttujan foo arvoksi asetettu ”] ” (kuten if [ ] = "$foo" ]; then).
    • kiitos @GordonDavisson, en ’ ei tiedä sitä, kiinteä.
    • @ tgm1024 – Monica kohteli kyllä, se on myös pätevä huomio.

    Vastaa

    bashin ohjeista :

    (list) -luettelo suoritetaan alikuoren ympäristössä (katso alla KÄYTTÖÖNOTTOYMPÄRISTÖ). Muuttuvat määritykset ja sisäänrakennetut komennot, jotka vaikuttavat kuoren ympäristöön, eivät ole voimassa komennon valmistuttua. Palautustila on luettelon poistumistila.

    Toisin sanoen varmista, että kaikella, mitä ”listassa” tapahtuu (kuten cd), ei ole vaikutusta (: n ja ). Ainoa vuotava asia on viimeisen komennon poistumiskoodi tai set -e ensimmäinen virheilmoituksen tuottava komento (muu kuin muutama, kuten if, while jne.)

    ((expression)) Lauseke arvioidaan alla aritmeettisen arvioinnin alla kuvattujen sääntöjen mukaisesti. Jos lausekkeen arvo ei ole nolla, palautustila on 0; muuten palautustila on 1. Tämä vastaa tarkalleen ” -lauseketta ”.

    Tämä on bash-laajennus, jonka avulla voit tehdä matematiikkaa. Tämä on jonkin verran samanlainen kuin expr -toiminnon käyttö ilman kaikkia expr -rajoituksia (kuten tilojen pitäminen kaikkialla, pakeneminen * jne.)

    [[ expression ]] Palauta tila 0 tai 1 riippuen ehdollisen lausekkeen ilmentymisen arviointi. Lausekkeet koostuvat alkuosista, jotka on kuvattu jäljempänä EHDOLLISET ILMOITUKSET -kohdassa. Sanojen jakamista ja polunimen laajentamista ei suoriteta sanojen [[ja]] välillä; Tilde-laajennus, parametrien ja muuttujien laajennus, aritmeettinen laajennus, komentojen korvaaminen, prosessin korvaaminen ja lainausten poisto suoritetaan. Ehdollisia operaattoreita, kuten -f, ei saa lainata, jotta ne tunnistetaan ensisijaisiksi.

    Kun sitä käytetään [[: n kanssa, < ja > -operaattorit lajittelevat leksikografisesti nykyistä aluetta.

    Tämä tarjoaa edistyneen testin merkkijonojen, numeroiden ja tiedostojen vertailemiseksi vähän kuten test tarjoaa, mutta tehokkaampaa.

    [ expr ] Palauta tila 0 (tosi) tai 1 (väärä) ehdollisen lausekkeen lausekkeen arvion mukaan. Jokaisen operaattorin ja operaattorin on oltava erillinen argumentti. Lausekkeet koostuvat pääolosuhteista, jotka on kuvattu yllä EHDOLLINEN ILMOITUS. test ei hyväksy mitään vaihtoehtoja eikä hyväksy ja sivuuttaa argumenttia – merkitsevän vaihtoehtojen loppua.

    […]

    Tämä kutsuu test. Itse asiassa vanhoina aikoina [ oli symbolinen linkki osoitteeseen test. Se toimii samalla tavalla ja sinulla on samat rajoitukset. Koska binaari tietää nimen, jolla se aloitettiin, testiohjelma tietää, milloin se aloitettiin nimellä [, ja se voi jättää huomiotta sen viimeisen parametrin, jonka oletetaan olevan ]. Hauskoja Unix-temppuja.

    Huomaa, että bash, [ ja test ovat sisäänrakennettuja toimintoja (kuten kommentissa mainitaan), mutta melkein samat rajoitukset ovat voimassa.

    Kommentit

    • Vaikka test ja [ ovat tietysti sisäänrakennettuja komentoja Bashissa, mutta ’ on todennäköistä, että myös ulkoinen binääri on olemassa.
    • [: n ulkoinen binääri ei ole symbolinen linkki test -palveluun useimmissa nykyaikaisissa järjestelmissä. .
    • Minusta jotenkin tuntuu huvittavalta, että he vaivautuvat luomaan kaksi erillistä binääriä, joilla molemmilla on juuri tarvitsemansa, sen sijaan, että vain yhdistettäisiin ja lisätään pari ehdollista. Vaikka itse asiassa strings /usr/bin/test osoittaa, että siinä on myös ohjeteksti, en tiedä mitä sanoa.
    • @ Random832 saan mielipiteesi GNU: n perusteluista välttääksesi odottamattoman arg0-käyttäytymisen, mutta POSIX-vaatimuksista, en olisi ’ en ole niin myöntävä. Vaikka standardin mukaan test -komennon on ilmeisesti oltava olemassa itsenäisenä tiedostopohjaisena komennona, mikään siinä ei kerro sen [ -muunnosta. myös tällä tavoin. Esimerkiksi Solaris 11 ei tarjoa ’ ei mitään [ suoritettavaa tiedostoa, mutta on kuitenkin täysin POSIX-standardien mukainen
    • (exit 1) vaikuttaa sulkeiden ulkopuolella.

    Vastaa

    Joitakin esimerkkejä:

    Perinteinen testi:

    foo="some thing" # check if value of foo is not empty if [ -n "$foo" ] ; then... if test -n "$foo" ; then... 

    test ja [ ovat komentoja kuten kaikki muutkin, joten muuttuja jaetaan sanoiksi, ellei se ole lainausmerkeissä.

    Uuden tyylinen testi

    [[ ... ]] on (uudempi) erityinen kuorirakenne, joka toimii hieman eri tavalla, ilmeisin asia on, että se ei ”t-split-muuttujia:

    if [[ -n $foo ]] ; then... 

    Jotkut dokumentaatio [ ja [[ täällä .

    Aritmeettinen testi:

    foo=12 bar=3 if (( $foo + $bar == 15 )) ; then ... 

    ”Normaali ”komennot:

    Kaikki yllä olevat toimivat normaalien komentojen tavoin, ja if voi ottaa minkä tahansa komennon:

    # grep returns true if it finds something if grep pattern file ; then ... 

    Useita komentoja:

    Tai voimme käyttää useita komentoja. Käärimällä joukko komentoja ( ... ) suoritetaan ne alikuoressa ja luodaan väliaikainen kopio kuoren tilasta (työkansio, muuttujat). Jos tarvitsemme suorittaa jokin ohjelma väliaikaisesti toisessa hakemistossa:

    # this will move to $somedir only for the duration of the subshell if ( cd $somedir ; some_test ) ; then ... # while here, the rest of the script will see the new working # directory, even after the test if cd $somedir ; some_test ; then ... 

    Vastaa

    Ryhmittelykomennot

    Bash tarjoaa kaksi tapaa ryhmitellä luettelo yksiköinä suoritettavista komennoista.

    ( list ) Komennoluettelon sijoittaminen sulkeiden väliin aiheuttaa alikuoren ympäristön luomisen ja kaikkien luettelon komentojen suorittamisen kyseisessä alikuoressa. Koska luettelo on alikuoressa suoritetut muuttujien määritykset eivät jää voimaan alikuoren valmistumisen jälkeen.

    $ a=1; (a=2; echo "inside: a=$a"); echo "outside: a=$a" inside: a=2 outside: a=1 

    { list; } kiharoiden aaltosulkeiden välisten komentojen luettelo aiheuttaa luettelon suorittamisen nykyisessä komentotulkkiyhteydessä ”>

    . Alikuorta ei luoda. Seuraava puolipiste (tai uusi viiva) vaaditaan. Lähde

    ${} Parameter expansion Ex: ANIMAL=duck; echo One $ANIMAL, two ${ANIMAL}s $() Command substitution Ex: result=$(COMMAND) $(()) Arithmetic expansion Ex: var=$(( 20 + 5 )) 

    Ehdolliset rakenteet

    Yksittäinen haaroitus ie []
    Vertailun vuoksi ==, !=, <, ja > ja niitä tulisi käyttää ja numeeriseen vertailuun eq, ne,lt ja gt tulisi käyttää.

    Parannetut suluet ie [[]]

    Kaikissa yllä olevissa esimerkeissä käytimme ehdollisen lausekkeen liitteenä vain yksittäisiä sulkeita, mutta bash sallii kaksoissulkeet, jotka toimivat yhden haarukon syntaksin parannettuna versiona.

    Vertailun vuoksi ==, !=, <, ja > voivat käyttää kirjaimellisesti.

    • [ on testikomennon synonyymi. Vaikka se olisi sisäänrakennettu kuoreen, se luo uuden prosessin.
    • [[ on sen uusi parannettu versio, joka on avainsana, ei ohjelma. .
    • [[ ymmärretään Korn ja Bash.

    Lähde

    Vastaa

    Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *