如何在 bash 中访问命令行标志的多个选项

How to access multiple options for a command line flag in bash

我想访问标志的多个命令行输入,但我无法让它工作。输入顺序不受我控制,格式为(#是数字,不是注释)

./program.sh -a -b # #
./program.sh -b # # -a
./program.sh -b # #

我试过使用 getopts,这适用于 -a-b 的第一个数字,但我无法访问第二个数字。由于有时 -a 出现在 -b 之后,将输入的 'remainder' 视为字符串无法按预期工作。 我尝试使用一个循环,当它找到 -b 时,查看接下来要设置的两个值,如下所示:

for i in "$@"; do 
    case "$i" in
        -a)
            upperCase=true;
            ;;
        -b)
            first=$(($i+1));
            second=$(($i+2));
            ;;
        *)
            ;;

    esac
done

输出应该是从 # 到 # 的两个方向打印的字母,但我已经做到了,我唯一的问题实际上是接收输入。

也许这个循环会起作用,而不是:

while [[ $# -gt 0 ]]
do
    case "" in
        -a)
            upperCase=true;
            ;;
        -b)
            first=;  # Take the next two arguments
            second=; 
            shift 2    # And shift twice to account for them
            ;;
        *)
            ;;

    esac
    shift  # Shift each argument out after processing them
done

$(($i+1))只是给变量i加一,而不是你想要的取下一个位置参数。