Kus*_*nda 21
也许是这样的?
#!/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".
Run Code Online (Sandbox Code Playgroud)
这里的主要部分是if最后的简短语句,它测试循环中是否有任何内容分配给host或变量。如果这些变量中的任何一个为空,则代码将其视为错误并在输出简短的诊断消息后退出。userwhile
上面显示的脚本也应该能够运行,/bin/sh因为它不包含任何 bashishms。
除了语句之外if,您还可以使用
: ${host:?Missing -h}
: ${user:?Missing -u}
Run Code Online (Sandbox Code Playgroud)
或者,甚至更短,
: ${host:?Missing -h} ${user:?Missing -u}
Run Code Online (Sandbox Code Playgroud)
该:命令是一个不执行任何操作的实用程序,但它的参数仍将由调用 shell 处理,就像所有命令一样。对于上面的两行,shell 将尝试扩展host和user变量,如果变量未设置,或者扩展结果为空字符串,则将输出后面右侧的字符串?,并且脚本将以非零退出状态:
: ${host:?Missing -h}
: ${user:?Missing -u}
Run Code Online (Sandbox Code Playgroud)
该${variable:?text}扩展是标准的,因此受到bash所有其他 POSIXsh类 shell 的支持。