有没有更优雅的方法来编写带有重叠(嵌套)替代方案的语句?

时间:2019-09-17 22:32:49

标签: bash sh case-statement

我想编写带有重叠替代项的case语句。

互联网上的快速搜索为我提供了一些示例,这些示例具有唯一性且不重叠,例如:

case $var in
    a) <code> ;;
    b) <code> ;;
    *) <code> ;;
esac

但是我需要一个替代方案包含多个替代方案和其他工作的方案。我是这样想的:

case $loglevel in
    [0-7]) <code>
           case $loglevel in
                [0-3] <redirect to /dev/console> 
                ;;
                [4-7] <redirect to /dev/null> 
                ;;
           esac
    ;;
    *) <code> ;;
esac

我想还有其他更优雅或更合理的方法可以做到这一点。在我看来,这种简单情况的嵌套case语句太多了。

2 个答案:

答案 0 :(得分:4)

如果您的外壳足够现代,则可以使用;;&代替;;来尝试以下条件,即使当前条件成功了:

#! /bin/bash
loglevel=$1
case $loglevel in
    ([0-7]) echo 0..7
            ;;&
    ([0-4]) echo 0..4
            ;;
    ([5-7]) echo 5..7
            ;;
    (*) echo Ohter
esac

哪个给

▏~ $ 1.sh 1
0..7
0..4
▏~ $ 1.sh 6
0..7
5..7

答案 1 :(得分:0)

commonFunc() {
    <common_code>
}

case $loglevel in
    [0-3] commonFunc
          <redirect to /dev/console> 
    ;;
    [4-7] commonFunc
          <redirect to /dev/null> 
    ;;
    *) <other_code> ;;
esac

或:

case $loglevel in
    [0-3] needX=1; needY=1 ;;
    [4-7] needX=1; needZ=1 ;;
    *) <other_code> ;;
esac

if [ "$needX" = 1 ]; then
    <common_code> 
fi

if [ "$needY" = 1 ]; then
    <redirect to /dev/console> 
fi

if [ "$needZ" = 1 ]; then
    <redirect to /dev/null>
fi