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

109

    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. Kanki kovana; ei tiedä pornovideoista mitään

      Kaikkosen erityis­avustajan asunnossa kuvattiin pornoa. Väittää ettei tiedä asiasta yhtään mitään. https://www.is.fi/po
      Maailman menoa
      121
      6040
    2. Halaisin sua mies

      Jos voisin 💗
      Ikävä
      29
      2120
    3. Onkohan meillä kummallakin joku pakkomielle toisiimme

      Vähän luulen että on..
      Ikävä
      177
      1952
    4. Mitä tämä on

      Ajatella, olen viimeksi nähnyt sinua melkein vuosi sitten ohimennen. Ja silloinkin sinä välttelit minua. En ole kuullut
      Tunteet
      10
      1133
    5. Ei monet elä kuin alle 60 v, mikä vaikuttaa?

      gulp, gulp.. Juice Leskinen eli 56 vuotta. Matti Nykänen eli 55 vuotta. Topi Sorsakoski eli 58 vuotta.
      Maailman menoa
      66
      1114
    6. Olen valmis

      Kohtaamaan sinut tänä kesänä, jos sellainen sattuma osuu kohdalleni.
      Ikävä
      73
      997
    7. Hyvää yötä kaivatulleni

      En pysty tekemään kokemaan mitään sielussa tuntuvaa, syvää, vaikuttavaa, ilman että rinnastan sen sinuun. Niin kävi tänä
      Tunteet
      24
      997
    8. Nyt on konstit vähänä.

      Nimittäin tuulivoiman vastustajilla, kun pitää perättömiä ilmiantoja tehdä. Alkaa olla koko vastustajien sakki leimattu,
      Kiuruvesi
      24
      902
    9. Tilinpäätösvaltuusto 27.5

      Samalla viimeinen kokous ennen uudenvaltuustokauden alkamista. Vanhat antavat itselleen erinomaiset arvosanat, ja siirty
      Pyhäjärvi
      42
      897
    10. Hevoset ajoteillä Karhulanvaaralla

      Minkä ihmeen takia osaamattomat ihmiset tuovat hevosia ajoteille ja pyöräteille? Eilen oli kolari lähellä tämän takia. I
      Suomussalmi
      12
      765
    Aihe