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

时间:2019-04-03 01:43:28

标签: bash input command-line arguments getopts

我想访问多个命令行输入的标志,但无法正常工作。输入顺序超出了我的控制范围,格式为(#是数字,而不是注释)

./program.sh -a -b # #
./program.sh -b # # -a
./program.sh -b # #
  • -a没有选项,只是一个开/关
  • -b后面总是两个数字。

我尝试使用getopts,它适用于-a和第一个数字-b,但是我无法访问第二个数字。由于有时-a紧跟-b之后,将输入的“余数”视为字符串无法正常工作。 我尝试使用一个循环,当发现-b时,会查看接下来要设置的两个值,如下所示:

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

    esac
done

输出应该是从#到#的两个方向上的字母,但是我可以正常工作,我唯一的问题实际上是接收输入。

1 个答案:

答案 0 :(得分:1)

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

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

    esac
    shift  # Shift each argument out after processing them
done

$(($i+1))只是将一个变量添加到变量i中,而不是根据需要获取下一个位置参数。