BASH不是在案件中

时间:2014-02-20 20:45:55

标签: bash case

嘿伙计们,我正试图找出一个在案例中做一个NOT条款的理智方式。我这样做的原因是为了 当一个案例被满足时代码转换,即如果我击中avi,没有理由再将它变成avi,我可以 只是把它移开(这是我的案例基础应该做的范围)。无论如何,我有一些 我写的 proto 代码给出了我想要做的事情的要点。

#!/bin/bash
for i in $(seq 1 3); do 

    echo "trying: $i"

    case $i in
        ! 1)    echo "1" ;;     # echo 1 if we aren't 1
        ! 2)    echo "2" ;;     # echo 2 if we aren't 2
        ! 3)    echo "3" ;;     # echo 3 if we aren't 3
        [1-3]*) echo "! $i" ;;  # echo 1-3 if we are 1-3
    esac

    echo -e "\n"

done

预期结果将是这样的

2 3 ! 1
1 3 ! 2
1 2 ! 3

感谢帮助,谢谢。

2 个答案:

答案 0 :(得分:6)

这与case的设计相反,后者仅执行第一场比赛。如果您想要在多个匹配项上执行(并且在您的设计中, 3想要在12上执行),那么{ {1}}是错误的结构。使用多个case块。

if

因为case只执行第一次匹配,所以只有一个“did-not-match”处理程序才有意义;这就是[[ $i = 1 ]] || echo "1" [[ $i = 2 ]] || echo "2" [[ $i = 3 ]] || echo "3" [[ $i = [1-3]* ]] && echo "! $i" 落后的原因。

答案 1 :(得分:2)

您可以使用extglob扩展名执行此操作。

$ shopt -s extglob
$ case foo in !(bar)) echo hi;; esac
hi
$ case foo in !(foo)) echo hi;; esac
$