Bash:即使条件成立也无法进入

时间:2015-10-04 15:15:43

标签: 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 [[ $? == 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是击球手时 - 它没有输入if true块,并且没有创建转储:(数据库详细信息正确并且转储就在手边,但我是无法进入IF条件。

3 个答案:

答案 0 :(得分: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

}

答案 1 :(得分:3)

您的正则表达式匹配(为格式化目的添加了不区分大小写的引号)"yes "(带有尾随空格)或" y"(带有前导空格)或空字符串"" < SUP> 1

改为写下:

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

甚至更好

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

你也可以使用globs:

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

(使用Bash&lt; 4.1,您需要shopt -s extglob)。您还可以将response转换为小写:

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

${var,,}参数扩展出现在Bash 4.0中。)

1 ,有趣的是read(使用默认的IFS)剥离前导和尾随空格...所以它不可能与之匹配一个非空字符串。

答案 2 :(得分:0)

为什么不首先将响应转换为全部大写,然后与Y或YES比较,例如,执行:

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

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

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

你可以这样做:

if [[ $? ]]; then ... 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  
}