Sisäkkäiset If-lauseet Shell-skriptissä

Pahoittelut, jos asiani on jo kysytty muissa viesteissä, mutta en löytänyt yhtään. Kirjoitan pieni shell-komentosarja, joka vaatii minua kirjoittamaan sisäkkäisen if-lauseen. En ole varma, että teen sen oikein. Minulla ei ole virheitä, mutta ohjelma ei toimi odotetulla tavalla. Haluan: Jos tiedosto on jo kohdassa MasterFile.txt, käyttäjällä on mahdollisuus joko ottaa toinen tietojoukko sanomalla y tai Y, tai sano n tai N ohjelman lopettamiseksi. Ongelma: Skripti ei lopu . Jos tiedostoa ei ole kohdassa MasterFile.txt, ota tietojoukko. Tässä on koodi:

if grep -q "dicounter_${string1}_from_${string2}" MasterFile.txt; then { echo "dicounter_${string1}_from_${string2} already exists in the MasterFile. Would you like to proceed?" read string3 if "${string3}" = "Y" || "${string3}" = "y"; then { screen -S trans -L /dev/ttyACM0 screen -S trans -X stuff "s"$(echo -ne "\015") sleep 8s screen -S trans -X quit } else{return} fi else{ #opening screen & begin analysis screen -S trans -L /dev/ttyACM0 screen -S trans -X stuff "s"$(echo -ne "\015") sleep 8s screen -S trans -X quit } fi 

Kommentit

  • Hmm … mikä kuori tämä on? sh -tyyppiset kuoret eivät ' käytä { ... } lohkoihin.
  • Uskon sen bash. Ohjelma toimi hienosti vain yhdellä if-lauseella. En mielestäni ' usko, että {...} on ongelma. Sisäkkäisen if
  • toteutustavassa on oltava jotain vikaa. Saan nyt virheen, jonka mukaan viimeisessä -lauseke
  • @Kusalananda, voit käyttää niitä komentojen ryhmittelyyn sekä siellä että muualla …
  • @Ptheguy if "${string3}" = 'Y' ottaa komentojen string3 sisällön komennon nimeksi ja suorittaa sen kahdella argumentilla = ja Y

Vastaa

Nopea palautus kirjoita tavallisemmalla syntaksilla:

if grep -q "dicounter_${string1}_from_${string2}" MasterFile.txt; then echo "dicounter_${string1}_from_${string2} already exists in the MasterFile. Would you like to proceed?" read string3 if [[ "${string3^}" == "Y" ]]; then screen -S trans -L /dev/ttyACM0 screen -S trans -X stuff "s"$(echo -ne "\015") sleep 8s screen -S trans -X quit else exit 0 fi else #opening screen & begin analysis screen -S trans -L /dev/ttyACM0 screen -S trans -X stuff "s"$(echo -ne "\015") sleep 8s screen -S trans -X quit fi 

Sinulla ei näytä olevan mitään tässä ilmoitettuja toimintoja, joten return ei kelpaa tähän käyttötapaukseen. Oletan, että ei-myöntävä vastaus kysyttyyn kysymykseen on tarkoitettu keskeyttämään koko komentosarja, minkä vuoksi exit käytetään.

Rakenne ${variable^} pakottaa $variable, jos kirjain, ensimmäisen merkin isoksi, mikä yksinkertaistaa vastaustarkistusta.

Kommentit

  • Joten kaksi asiaa: yksi, jos kirjoitan y, se lopetetaan, ja riippumatta siitä, mitä kirjoitan, saan seuraava virhe ./test/sh: line19: [[variable: command not found
  • varmista, että komentosarjan ensimmäinen rivi on #!/bin/bash eikä #!/bin/sh. [[ [...] ]] -konstruktit ovat bash ism.
  • kyllä, otsikko on oikea
  • Ja sinulla on välilyönti [[ ja "${string3^}"?
  • Siinä kaikki! Kiitos vielä kerran. Jos sinulla on aikaa, opetatko minulle, mitä [[ tarkoittaa ja miksi välilyönti voi olla niin tärkeä?

Vastaa

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