Bash 大小写总是默认

Bash Case always goes to default

我正在尝试使用以下代码解析 bash 脚本中的一些参数:

for arg in "$@"
do
    case $arg in
        -i|--initialize)
        SHOULD_INITIALIZE=1
        shift # Remove --initialize from processing
        ;;
        -r|--root)
        ROOT_DIRECTORY=""
        shift # Remove argument name from processing
        shift # Remove argument value from processing
        ;;
        *)
        echo "Error, Invalid argument $arg"
        exit 1
        ;;
    esac
done

但是,当按预期调用函数时

bash script.sh -i -r /some/directory

结果总是

Error /some/directory

似乎“/some/directory”字符串正在重新进入 switch 语句。这不是轮班的全部目的吗?我不太精通 Bash,所以任何帮助将不胜感激。

谢谢!

shift 不会影响接下来将分配给 arg 的值,因为 for 循环有效地“冻结”了要迭代的值集。

改为使用 while 循环:

while [ $# -gt 0 ]; do
    case  in
        -i|--initialize)
        SHOULD_INITIALIZE=1
        shift
        ;;
        -r|--root)
        ROOT_DIRECTORY=""
        shift # Remove argument name from processing
        shift || { echo "Error, no root directory given"; exit 1; }
        ;;
        *)
        echo "Error, Invalid argument "
        exit 1
        ;;
    esac
done

for 循环不同,while 循环在每次迭代开始时重新评估其条件,其中包括在任何先前轮班后重新评估 $# 的值.

请注意,如果没有 shift 参数,shift 将失败,因此您可以使用其退出状态来检查 是否实际存在。