Bash'deki iki dizenin karşılaştırılması


22

ifBash betiğimde şu bloğu var :

if [ ${PACKAGENAME} -eq kakadu-v6_4-00902C ]; then
  echo "successfully entered if block!!"
fi

Betik çalıştırma eşit ifolmasına rağmen bloğuma girmiyor . Neyi yanlış yapıyorum?$PACKAGENAMEkakadu-v6_4-00902C


9
-eqtamsayılar için doğrudur, bir dize veya regex için test etmek istersiniz ( ==veya =~): mywiki.wooledge.org/BashGuide/TestsAndConditionals
jasonwryan

Teşekkürler jasonwryanBu kaynağa bir göz atacağım!
DemiSheep

Yanıtlar:


31

-eq İki sayıyı karşılaştıran bir aritmetik işlecidir.

Kullanın =(taşınabilir / standart sh) =~veya ==bunun yerine.

Ayrıca, ${PACKAGENAME}boşluklar veya bir joker karakter içeriyorsa , tırnak işaretlerini kullanın , ardından [istenenden daha fazla argüman görmeye neden olan birden fazla argümana bölünür . Burada genel bash tuzaklarının bir listesine bakınız .

if [ "${PACKAGENAME}" = 'kakadu-v6_4-00902C' ]; then
    echo "successfully entered if block!!"
fi

Bkz . İçin man basharama ( /) CONDITIONAL EXPRESSIONS.


1
Ah! Teşekkür ederim! İşe yaradı! Ben kesinlikle bu konuda bir çaylak değilim. Yardımın için minnettarım!
DemiSheep

2
Tldp.org/LDP/Bash-Beginners-Guide/html adresine bir göz attınız mı? Bu çok güzel bir bash kılavuzu ve örnekler ve sınavlar ile size yardımcı olacaktır :).
polim

1
Teşekkürler polymbir göz atacağım, kaynak için teşekkürler! VI rehberimin yanındaki o sekmeyi açacağım. :)
DemiSheep

4
İkili ayraç içinde, hiçbir kelime bölme işlemi yapılmaz, [[ $PACKAGENAME == "kakadu..." ]]tamamdır.
glenn jackman

4
Hatta çift parantez içine sen sağ taraftaki değişken açılımları çift tırnak gerektiğini ancak dikkat @glennjackman =, ==ve !=o tarafı bir desen, bir dize olduğundan,. Örneğin foo='*'; [[ whatever = $foo ]], doğru.
Gilles 'SO- kötülük yapmayı bırak'


4

Başka bir yol onları olumsuzlamaktır:

: ${PACKAGENAME:?'$PACKAGENAME variable is empty!'} #emits error and exits
[ -z "${PACKAGENAME#kakadu-v6_4-00902C}" ] || { #if var - str not empty do block
    echo '$PACKAGENAME is not kakadu-v6_4-00902C' 
    exit 1
} >&2

Yukarıdaki blok ilk önce "$PACKAGENAME"herhangi bir değeri olup olmadığını test eder , ve eğer değilse hatayla çıkıp eko ?'this'}yapar stderr. Ana kabuğu hala mevcutsa test geçmiştir ve daha sonra 'kakadu ...' dizginizi değişkenden çıkardığınızda testler -zboş bir dizgeyle sonuçlanır . Olmazsa, o zaman tekrar bir hata yayar ve kabuktan çıkar. Kabuğunuz bu noktada blok yürütüldükten sonra da hala mevcutsa, aksi halde değildir.

Muhtemelen bu tür bir şey en iyi şekilde bir fonksiyonda gerçekleştirilir. Sevmek:

argeq() ( i= : ${2?^MERR: not enough parameters!} #$#>=2 || quit w/ err ^M == \r
    z() { return $((${#1}>0)) ; } #return 1 if ${#1}>0 else 0
    until z "${2+?}" $((i=i+1)) #until $2 is not set...
    do  ! z "$1" && z "${1#"$2"}" || #$1 != '' && $1 - $2 == '' or...
        exit $((i${1:++1})) #exit $? == failed arg count
    shift ; done #shift away one param ; continue loop
)

Bu fonksiyonla sisteminizin izin verdiği kadar argüman sağlayabilirsiniz. 2'den az sağlarsanız 1 döndürür ve bir mesaj gönderir stderr. 2 veya daha fazla argüman sağlarsanız, hepsi dizeler olarak değerlendirilir ve eğer hepsi aynıysa ve null değilse, 0 döndürür, ilk önce kontrolde başarısız olan argüman numarasını döndürür.

Senin durumunda böyle kullanılabilir:

{   
    PACKAGENAME='kakadu-v6_4-00902C'
    argeq "$PACKAGENAME" kakadu-v6_4-00902C &&
        echo "kakadu-v6_4-00902C == $PACKAGENAME" ||
        echo failure
    ! argeq "${PACKAGENAME#*-}" kakadu-v6_4-00902C &&
        echo "kakadu-v6_4-00902C != ${PACKAGENAME#*-}" ||
        echo failure
}

###OUTPUT###
kakadu-v6_4-00902C == kakadu-v6_4-00902C
kakadu-v6_4-00902C != v6_4-00902C

Daha fazla göstermek için başka bir işlev yazacağım:

aeqecho() { i=$((i+1)) #inc for line#
    argeq "$@" && echo "$i : yay" || #allswell or
    ! e=$? ${2+:} return || #save $?; ! exclusive || to drop ERRs
    echo "$i : shite - arg$e failed" #report failure
}

DEMO:

{  i= s=string
   aeqecho $s #1
   aeqecho $s $s #2
   aeqecho "$s $s" #3
   aeqecho "$s $s" "${s} string" #4
   aeqecho "${s}1" $s string #5
   aeqecho "" "" "" #6
   aeqecho "" "$s" $s #7
   aeqecho 1 "${s#$s}1" $((2-1)) #8                     
   aeqecho $s $s $s $s $s $s $s $s $s $s $s $s stng #9  
   aeqecho $s $s $s $s $s $s $s $s $s $s $s $s string #10
}  

ÇIKTI:

ERR: not enough parameters!
2 : yay
ERR: not enough parameters!
4 : yay
5 : shite - arg2 failed
6 : shite - arg1 failed
7 : shite - arg1 failed
8 : yay
9 : shite - arg13 failed
10 : yay
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.