2015-10-04 12 views
5

Ich baue ein Skript, das eine WordPress-Datenbank sichern wird. Ich habe die Funktion Notwendigkeit für das MySQL-Dump erstellt:Bash: Kann nicht eingehen, wenn auch die Bedingung wahr ist

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 
} 

Wenn Y oder Ja/Ja/Ja/Ja/Ja ist Hitter - es tritt nicht in dem, wenn wahr Block und kein Dump erstellt: (die Datenbank Daten korrekt sind und die Dump geht auf der Hand, aber ich bin nicht in der Lage in der IF-Bedingung eingeben

+1

Verwenden Anführungszeichen um den regulären Ausdruck, zum Beispiel: '[[$ response = ~„^ ([yy] [eE] [sS] || [jj ]) $ "]]' – edi9999

+2

Sie Regex wird (case-insensitive-Anführungszeichen für Formatierungszwecke hinzugefügt) '" yes "' (mit einem Leerzeichen) oder "" (mit einem führenden Leerzeichen) oder die leere Zeichenfolge übereinstimmen '' '' ... ist das was du willst? –

Antwort

5

Versuchen Sie, eine case Anweisung:.

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' kann auch hier von Nutzen sein. –

+0

Ihre Lösung hat Ihre Aufgabe erfüllt! Danke an die anderen, die auch meine Frage beantwortet haben! –

3

Ihre Regex-Übereinstimmungen (Fall-insensitive- Zitate für Formatierungszwecke hinzugefügt) "yes " (mit einem Leerzeichen) oder " y" (mit einem führenden Leerzeichen) oder die leere Zeichenfolge "" .

schreiben Sie stattdessen:

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

oder noch besser

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

Sie auch Klackse verwenden können:

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

(mit Bash < 4.1 Sie benötigen shopt -s extglob). Sie können auch response in Kleinbuchstaben umwandeln:

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

(die ${var,,} Parameter Expansion erschien in Bash 4.0).


und das Komische ist, dass read (mit dem Standard-IFS) Streifen führende und nachfolgende Leerzeichen ... so ist es unmöglich, ein Spiel mit einem nicht leeren String zu haben.

0

Warum verwandeln nicht die Antwort auf alle Kappen zuerst, dann vergleichen zu Y oder YES, zum Beispiel tun:

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

Dies hat den Vorteil, dass Sie nicht brauchen, um die möglichen zu denken Kombinationen von Groß-/Kleinschreibung werden alle erkannt. Auch statt:

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

Sie können einfach tun:

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

Für Wahrheit Tests das Ergebnis [[ 0 ]] wahr ist, während das Ergebnis ((0)) falsch ist.

einige Vereinfachungen Betrachten wir zur besseren Lesbarkeit, wie

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 verankert, wie empfohlen, danke. – AsymLabs

Verwandte Themen