我正在构建一个备份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条件。
答案 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
}