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
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[[ [...] ]]
tobash
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?
sh
-type shells nie ' nie używaj{ ... }
dla bloków.{...}
jest problemem. Coś musi być nie tak ze sposobem, w jaki zaimplementowałem zagnieżdżoneif
else
instrukcjaif "${string3}" = 'Y'
przyjmuje zawartośćstring3
jako nazwę polecenia i uruchamia je z dwoma argumentami=
iY
…