Getopts:如何正确管理可选参数?

时间:2018-12-07 17:42:28

标签: bash function arguments optional getopts

我正在努力处理以下代码。

#!/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”仅跳过了函数调用... 我究竟做错了什么? 谢谢!

2 个答案:

答案 0 :(得分:0)

当传递-a时,您将在命令行中传递作为-a的参数给出的值,该值存储在OPTARG中。在第二个示例中,您没有这样的参数,因此该值将获得一个空字符串,该字符串将有义务地传递给该函数。

不幸的是,这里没有保留长度为0的字符串作为参数,实际上至少是一个长度为0的字符串,它将“通过” -z测试。

因此对于“您在做什么错”,您似乎希望将空参数视为非空参数。如果要验证OPTARG确实具有传递的值,可以在将-a用作参数之前进行测试。

答案 1 :(得分:0)

关于错误报告,getopts可以在两种模式下运行:

详细模式和静音模式

对于高效的脚本,我建议您使用静默模式,因为在您看不到烦人的标准消息时,所有内容看起来都更加专业。另外,由于以更简单的方式指示了故障案例,因此更易于处理。

详细模式

  

无效选项 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