Bash getopts不';不显示第二个选项的错误

Bash getopts不';不显示第二个选项的错误,bash,getopts,Bash,Getopts,我想要一个脚本接受两个选项,这两个选项都是必需的。如果我传入一个,脚本不会打印请求您传入第二个的错误 -bash-4.2$ bash test.sh -b Invalid option: b requires an argument -bash-4.2$ bash test.sh -p Invalid option: p requires an argument -bash-4.2$ bash test.sh -b sdfsfd -bash-4.2$ bash test.sh -p sdf

我想要一个脚本接受两个选项,这两个选项都是必需的。如果我传入一个,脚本不会打印请求您传入第二个的错误

-bash-4.2$ bash test.sh -b
Invalid option: b requires an argument

-bash-4.2$ bash test.sh -p
Invalid option: p requires an argument

-bash-4.2$ bash test.sh -b sdfsfd

-bash-4.2$ bash test.sh -p sdfsfd

-bash-4.2$ bash test.sh -b sdfsfd -s sfd
Invalid option: s
代码
showHelp()
{

cat如果您想确保两个选项都有,您可以使用以下方法:

no_p=1
no_b=1

while getopts ":p:b:h" o; do
    case "${o}" in
        h)
           showHelp
           ;;
        p)
            p=${OPTARG}
            no_p=0
            ;;
        b)
            b=${OPTARG}
            no_b=0
            ;;
        \? )
            echo "Invalid option: $OPTARG";;
         : )
            echo "Invalid option: ${OPTARG} requires an argument";;
    esac
done

[[ $no_p -eq 1 ]] && echo "No -p provided" && exit 1
[[ $no_b -eq 1 ]] && echo "No -b provided" && exit 1

如果您想确保两个选项都有,可以使用以下方法:

no_p=1
no_b=1

while getopts ":p:b:h" o; do
    case "${o}" in
        h)
           showHelp
           ;;
        p)
            p=${OPTARG}
            no_p=0
            ;;
        b)
            b=${OPTARG}
            no_b=0
            ;;
        \? )
            echo "Invalid option: $OPTARG";;
         : )
            echo "Invalid option: ${OPTARG} requires an argument";;
    esac
done

[[ $no_p -eq 1 ]] && echo "No -p provided" && exit 1
[[ $no_b -eq 1 ]] && echo "No -b provided" && exit 1

在每个case语句中添加一个计数器或一个标志,在case语句后检查它们是否正确。在
GNU bash,版本4.3.46(2)-发行版(x86_64-pc-msys)
,你有哪个版本的
bash
吗?
GNU bash,版本4.2.46(1)-发行版(x86_64-redhat-linux-GNU)
我说不清(从你发布的内容),如果变量
b
p
先前已设置(在此脚本中或调用脚本之前);我通常要做的是…就在
while getops…
之前,我确保我的选项变量未定义,例如:
unset b p while getopts…
,以便选项变量的后getopts测试工作正常expected@markp它们以前没有设置。在每个case语句中添加一个计数器或一个标志,检查它们是否正确在案例陈述之后。在
gnubash,版本4.3.46(2)-release(x86_64-pc-msys)
,你有哪个版本的
bash
gnubash,版本4.2.46(1)-release(x86_64-redhat-linux-GNU)
我无法判断(从你发布的内容)变量
b
p
是否已经预先设置过(在这个脚本中或者在调用脚本之前);我通常做的是…在
while getops…
之前,我确保我的选项变量是未定义的,例如:
unset b p while getopts…
,这样选项变量的后getopts测试工作就像expected@markp它们以前没有设置。