所以我正在编写一个脚本,将带参数的选项与不带参数的选项混合在一起。通过研究,我发现 getopts 是执行此操作的最佳方法,并且到目前为止,它很容易弄清楚和设置。我遇到的问题是弄清楚如何设置它,以便在没有提供选项或参数的情况下,让它运行一组单独的命令。这就是我所拥有的:
while getopts ":n:h" opt; do
case $opt in
n)
CODEBLOCK >&2
;;
h)
echo "script [-h - help] [-n <node> - runs commands on specified node]" >&2
exit 1
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
我尝试在代码顶部添加类似的内容以捕获任何参数,但即使提供了选项和参数,它也会运行相同的代码(这里的语法可能有问题):
[[ -n "$1" ]] || {
CODEBLOCK1
}
while getopts ":n:h" opt; do
case $opt in
n)
CODEBLOCK2 >&2
;;
h)
echo "script [-h - help] [-n <node> - runs commands on specified node]" >&2
exit 1
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
getopts 的手册页很少,我在搜索中发现的示例相对较少,可以提供对 getopts 的任何深入了解,更不用说它的所有各种功能了。
答案1
$1
当为空时,您可以使用以下任一命令来运行命令:
[[ ! $1 ]] && { COMMANDS; }
[[ $1 ]] || { COMMANDS; }
[[ -z $1 ]] && { COMMANDS; }
[[ -n $1 ]] || { COMMANDS; }
此外,您不需要引用此特定示例中的扩展,因为不执行分词。
不过,如果您想检查是否有参数,最好使用(( $# ))
.
如果我理解你的意图,那么你的代码可以这样编写getopts
:
#!/bin/bash
(( $# )) || printf '%s\n' 'No arguments'
while getopts ':n:h' opt; do
case "$opt" in
n)
[[ $OPTARG ]] && printf '%s\n' "Commands were run, option $OPTARG, so let's do what that says."
[[ ! $OPTARG ]] && printf '%s\n' "Commands were run, there was no option, so let's run some stuff."
;;
h) printf '%s\n' 'Help printed' ;;
*) printf '%s\n' "I don't know what that argument is!" ;;
esac
done