if ehdon testaaminen tuottaa virheen

Anonyymi

Mitenhän tämä pitäisi tehdä, kun komennolle voidaan antaa useampi parametri, ja yhtä niistä pitäisi testata ja toimia sen mukaan mikä parametrin sisältö on.

if [ $1 = "chromiun-browoser" ];
then
set "chromium-browser"
fi

if [ $2 = "chromiun-browoser" ];
then
set "chromium-browser"
fi

Tuossa toisen ( if ) testin tuloksena tulee virhe, ellei komennon saatteeksi annettukaan toista parametria. Kuvitellaan nyt vaikka että on kyseessä ( whereis ) komennon suomentaminen, ja kun whereis -komento sisältää ainakin -b valitsimen jolla pyydetään vain binaari tiedoston sijaintia, eli näin

missä -b chromiun-browoser

Tuo tulisi toimimaan oikein, kun missä komennolle annetaan 2 parametria, mutta tästä alla olevasta tuleekin jo virhe:

missä chromiun-browoser

Miten tämä testi tulisi tehdä oikein?

17

102

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Anonyymi

      täällä ei saa neuvoa, kun siitä menee moderaattorille hiekkaa pimppiin, ja hän poistaa kaikki mitä ei ymmärrä (=kaiken). mutta $* on siis argumenttien välitys.

      • Anonyymi

        Aivan, tässä tapauksessa $1 sisältää joko arvon "chromiun-browoser" tai "-b"
        ja $2 on joko tyhjä tai "chromiun-browoser", joten kun if lauseella testataan tyhjää muuttujaan saadaan sillä virhe aikaan. Jollakin tavoin tuo testaaminen pitäisi hoitaa ilman virheitä. Sanottakoon vielä että "$@" taas sisältää sekä "$1" että "$2" arvon.


      • Anonyymi

        Aivan, suomi24 ei saa tuota moderointiaan kuntoon ikinä, se tulee olemaan ainainen kiusa. Jakun ne vielä syyttää käyttäjää sääntöjen rikkomisesta, vaikka vika on heissä itsessään. Tämä on tahallista kiusantekoa suomi24 ylläpidolta.


      • Anonyymi
        Anonyymi kirjoitti:

        Aivan, suomi24 ei saa tuota moderointiaan kuntoon ikinä, se tulee olemaan ainainen kiusa. Jakun ne vielä syyttää käyttäjää sääntöjen rikkomisesta, vaikka vika on heissä itsessään. Tämä on tahallista kiusantekoa suomi24 ylläpidolta.

        mäkin oon siirtynyt ylilaudalle lähes kokonaan. tänne viimeksi kirjoittanut joskus kuukausi sitten, nyt kokeilin tuon neuvon laittaa, niin tokihan siitä moden pimpsa hiekottui.
        ei ihme, että täällä väki vähenee ja ylilaudalla lisääntyy.


      • Anonyymi

        Miksi sotket kun et osaa?


    • Anonyymi

      Parametrien parserointi skriptissä kannattaa tehdä getopts:n avulla etenkin sillon, jos halutaan että parametrejä voi antaa missä järjestyksessä tahansa, sillon kun kaikkia parametrejä ei ole aina pakko antaa ja sillon kun joillekin parametreille voi antaa arvon. Ylipäätänsä, jos skriptistä halutaan asiallisemman oloinen niin getopts:n käyttö on hyvä idea. Tässä on pätkä yhdestä omasta skriptistäni, jota toki voisi vielä parannella. En tässä tarkemmin selitä skriptin tarkotusta, mutta jokatapauksessa tästä pätkästä näkyy kuinka parametreja voi parseroida. Tuossa parametreille -f ja -m voi antaa arvon, joka on luettavissa muuttujasta OPTARG
      getopts:n avulla voi tehdä skriptejä, joille voi antaa parametrejä kuten -f , mutta getopts ei tue parametrien antamista muodossa --file jne. Jos halutaan mahdollisuus käyttää esim optiota --file niin sillon parserointi pitää tehdä toisin.


      if [ $# -eq 0 ]
      then
      echo "$0: missing operand"
      echo "Try '$0 --help' for more information."
      exit 1
      fi

      # Initialize internal variables
      SCANNER_OPTIONS=""
      FILE="false"
      SHOW_DIALOG="false"
      SHOW_NOTIFICATION="false"


      # Parse command line options
      while getopts "df:hm:nr" OPTION; do
      case $OPTION in
      d)
      SHOW_DIALOG="true"
      ;;
      f)
      FILE="true"
      SCANNER_OPTIONS="$SCANNER_OPTIONS -f $OPTARG"
      ;;
      h)
      show_help
      exit 0
      ;;
      m)
      SCANNER_OPTIONS="$SCANNER_OPTIONS -m $OPTARG"
      ;;
      n)
      SHOW_NOTIFICATION="true"
      ;;
      r)
      SCANNER_OPTIONS="$SCANNER_OPTIONS -r"
      ;;
      \?)
      exit 1
      ;;
      esac
      done


      T. miksuh

      • Anonyymi

        Nyt tuli niin paljon tekstiä koodin muodossa että otin *.PDF kopion, siltä varalta että poistavat tapansa mukaan. Kirjoitin tämän että viesti on saatu ja syvennyn siihen mitä se pitää sisällään.


      • Anonyymi

        Niin ja lisään vielä sen, että getopts mahdollistaa toki sen, että skriptille voidaan antaa parametina jotain tekstiä jne muutenkin kuin jonkinesim -f parametrin arvona. Eli toki voidaan tehdä skripti, jota voi käyttää näillä vaihtoehtoisilla tavoilla:

        skripti tiedoston_nimi
        skripti -f tiedoston_nimi


        Kannattaa lukea netistä enempi ohjeita getopts liittyen.

        T. miksuh


      • Anonyymi

        T. miksuh
        Joo, kyllä varmaan getopts ja case tämän ratkaisee, mutta tuntuu vain raskaalta ratkaisulta. Siinä tapauksessa ettei ( if ) lauseella asiaa saada ratkaistuksi, on kai tähän mentävä. Odotan vielä mahdollisia vastauksia lisää.


      • Anonyymi
        Anonyymi kirjoitti:

        T. miksuh
        Joo, kyllä varmaan getopts ja case tämän ratkaisee, mutta tuntuu vain raskaalta ratkaisulta. Siinä tapauksessa ettei ( if ) lauseella asiaa saada ratkaistuksi, on kai tähän mentävä. Odotan vielä mahdollisia vastauksia lisää.

        No voithan toki tarkistaa kuinka monta parametriä skriptille annettiin ja toimia sen mukaan. Tuossa mun antamassani esimerkissä tarkistetaan aivan ekana skriptille annettujen parametrien määrä ja jos skriptille ei annettu parametrejä, niin sitten kerrotaan käyttäjälle, että skripti odottaa saavansa jotain parametreja ja neuvotaan käyttämään parametriä -h avun saamiseksi.

        Eli muuttuja $# sisältää aina skriptille annettujen parametrien lukumäärän. Jos lukumäärä on suurempi kuin 1 voit sitten tarkistaa sekä muuttujan $1 että $2 sisällön. Eli jos parametreja annettiin enemmän kuin 1 tarkista onko $1 arvona esim "-b" ja $2 arvona esim "chromium-browser". Jos parametreja annettiin vain yksi tarkista silloin vain muuttujan $1 arvo.

        T. miksuh


      • Anonyymi
        Anonyymi kirjoitti:

        No voithan toki tarkistaa kuinka monta parametriä skriptille annettiin ja toimia sen mukaan. Tuossa mun antamassani esimerkissä tarkistetaan aivan ekana skriptille annettujen parametrien määrä ja jos skriptille ei annettu parametrejä, niin sitten kerrotaan käyttäjälle, että skripti odottaa saavansa jotain parametreja ja neuvotaan käyttämään parametriä -h avun saamiseksi.

        Eli muuttuja $# sisältää aina skriptille annettujen parametrien lukumäärän. Jos lukumäärä on suurempi kuin 1 voit sitten tarkistaa sekä muuttujan $1 että $2 sisällön. Eli jos parametreja annettiin enemmän kuin 1 tarkista onko $1 arvona esim "-b" ja $2 arvona esim "chromium-browser". Jos parametreja annettiin vain yksi tarkista silloin vain muuttujan $1 arvo.

        T. miksuh

        Hetkinen, tässä se ratkaisu taitaa olla, testaamaan menin.


      • Anonyymi
        Anonyymi kirjoitti:

        No voithan toki tarkistaa kuinka monta parametriä skriptille annettiin ja toimia sen mukaan. Tuossa mun antamassani esimerkissä tarkistetaan aivan ekana skriptille annettujen parametrien määrä ja jos skriptille ei annettu parametrejä, niin sitten kerrotaan käyttäjälle, että skripti odottaa saavansa jotain parametreja ja neuvotaan käyttämään parametriä -h avun saamiseksi.

        Eli muuttuja $# sisältää aina skriptille annettujen parametrien lukumäärän. Jos lukumäärä on suurempi kuin 1 voit sitten tarkistaa sekä muuttujan $1 että $2 sisällön. Eli jos parametreja annettiin enemmän kuin 1 tarkista onko $1 arvona esim "-b" ja $2 arvona esim "chromium-browser". Jos parametreja annettiin vain yksi tarkista silloin vain muuttujan $1 arvo.

        T. miksuh

        Ja siinä se oli, 3 lisä rivi siitä tuli, ja se on hyvä, Kiitos.


    • Anonyymi

      Muistaakseni siellä ei saa olla ylimääräisä välilyöntejä ($1 = jotain vs $1=jotain).

      • Anonyymi

        Näin on, välilyönti muuttuja määrittelyssä näin: ( a = "terve" ) tuottaa virheilmoituksen ( a: komentoa ei löytynyt ).


    • Anonyymi

      Niin lisään vielä sen, että jos skriptille annettiin kaksi parametria, niin sillon tietenkin pitää ensin testata onko muuttujan $1 arvo esimerkiksi "-b" minkä jälkeen toimitaan sen mukaan oliko se vai ei. Jos muuttujan $1 arvo oli esim haluttu "-b" niin sillon testataan seuraavaksi mikä skriptille annetun toisen parametrin sisältävänmuuttujan $2 arvo on. Eli voit laittaa muuttujan $2 testaavan if-lauseen muuttujan $1 testaavan if-lauseen sisälle. Eli voit käyttää sisäkkäisiä if-lauseita, jollon sisempi if-lause suoritetaan vain, jos ulomman if-lauseen ehtolauseen arvo on tosi.

      Itse olen kyllä sitä mieltä, että jos skriptillä on vähänkään enemmän mahdollisia parametreja, joita käyttäjä voi skriptille antaa, niin skriptin parametien parseroinnista if-lauseiden avulla tulee äkkiä sotkuista ja sekavaa. Sillon on paljon parempi käyttää getopts:a, jonka avulla skriptistä tulee siistimpi, asiallisempi ja joustavampi käyttäjän kannalta. Järkevän skriptin tulisi ottaa huomioon sekin, että käyttäjä saattaa antaa parametrit periaatteessa missä järjestyksessä ahansa. Eli esimerkiksi kumpi tahansa näistä:

      skripti -a -b
      skripti -b -a


      T. miksuh

    Ketjusta on poistettu 1 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Ja taas ammuttu kokkolassa

      Kokkolaisilta pitäisi kerätä pois kaikki ampumaset, keittiöveitset ja kaikki mikä vähänkään paukku ja on terävä.
      Kokkola
      57
      5479
    2. Mitä siellä ABC on tapahtunut

      Tavallista isompi operaatio näkyy olevan kyseessä.
      Alajärvi
      93
      4327
    3. Helena Koivu on äiti

      Mitä hyötyä on Mikko Koivulla kohdella LASTENSA äitiä huonosti . Vie lapset tutuista ympyröistä pois . Lasten kodista.
      Kotimaiset julkkisjuorut
      375
      2574
    4. Ovatko naiset lopettaneet sen vähäisenkin vaivannäön Tinderissa?

      Meinaan vaan profiileja selatessa nykyään valtaosalla ei ole minkäänlaista kirjoitettua tekstiä siellä. Juuri ja juuri s
      Nettideittailu
      71
      1088
    5. Suomi vietiin Natoon väärin perustein. Viides artikla on hölynpölyä. Yksin jäämme.

      Kuka vielä uskoo, että viides artikla takaa Suomelle avun, jos Suomeen hyökätään. Liikuttavasti täällä on uskottu ja ved
      Maailman menoa
      330
      1038
    6. Et ilmeisesti aio enää ikinä olla tekemisissä

      Että näinkö se menee
      Ikävä
      61
      843
    7. Sydämeni on sinun luona

      Koko ajan. Oli ympärilläni ketä oli niin sinä olet vain ajatuksissa ja tunteissa. En halua muiden kosketusta kuin sinun
      Ikävä
      46
      816
    8. Kuvaile elämäsi naista

      Millainen hän on? Mikä tekee hänestä sinulle erityisen?
      Ikävä
      28
      813
    9. Trump ja Venäjä

      Huomasitteko muuten... Käytännössä ainoat valtiot, joille Trump EI eilen asettanut typeriä tariffejaan, olivat Venäjä ja
      Maailman menoa
      102
      789
    10. Jatkuva stressitila

      On sinun vuoksesi kun en tiedä missä mennään mutta tunteeni tiedän ainoastaan
      Ikävä
      52
      779
    Aihe