W skrypcie poniżej - który zachęca użytkownika do potwierdzenia, że chce kontynuować uruchamianie potencjalnie złego skryptu - gdy użytkownik wejdzie Y
na monit - wyłamie się z case
bloku, ale zostanie ponownie wysłany z powrotem do while
pętli.
#! /bin/bash
set -e
echo
echo "bad install start"
echo "-----------------------------------------"
while true; do
read -p "this script will probably fail - do you want to run anyway?" yn
case $yn in
[Yy]*)
##### WHAT GOES HERE?? #####
;;
[Nn]*)
exit ;;
*)
echo "answer y or n" ;;
esac
echo "script has broken out of case back into while loop"
done
echo -e "\e[33m Installing bad packagename \e[0m"
apt-get install sdfsdfdfsd
echo "rest of script - will i keep running?"
Po n
wprowadzeniu skrypt istnieje całkowicie zgodnie z potrzebami. Chciałbym wiedzieć, jak to zrobić, aby po Y
wprowadzeniu skrypt wyłamał się zarówno z bloku while, jak case
i while, ale nie został całkowicie zamknięty. Czy jest coś, co mogę wstawić dla symbolu zastępczego („Co tu idzie?”), Aby to zrobić?
bash
shell-script
the_velour_fog
źródło
źródło
[Yn]*)
; prawdopodobnie miałeś na myśli[Yy]*)
.$TEST=1
powinno byćTEST=1
, a twój skrypt prawdopodobnie będzie działał z tą zmianą.Odpowiedzi:
W przypadku, gdy użytkownik wprowadził „y”, możesz wyjść zarówno z chwili, jak i z przypadku:
W twoim przypadku chcesz to zrobić
break 2
.źródło
break 2
zrobiłem to w odniesieniu do twojego komentarza powyżej, tak próbowałem ustawić zmienną, ale to nie zadziałało - Zgaduję, że bash ma zasięg lokalny w czasie i blokuje sprawy? w przeciwieństwie do np. PHPcase
jak to robiłeś, powinno zostać odzwierciedlone w teście dla pętli while.[Yy]
bloku sprawy. wprowadziłem niewielką edycję w moim pytaniu, aby to odzwierciedlić, ale masz rację, działa - dzięki nauczyłem się kilku fajnych rzeczy!break
wystarczy. Nie widzę dwóch poziomów pętli w kodzie.@dhag ma świetną odpowiedź. Możesz także użyć:
źródło