중첩 된 case 문에서 while 루프를 벗어나려면 어떻게해야합니까? [닫은]


18

아래 스크립트에서 사용자는 잠재적으로 잘못된 스크립트 실행을 계속 진행할 것인지 묻는 메시지를 표시합니다. 사용자가 Y프롬프트에 입력 하면 case블록에서 빠져 나와 while다시 루프로 다시 보내집니다 .

#! /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?"

n입력, 스크립트는 전체로 원하는 존재. Y스크립트를 입력 하면 while 블록 case while 블록 모두에서 벗어나지 만 완전히 종료되지 않도록 하는 방법을 알고 싶습니다 . 자리 표시 자 ( "무엇입니까?")에 입력 할 수있는 항목이 있습니까?


먼저 [Yn]*); 당신은 아마 의미했다 [Yy]*).
dhag

1
내가 처음 응답 한 이후 코드를 편집했지만 어떤 경우에도주의 $TEST=1해야하며 TEST=1스크립트가이 변경으로 작동 할 가능성이 높습니다.
dhag

그렇습니다, 나는 시험 할 때 그것을 보았다!
the_velour_fog

@dhag 편집 한 내용이 개선되었다고 생각합니다. 살펴보십시오. 귀하의 목표는 코드가 귀하의 대답이 잘 맞는 곳에 코드를 다시 작성하는 것으로 보이며 지금은 더 가깝습니다.
derobert

@derobert : 당신의 편집은 나에게 잘 보인다. 확실히 질문을 명확하게 만듭니다.
dhag

답변:


30

사용자가 "y"를 입력 한 경우 while 및 case를 모두 종료 할 수 있습니다.

break [n]
       Exit from within a for, while, until, or select loop.  If  n  is
       specified, break n levels.  n must be  1.  If n is greater than
       the number of enclosing loops, all enclosing loops  are  exited.
       The  return  value is 0 unless n is not greater than or equal to
       1.

귀하의 경우에는하고자합니다 break 2.


1
고맙습니다, 그렇습니다 break 2. 위의 의견과 관련하여 예, 변수를 설정하려고 시도했지만 작동하지 않았습니다 .Bash가 while 및 case 블록 내에 로컬 범위가 있다고 생각합니까? 예를 들어 PHP와 달리
the_velour_fog

bash 변수는 로컬 변수가 아니므로 (명시 적으로 선언하지 않는 한) TEST에 할당하는 case것은 while 루프에 대한 테스트에 반영되어야합니다.
dhag

아 알았어, [Yy]사건 블록 안에서 다른 임무를 수행하고 있었어 내 질문에 반영하기 위해 약간의 편집을했지만 귀하의 권리는 효과가 있습니다-감사합니다.
the_velour_fog

이 경우 break충분합니다. 코드에 두 가지 수준의 루프가 표시되지 않습니다.
xhienne

@ xhienne : 당신은 올바른 것 같습니다! 내가 무슨 생각을했는지 모르겠습니다.
dhag

1

@ dhag는 큰 대답이 있습니다. 다음을 사용할 수도 있습니다.

a=0
while [ "$a" -eq 0 ]; do
     ...
     [Nn]*)
          a=1;
          ;;
      ...
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.