Bash case ifadeleri art arda olabilir mi?


29

Böyle bir şey yapmaya çalışıyorum:

case $level in
    3)
        echo "Level Three"

    2)
        echo "Level Two"

    1)
        echo "Level one"
        ;;
esac

eğer $ seviye = 3 ise çıktı

Level Three
Level Two
Level One

$ level = 1 ise, yalnızca çıktı

Level One

Ama denediğimde hata alıyorum syntax error near unexpected token ')'çünkü dahil etmedim ;;.

Tanıdığım her diğer dil buna izin veriyor, bunu bash yapmanın bir yolu var mı? "Şimdi devam et ve bir sonraki durumu uyuyormuş gibi yap" anlamına gelen bir anahtar kelime türü?


2
Bildiğiniz her dil buna izin veriyorsa, C ve taklitçileri dışındaki dilleri öğrenmeniz gerekir. İfadelerde sonbahar, bir şekilde daha ilkeli dillerde hayatta kalan tarihi bir tasarım kazasıdır.
Gilles 'SO- kötülük'

Yanıtlar:


42

Bir düşme davranışı ;&yerine kullanmak yerine kullanmanız gerekir ;;:

#! /bin/bash
foo() {
    case "$1" in
        3)
            echo "Level Three"
            ;&
        2)
            echo "Level Two"
            ;&
        1)
            echo "Level One"
            ;;
        a)
            echo "Level a"
            ;&
        b)
            echo "Level b"
            ;&
        c)
            echo "Level c"
            ;;
    esac
}
echo 3:
foo 3
echo 2:
foo 2
echo a:
foo a
3:
Level Three
Level Two
Level one
2:
Level Two
Level one
a:
Level a
Level b
Level c

Bash belgelerinin Koşullu Yapılar bölümüne bakın .

Diğer özel marker ise ;;&:

Kabuğun, varsa, bir sonraki maddede bulunan kalıpları test etmesine ve ilişkili bir komut listesini başarılı bir eşleştirmede çalıştırmasına neden olur.

;; her zaman nihaidir, başka hiçbir desen test edilmez.

#! /bin/bash

foo() {
    case "$1" in
        *3*)
            echo "Level Three"
            ;;&
        *2*)
            echo "Level Two"
            ;;&
        *1*)
            echo "Level One"
            ;;&
    esac
}

echo 12:
foo 12
echo 13:
foo 13
echo 23:
foo 23
12:
Level Two
Level One
13:
Level Three
Level One
23:
Level Three
Level Two

18
Taşınabilirlik notu: bu sözdizimi POSIX değil. Bu gelir kshve kullanılabilir ksh, bash(2009, 4.0 beri) ve zsh(1997, 3.1.2 beri). ;;&bash özgüdür.
Stéphane Chazelas

4
Ayrıca not olduğunu zsheşdeğer bash'ın ;;&olduğu ;|(4.3.3 2007 yılında eklenmiştir).
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.