2015-10-04 45 views
5

WordPress veritabanını yedekleyecek bir komut dosyası yapıyorum. Ben MySQL dökümü için fonksiyon ihtiyacını yaratmıştır:Bash: Durum doğru olsa bile girilemiyor

function db_backup { 
    read -r -p "Dump the database? [Y/n]: " response 
    if [[ $response =~ ^([yY][eE][sS] || [yY])$ ]] 
    then 
     mysqldump -h $1 -u $2 -p$3 $4 > $4.sql 

     if [[ $? == 0 ]] 
     then 
      printf "Database %s dumped successfuly in %s.sql\n" ${db_name} ${db_name} 
      return 0 
     else 
      printf "Database backup %bfailed%b\n" ${red} ${reset} 
      return 1 
     fi 
    else 
     return 1 
    fi 
} 

zaman Y veya Evet/VAR/VAR/VAR/evet hitter - Doğru blokta ise ve hiçbir dökümü oluşturulur içinde girmezse: (veritabanı ayrıntılarının doğru ve dökümü taraftan gider, ama ben EĞER durumda girmek mümkün değilim

+1

Kullanım tırnak bazı sadeleştirmeler düşünün ]) $ "]]' – edi9999

+2

Eğer regex eşleşecektir (büyük/küçük harf duyarsız - biçimlendirme amacıyla eklenen tırnaklar) '' evet ''(sondaki boşluk ile) veya' "y" '(boşluklu) veya boş dize '' ''… Istediğin bu mu? –

cevap

5

bir case deyimi kullanmayı deneyin.

db_backup() 
{ 
    read -r -p "Dump the database? [Y/n]: " response 

    case "$response" in 
    y|Y|yes|Yes|YES) 
     mysqldump -h $1 -u $2 -p$3 $4 > $4.sql 

     if [[ $? == 0 ]] 
     then 
      printf "Database %s dumpedy in %s.sql\n" ${db_name} ${db_name} 
      return 0 
     else 
      printf "Database backup %bfailed%b\n" ${red} ${reset} 
      return 1 
     fi 
     ;; 
    esac 
    return 1 

} 
+2

'shopt -s nocasematch' da burada kullanılabilir. –

+0

Çözümünüz bu işi yaptı! Benim de soruma katılan diğerlerine teşekkürler! –

3

Sizin düzenli ifade maçları (vaka-insensitive- biçimlendirme amacıyla eklenen tırnaklar) "yes " (sondaki boşluk ile) veya " y" (öncü bir boşluk ile) veya boş bir dize "" .

Yaz yerine bu:

if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]] 

ya da globs kullanabilirsiniz

if [[ $response =~ ^[yY]([eE][sS])?$ ]] 

daha da iyi:

if [[ $response = [yY]?([eE][sS]) ]] 

(Bash < 4.1 ile size shopt -s extglob gerekir). Ayrıca küçük harf response dönüştürebilirsiniz:

if [[ ${response,,} = y?(es) ]] 

(${var,,} parametre genişletme Bash 4.0 çıktı).


ve komik bir şey read (varsayılan IFS ile) ... başındaki ve sonundaki boşlukları şeritler yüzden boş olmayan bir dize ile maç yapmak imkansız olmasıdır.

0

, örneğin, neden, her şeyden önce kapaklar yanıtı dönüşümü olmayan o Y karşılaştırmak veya EVET yapın:

if [[ ${response^^} =~ ^(Y|YES)$ ]]; then ... fi

Bu mümkün düşünmek gerekmez avantajı vardır Üst/küçük harf kombinasyonları, hepsi tespit edilir. Ayrıca, yerine:

if [[ $? == 0 ]]; then ... fi

Sen tıpkı yapabilirsiniz: ((0)) sonucu yanlış ise gerçek için test

if [[ $? ]]; then ... fi

, [[ 0 ]] sonucu doğrudur.`[[$ Yanıtı = ~ "^ ([YY] [EE] [ss] || [YY:

, okunabilmesi için, regexp, örneğin etrafında gibi

function db_backup { 
    read -r -p "Dump the database? [Y/n]: " response 
    if [[ ${response^^} =~ ^(Y|YES)$ ]] 
    then 
     if mysqldump -h $1 -u $2 -p$3 $4 > $4.sql 
     then 
      printf "Database %s dumped successfuly in %s.sql\n" ${db_name} ${db_name} 
      return 0 
     else 
      printf "Database backup %bfailed%b\n" ${red} ${reset} 
      return 1 
     fi 
    else 
     return 1 
    fi 
} 
+1

@gniourf_gniourf: regex, tavsiye edildiği gibi bağlantılıdır. – AsymLabs

İlgili konular