我正在努力处理以下代码。
#!/bin/bash
test-one () {
if [[ ! -z $1 ]] ; then
echo "You are in function test-one with arg $1"
else
echo "You are in function test-one with no args"
fi
}
while getopts ":a:b:" opt; do
case $opt in
a) test-one ${OPTARG}
exit;;
b) FOO=${OPTARG}
exit;;
esac
done
无论是否传递了可选参数,我都想调用函数test-one。 我正在寻找的是:
./script.sh -a argument1
将导致:
You are in function test-one with arg argument1
而:
./script.sh -a
将导致:
You are in function test-one with no args
到目前为止,示例“ ./script.sh -a”仅跳过了函数调用... 我究竟做错了什么? 谢谢!
答案 0 :(得分:0)
当传递-a
时,您将在命令行中传递作为-a
的参数给出的值,该值存储在OPTARG
中。在第二个示例中,您没有这样的参数,因此该值将获得一个空字符串,该字符串将有义务地传递给该函数。
不幸的是,这里没有保留长度为0的字符串作为参数,实际上至少是一个长度为0的字符串,它将“通过” -z
测试。
因此对于“您在做什么错”,您似乎希望将空参数视为非空参数。如果要验证OPTARG
确实具有传递的值,可以在将-a
用作参数之前进行测试。
答案 1 :(得分:0)
对于高效的脚本,我建议您使用静默模式,因为在您看不到烦人的标准消息时,所有内容看起来都更加专业。另外,由于以更简单的方式指示了故障案例,因此更易于处理。
无效选项 VARNAME 设置为?(问号),而 OPTARG 未设置
未找到必需的参数 VARNAME 设置为?(问号),未设置 OPTARG ,打印错误消息
无效选项 VARNAME 设置为?(问号), OPTARG 设置为(无效)选项字符
未找到必需的参数 VARNAME 设置为:(冒号),并且 OPTARG 包含选项字符有问题的
尝试一下:
#!/bin/bash
while getopts ":a:" opt; do
case $opt in
a)
echo "-a was triggered, Parameter: $OPTARG" >&2
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:) echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done