我正在使用一个非常简单的 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
或变量。如果这些变量中的任何一个为空,则代码将其视为错误并在输出简短的诊断消息后退出。user
while
上面显示的脚本也应该能够运行,/bin/sh
因为它不包含任何 bashishms。
除了语句之外if
,您还可以使用
: ${host:?Missing -h}
: ${user:?Missing -u}
或者,甚至更短,
: ${host:?Missing -h} ${user:?Missing -u}
该:
命令是一个不执行任何操作的实用程序,但它的参数仍将由调用 shell 处理,就像所有命令一样。对于上面的两行,shell 将尝试扩展host
和user
变量,如果变量未设置,或者扩展结果为空字符串,则将输出后面右侧的字符串,?
并且脚本将以非零退出状态:
$ bash script.sh -h somehost
script.sh: line 21: user: Missing -u
$ echo $?
1
该${variable:?text}
扩展是标准的,因此受到bash
所有其他 POSIXsh
类 shell 的支持。