Zagnieżdżone instrukcje if w skrypcie powłoki

Przepraszam, jeśli mój problem został już zadany w innych postach, ale nie udało mi się znaleźć żadnego. Piszę mały skrypt powłoki, który wymaga ode mnie napisania zagnieżdżonej instrukcji if. Nie jestem pewien, czy robię to dobrze. Nie widzę żadnych błędów, ale program nie działa tak, jak tego oczekuję. Chcę: jeśli plik znajduje się już w MasterFile.txt, użytkownik może pobrać inny zestaw danych, mówiąc y lub Y albo powiedz n lub N, aby zakończyć program. Problem: skrypt nie kończy działania . Jeśli plik nie istnieje w MasterFile.txt, weź zestaw danych. Oto kod:

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 

Komentarze

  • Hm … co to za powłoka? sh -type shells nie ' nie używaj { ... } dla bloków.
  • Wierzę, że to bash. Program działał dobrze tylko z jedną instrukcją if. Nie ' nie sądzę, że {...} jest problemem. Coś musi być nie tak ze sposobem, w jaki zaimplementowałem zagnieżdżone if
  • Teraz pojawia się błąd, który mówi, że coś jest nie tak z ostatnim else instrukcja
  • @Kusalananda, cóż, możesz ich użyć do grupowania poleceń zarówno tam, jak i gdzie indziej …
  • @Ptheguy if "${string3}" = 'Y' przyjmuje zawartość string3 jako nazwę polecenia i uruchamia je z dwoma argumentami = i Y

Odpowiedź

Szybka re napisz przy użyciu bardziej konwencjonalnej składni:

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 

Wygląda na to, że nie ma tu zadeklarowanych funkcji, więc return nie dotyczy tego przypadku użycia. Zakładałem, że niepotwierdzająca odpowiedź na zadane pytanie ma na celu przerwanie całego skryptu, stąd użycie exit.

Konstrukcja ${variable^} wymusi, aby pierwszy znak $variable, jeśli jest literą, był wielką literą, co upraszcza sprawdzanie odpowiedzi.

Komentarze

  • Dwie rzeczy: jedna, jeśli wpiszę y, kończy działanie i niezależnie od tego, co wprowadzę, otrzymuję następujący błąd ./test/sh: line19: [[variable: command not found
  • upewnij się, że pierwsza linia skryptu to #!/bin/bash, a nie #!/bin/sh. Konstrukcje [[ [...] ]] to bash ism.
  • tak, nagłówek jest poprawny.
  • I masz spację między [[ a "${string3^}"?
  • To było to !! Dziękuję ponownie. Jeśli masz czas, czy możesz mnie nauczyć, co oznacza [[ i dlaczego przestrzeń może być tak ważna?

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *