Jeg beklager om problemet mitt allerede er blitt spurt i andre innlegg, men jeg kunne ikke finne noen. Jeg skriver et lite skallskript som krever at jeg skriver en nestet if-setning. Jeg er ikke helt sikker på at jeg gjør det riktig. Jeg får ingen feil, men programmet fungerer ikke slik jeg forventer det. Det jeg vil ha er: Hvis filen allerede er i MasterFile.txt
, har brukeren muligheten til å enten ta et nytt datasett ved å si y
eller Y
, eller si n
eller N
for å avslutte programmet. Problem: Skriptet avsluttes ikke . Hvis filen ikke finnes i MasterFile.txt
, tar du datasettet. Her er koden:
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
Kommentarer
Svar
Et raskt svar skriv med mer konvensjonell syntaks:
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
Du ser ikke ut til å ha noen funksjoner deklarert her, så return
er ikke gyldig for denne brukssaken. Jeg antar at et ikke-bekreftende svar på det spurte spørsmålet ditt er ment å avbryte hele skriptet, derav bruk av exit
.
Konstruksjonen ${variable^}
vil tvinge det første tegnet i $variable
, hvis en bokstav, er store bokstaver, noe som forenkler responskontrollen.
Kommentarer
- Så to ting: en hvis jeg skriver inn
y
den avsluttes, og uansett hva jeg skriver inn, får jeg følgende feil./test/sh: line19: [[variable: command not found
- sørg for at første linje i skriptet er
#!/bin/bash
, og ikke#!/bin/sh
.[[ [...] ]]
konstruksjoner er enbash
ism. - ja, overskriften er riktig
- Og du har et mellomrom mellom
[[
og"${string3^}"
? - Det var det !! Takk igjen. Hvis du har tid, har du noe imot å lære meg hva
[[
betyr og hvorfor et mellomrom kan være så viktig?
sh
-type skall ikke ' t bruk{ ... }
for blokker.{...}
er problemet. Det må være noe galt med måten jeg implementerte den nestedeif
else
uttalelseif "${string3}" = 'Y'
tar innholdet avstring3
som navnet på en kommando, og kjører det med to argumenter=
ogY
…