如何从嵌套的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 2015年

1
自从我第一次回答以来,您就已经编辑了代码,但是请注意无论如何$TEST=1应该是TEST=1,并且您的脚本很可能可以进行此更改。
dhag 2015年

是的,是的,我在测试时就看到了!
the_velour_fog

@dhag我想我对您的编辑有所改进-请看一看。看来您的目标是将代码重写为适合您所接受的答案的代码,我认为现在已经接近了。
德罗伯特

@derobert:您的编辑对我来说还不错;这无疑使问题更加清楚。
dhag 2015年

Answers:


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不同,例如PHP
the_velour_fog

不,bash变量不是局部变量(除非您明确声明了它们),因此,case如您所做的那样在TEST中分配给TEST 应该反映在while循环的测试中。
dhag 2015年

嗯,我在[Yy]case区块内执行了另一项任务。在我的问题中进行了一些编辑以反映出来,但您的观点确实有效-谢谢,我学到了一些很酷的东西!
the_velour_fog

在这种情况下,break就足够了。我在代码中看不到两个循环级别。
xhienne

@xhienne:您似乎是正确的!我不确定我在想什么。
dhag '17

1

@dhag有一个很好的答案。您还可以使用:

a=0
while [ "$a" -eq 0 ]; do
     ...
     [Nn]*)
          a=1;
          ;;
      ...
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.