案例陈述落实?

时间:2012-08-17 17:48:41

标签: bash

在流行的命令式语言中,一旦case语句匹配,switch语句通常会“落到”下一级别。

示例:

int a = 2;
switch(a)
{
   case 1:
      print "quick ";
   case 2: 
      print "brown ";
   case 3: 
      print "fox ";
      break;
   case 4:
      print "jumped ";
}

将打印“棕色狐狸”。

然而bash中的代码相同

A=2
case $A in
2)
  echo "QUICK"
  ;&
2)
  echo "BROWN"
  ;&
3)
  echo "FOX"
  ;&
4)
  echo "JUMPED"
  ;&
esac

仅打印“BROWN”

如何将bash中的case语句“覆盖”到第一个示例中的其余条件?

(编辑:Bash版本3.2.25,&语句(from wiki)导致语法错误)

运行:

test.sh:

#!/bin/bash
A=2
case $A in
1)
  echo "QUICK"
  ;&
2)
  echo "BROWN"
  ;&
3)
  echo "FOX"
  ;&
esac

给出:

  

./ test.sh:line 6:意外令牌;' ./test.sh:
line 6:
附近的语法错误;&'

3 个答案:

答案 0 :(得分:31)

在bash 4.0中引入了;&;;&运算符,因此如果您想坚持使用五年前版本的bash,则必须重复代码或使用{{ 1}} S上。

if

或找到其他方法来实现目标。

(旁注,don't use all uppercase variable names。您可能会覆盖特殊的shell变量或环境变量。)

答案 1 :(得分:25)

试试这个:

case $VAR in
normal)
    echo "This doesn't do fallthrough"
    ;;
fallthrough)
    echo -n "This does "
    ;&
somethingelse)
    echo "fall-through"
    ;;
esac

答案 2 :(得分:0)

使用;&的可移植性不是很高,因为它需要bash(不是ashdash或真实的sh),并且至少需要bash 4.0或更高版本(并非在所有系统上都可用)。

一种解决方法,我认为它比许多if的is循环好,并修改了大小写var:

#!/bin/sh

A=2
A_BAK=$A
while [ -n "$A" ]; do
    case $A in
        1)
            echo "QUICK"
            A=2
            ;;

        2)
            echo "BROWN"
            A=3
            ;;

        3)
            echo "FOX"
            A=4
            ;;

        4)
            echo "JUMPED"
            A=""
            ;;
    esac
done
A=$A_BAK
相关问题