2

我正在编写一个 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 替代品?

4

2 回答 2

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
于 2013-09-18T06:26:40.287 回答
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
于 2013-09-18T06:21:58.953 回答