Mysql Bash:即使条件为真,也无法进入

Mysql Bash:即使条件为真,也无法进入,mysql,wordpress,bash,backup,Mysql,Wordpress,Bash,Backup,我正在构建一个脚本来备份WordPress数据库。 我已经创建了MySQL转储所需的函数: 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 [[ $? ==

我正在构建一个脚本来备份WordPress数据库。 我已经创建了MySQL转储所需的函数:

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  
}

当Y或Yes/Yes/Yes/Yes/Yes/Yes为hitter时-它不会进入if true块,也不会创建转储:(数据库详细信息正确,转储仍在进行,但我无法进入if条件。

尝试使用
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

}
您的正则表达式匹配(不区分大小写的引号用于格式化)
“yes”
(带尾随空格)或
“y”
(带前导空格)或空字符串
1

写下以下内容:

if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
甚至更好

if [[ $response =~ ^[yY]([eE][sS])?$ ]]
您还可以使用globs:

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

(使用Bash为什么不首先将响应转换为所有caps,然后与Y或YES进行比较,例如,do:

如果[${response^^}=~^(Y | YES)$]];那么……fi

这样做的好处是,您不需要考虑大写/小写的可能组合,它们都会被检测到。此外,您可以不考虑:

如果[[$?==0]];那么…fi

您只需执行以下操作:

如果[[$?]];那么…fi

对于真值测试,
[[0]]
的结果为真,而
((0))
的结果为假

考虑一些简化,以提高可读性,例如

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  
}

在regexp周围使用引号,例如:
[[$response=~“^([yY][eE][sS]| |[yY])$”]
正则表达式将匹配(为格式化目的添加不区分大小写的引号)
“yes”
(带尾随空格)或
“y”
(带前导空格)或空字符串
…这就是你想要的吗?
shopt-s nocasematch
在这里也可能有用。你的解决方案已经完成了!感谢其他人也参与了我的问题!@gniourf\u gniourf:regex锚定,如建议的,谢谢。
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  
}