[[ve bash cinsinden vaka eşdeğeri


13

mu

if [[ "$1" = pattern ]]; then
    hook
fi

her zaman aynı şekilde davranır

case "$1" in
    pattern) hook;;
esac

ya da gotchas var mı?


1
Ben ne olursa olsun, onlar farklı herhangi vakaları bulamıyorum shoptayarlar ve değerler $1ya pattern, ne de $?sonradan. Tek fark, $1altında çalışırken çıkışta genişletilmemesidir xtrace.
Kusalananda

Yanıtlar:


7

Evet, (neredeyse) tamamen eşdeğerdir.


detay

Bir [ … ]yapının içinde:

=Operatörü (ya da olmayan POSIX opsiyon ==) dize eşleştirme, değil desen eşleştirme test eder.

Bir [[ ]]yapının içinde (insan bashından):

== ve! = Operatörleri kullanıldığında, operatörün sağındaki dize bir desen olarak kabul edilir ve aşağıda Desen Eşleme altında açıklanan kurallara göre eşleştirilir . Kabuk seçeneği nocasematch etkinleştirilirse, eşleme alfabetik karakterlerin durumuna bakılmaksızın gerçekleştirilir . Dize örüntüyle eşleşirse (==) veya eşleşmiyorsa (! =) Dönüş değeri 0, aksi takdirde 1 olur. Desenin herhangi bir kısmı, onu bir dize olarak eşleşmeye zorlamak için alıntılanabilir.

Bir caseyapı içinde (insan bash, düzenlenmiş ve benim vurgu):

[[(] desen [| desen] ...) listesindeki vaka kelimesi ;; ] ... esac
... çalışır aynı eşleştirme kullanarak, sırayla her desen karşı maç için kurallar gelince dosyayolu (aşağıdaki yol adı bölümüne bakınız). … İncelenen her bir desen tilde genişletme, parametre ve değişken genişletme, aritmetik ikame, komut ikamesi ve işlem ikamesi kullanılarak genişletilir. Kabuk seçeneği nocasematch etkinleştirilirse, eşleme alfabetik karakterlerin durumuna bakılmaksızın gerçekleştirilir .

Hem Pattern Matchingve Pathname Expansionbash kılavuzunda içindeki aynı anlamında kullanılmaktadır.

Kılavuzda görebildiğim tek fark:

`[[ … ]]`                                   case
tilde  expansion                            tilde expansion
parameter and variable expansion            parameter and variable expansion
arithmetic expansion                        arithmetic substitution
command substitution                        command substitution
process substitution                        process substitution
quote removal

Bu quote removal, vaka yapısı için açıkça listelenmez.
Hangisi bununla tam olarak eşleşir (için [[ … ]]):

Desenin herhangi bir kısmı, onu bir dize olarak eşleşmeye zorlamak için alıntılanabilir.

Bu son noktayı test etmek için bunu kullanın (şimdi değişken bir desen değildir ):

case "$1" in
  "$pattern") echo case match
esac

Neden neredeyse?

  1. Örtük extglob:

    Bash 4.3 sürümünden beri

    '==' ve '! =' Operatörleri kullanıldığında, operatörün sağındaki dize bir desen olarak kabul edilir ve extglob kabuk seçeneği etkinmiş gibi , Desen Eşleme'de aşağıda açıklanan kurallara göre eşleştirilir .

    Bu, extglob unset seçeneğiyle kullanılan bir desenin , bir case deyiminde ve [[bash 4.3 sürümünden sonra bir yapı içinde farklı şekilde çalışacağı anlamına gelir .

  2. Örtük |:

    Vaka için sözdizimi:

    case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac

    Bu, bir |(VEYA) ile ayrılmış birkaç desenin olabileceği anlamına gelir .

    Bunun gibi:

    shopt -s extglob;      p1="+([0-9])";       p2="+([abcde])"
    
    case "$1" in
        $p1|$p2)    echo "or case match" ; ;;
    esac

    Hangi sadece numaraları veya sadece harflerden oluşan bir dize ya maç olacak abcdegibi 1234ya aabeeama 12aya b23.

    Normal ifade (var p3'e bakın) kullanılırsa A [[eşit olarak çalışır :

    #!/bin/bash
    
    shopt -s extglob           ### Use extended globbing.
    shopt -s globasciiranges   ### The range [a-z] will expand to [abcdefghijklmnopqrstuvwxyz].
    
    pattern="+([0-9])"
    p1="+([0-9])"
    p2="+([a-z])"
    p3="^([0-9]+|[a-z]+)$"
    
    case "$1" in
        $pattern)   echo case1 match ; ;&
        $p1|$p2)    echo case2 match ; ;;
    esac
    
    [[ "$1" == $pattern ]] && echo if1 match
    [[ "$1" =~ $p3 ]] && echo if2 match
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.