Bash:如果然后声明多个条件

时间:2013-09-18 06:19:07

标签: bash if-statement

我正在编写一个bash脚本来设置不同类型的恢复。我正在设置一个“if”语句来比较多个变量。

restore=$1
if [ "$restore" != "--file" ] || [ "$restore" != "--vhd"] || [ "$restore" != "--vm" ]
then
    echo "Invalid restore type entered"
    exit 1
fi

我正在寻找的是看看是否有更简单的方法将所有这些条件放在一组括号中,就像在Python中一样。在Python中,我可以像这样运行它:

import sys
restore = sys.argv[1]
if restore not in ("--file", "--vhd", "--vm"):
    sys.exit("Invalid restore type entered")

基本上,是否存在bash替代方案?

2 个答案:

答案 0 :(得分:8)

使用便携式(POSIX)解决方案的开关:

case ${restore} in
    --file|--vhd|--vm)
        ;;
    *)
        echo "Invalid restore type entered"
        exit 1
        ;;
esac

甚至

case ${restore#--} in
    file|vhd|vm)
        ;;
    *)
        echo "Invalid restore type entered"
        exit 1
        ;;
esac

答案 1 :(得分:4)

使用扩展模式:

shopt -s extglob
restore=$1
if [[ $restore != @(--file|--vhd|--vm) ]]
then
    echo "Invalid restore type entered"
    exit 1
fi

或者使用正则表达式:

restore=$1
if [[ ! $restore =~ ^(--file|--vhd|--vm)$ ]]
then
    echo "Invalid restore type entered"
    exit 1
fi