2015-10-04 6 views
5

WordPressデータベースをバックアップするスクリプトを作成しています。 私は、MySQLのダンプのための機能が必要に作成した:Yまたははい/ YES/YES/YES/YESが打者のときBash:条件が真であっても入力できません。

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 
} 

を - それがもし本当のブロックに入らないし、何のダンプが作成されません。 (データベースの詳細が正しいとダンプが手に入るが、私はIF条件に入ることができないのです

+1

使用引用符をいくつかの単純化を考えてみましょう])$]]] ' – edi9999

+2

regexは大文字小文字を区別しない形式で引用符を付けることができます。' 'yes ''(末尾のスペース)または '' y' '(先頭のスペース) '' '' ...それはあなたが望むものなのですか? –

答えて

5

case文を使用してみてください:。

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'もここで使うことができます。 –

+0

あなたのソリューションは仕事を完了しました!私の質問にも出席した他の人に感謝します! –

3

あなたの正規表現マッチ(大文字insensitive-書式設定のために引用符を追加)"yes "(末尾のスペース)または" y"(先頭のスペース)または空の文字列""

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

またはより良い

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

あなたはまた、グロブを使用することができます:

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

(バッシュ< 4.1とあなたがshopt -s extglobを必要とする)代わりに、この

書き込み。また、下部ケースにresponseを変換することができます:

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

${var,,}パラメータ展開がバッシュ4.0に登場しました)。


と面白いことにread(デフォルトIFSで)...先頭と末尾のスペースを取り除きので、それは非空の文字列と一致するものを持っていることは不可能だということです。

0

は、例えば、なぜ、最初にすべてのキャップへの応答を変換しないで、その後Yと比較するか、YESの操作を行います。

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

これはあなたが可能考える必要がないという利点を持っています大文字と小文字の組み合わせはすべて検出されます。また、代わりに:あなただけ行うことができます

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

((0))の結果が偽であるのに対し、真実試験のための

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

を、[[ 0 ]]の結果は、真です。`[[$応答=〜「^([YY] [EE] [SS] || [YY:

は、読みやすくするために、正規表現、例えば周りなど

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は、アドバイスされたようにアンカーされました。ありがとうございます。 – AsymLabs

関連する問題