Bash getopts,强制参数

Bash getopts,强制参数

我正在使用一个非常简单的 bash 脚本,但我遇到了一个无法解决的问题:

我有myscript.sh三个参数,-u-h, 和-p。和-u都是-h强制性的,需要脚本运行。

我想做的是,如果myscript.sh -u User1仅此而已,它应该以 终止exit 1

我希望我的脚本能够分析并运行脚本(如果myscript.sh -u User1 -h Localhost有选项),否则它应该退出。

非常感谢

答案1

也许是这样的?

#!/bin/bash

unset -v host
unset -v port
unset -v user

while getopts h:p:u: opt; do
        case $opt in
                h) host=$OPTARG ;;
                p) port=$OPTARG ;;
                u) user=$OPTARG ;;
                *)
                        echo 'Error in command line parsing' >&2
                        exit 1
        esac
done

shift "$(( OPTIND - 1 ))"

if [ -z "$host" ] || [ -z "$user" ]; then
        echo 'Missing -h or -u' >&2
        exit 1
fi

# The rest of the script continues here and may make use of
# "$host" and "$user", and possibly "$port".

这里的主要部分是if最后的简短语句,它测试循环中是否有任何内容分配给host或变量。如果这些变量中的任何一个为空,则代码将其视为错误并在输出简短的诊断消息后退出。userwhile

上面显示的脚本也应该能够运行,/bin/sh因为它不包含任何 bashishms。

除了语句之外if,您还可以使用

: ${host:?Missing -h}
: ${user:?Missing -u}

或者,甚至更短,

: ${host:?Missing -h} ${user:?Missing -u}

:命令是一个不执行任何操作的实用程序,但它的参数仍将由调用 shell 处理,就像所有命令一样。对于上面的两行,shell 将尝试扩展hostuser变量,如果变量未设置,或者扩展结果为空字符串,则将输出后面右侧的字符串,?并且脚本将以非零退出状态:

$ bash script.sh -h somehost
script.sh: line 21: user: Missing -u
$ echo $?
1

${variable:?text}扩展是标准的,因此受到bash所有其他 POSIXsh类 shell 的支持。

相关内容