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
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 ovatbash
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ä?
sh
-tyyppiset kuoret eivät ' käytä{ ... }
lohkoihin.{...}
on ongelma. Sisäkkäisenif
if "${string3}" = 'Y'
ottaa komentojenstring3
sisällön komennon nimeksi ja suorittaa sen kahdella argumentilla=
jaY
…