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

73

    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. Onks sulle väliä, jos jokin kaivattusissa

      ei ole täydellistä? Esim. venytysmerkit, arvet, selluliitti, epäsymmetriset rinnat, vinot hampaat jne?
      Ikävä
      87
      4568
    2. Ei sinussa ollut miestä

      Selvittämään asioita vaan kipitit karkuun kuin pikkupoika.
      Ikävä
      127
      3998
    3. Shokkiyllätys! 31-vuotias Hai asuu vielä "kotona" - Anna-vaimon asenne ihmetyttää: "No ei tämä..."

      Hmmm, mitenhän sitä suhtautuisi, jos aviomies/aviovaimo asuisi edelleen lapsuudenperheensä kanssa? Tuore Ensitreffit-vai
      Ensitreffit alttarilla
      33
      2551
    4. Eikö Marin ollut oikeassa kokoomuksen ja persujen toiminnasta

      Ennen vaaleja Marin kertoi mitä kokoomus tulisi hallituksessa tekemään ja tietysti persut suostuu kaikkeen, mitä kokoomu
      Maailman menoa
      199
      1589
    5. Wiisaat Lappajärvellä iät.

      Nyt nimiä listaan menneistä ja nykyisistä Wiisaista Lappajärveläisistä. Itseäkin voi tuoda esille kaikessa Wiisaudessa.
      Lappajärvi
      12
      1296
    6. Missä Steffe hiihtää?

      Missä reppuli luuraa? Ei ole Seiskassa mitään sekoiluja ollut pariin viikkoon? Onko jo liian kylmä skulata tennistä ulko
      Kotimaiset julkkisjuorut
      22
      1253
    7. Olet elämäni rakkaus

      On ollut monia ihastumisia ja syviäkin tunteita eri naisia kohtaan, mutta sinä olet niistä kaikista ihmeellisin. Olet el
      Ikävä
      36
      1208
    8. Ratkaiseva tekijä kiinnostuksen heräämisessä

      Mikä tekee deittikumppanista kiinnostavan? Mitä piirrettä arvostat / et arvosta?
      Sinkut
      62
      1203
    9. Milloin nainen, milloin?

      Katselet ja tiedän, että myös mieli tekee. Voisit laittaa rohkeasti viestin. Tiedät, että odotan. Ehkä aika ei ole vielä
      Ikävä
      61
      1163
    10. Olen menettänyt yöunet kokonaan

      Nytkin vain tunnin nukkunut. En tiedä johtuuko se sinusta vai tästä palstasta. Olis mukava nähdä oikeasti eikä arvuutel
      Tunteet
      17
      1075
    Aihe