2015-10-04 93 views
5

Sto costruendo uno script che eseguirà il backup di un database di WordPress. Ho creato la funzione di necessità per la discarica di MySQL:Bash: impossibile entrare se anche la condizione è vera

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 
} 

Quando Y o Yes/Si/Si/Si/Si è battitore - non entra in se è vero blocco, e non viene creato alcun discarica: (I dettagli del database sono corretti e la discarica va a portata di mano, ma non sono in grado di entrare nella condizione IF

+1

Utilizzare le virgolette intorno alla regexp, ad esempio: '[[$ response = ~ "^ ([aa] [eE] [SS] || [aa ]) $ "]]' – edi9999

+2

La tua espressione regolare corrisponderà (maiuscole/minuscole-virgolette aggiunte per la formattazione) '" si "' (con uno spazio finale) o '" y "' (con uno spazio iniziale) o la stringa vuota "" "... è quello che vuoi? –

risposta

5

Provare a usare un case dichiarazione:.

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' può anche essere utile qui. –

+0

La tua soluzione ha fatto il lavoro! Grazie agli altri che hanno partecipato anche alla mia domanda! –

3

le partite regex (caso-insensitive- citazioni aggiunte per la formattazione) "yes " (con uno spazio finale) o " y" (con uno spazio iniziale) o la stringa vuota "" .

Write questo, invece:

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

o meglio ancora

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

È inoltre possibile utilizzare gocce:

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

(con Bash < 4.1 è necessario shopt -s extglob). È inoltre possibile convertire response in minuscolo:

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

(l'espansione ${var,,} parametro è apparso in Bash 4.0).


e la cosa divertente è che read (con il default IFS) strisce spazi iniziali e finali ... quindi è impossibile avere una corrispondenza con una stringa non vuota.

0

Perché non trasformare la risposta a tutte le protezioni prima, quindi confrontare a Y o YES, ad esempio, fare:

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

Questo ha il vantaggio che non è necessario pensare al possibile combinazioni di maiuscole/minuscole, sono tutte rilevate. Inoltre, invece di:

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

si può solo fare:

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

Per i test di verità, il risultato di [[ 0 ]] è vero, mentre il risultato di ((0)) è falso.

considerare alcune semplificazioni, per migliorare la leggibilità, come ad esempio

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 ancorato, come consigliato, grazie. – AsymLabs