bash - Bash optarg 无法发现缺少的参数
问题描述
我对 bash shell 脚本没有经验,并且遇到了 bash 的问题optarg
这是一个重现问题的小脚本:
#!/bin/sh
while getopts ":a:b:" opt; do
case ${opt} in
a ) echo "a=$OPTARG"
;;
b ) echo "b=$OPTARG"
;;
\? ) echo "Invalid option: $OPTARG" 1>&2
;;
: ) echo "Invalid option: $OPTARG requires an argument" 1>&2
esac
done
当我尝试这个时:
./args.sh -a av -b bv
我得到了预期的结果:
a=av
b=bv
但是当我省略 -a 的参数时:
/args.sh -a -b bv
我得到了这个不幸的结果:
a=-b
当我期望一个错误表明 -a 的值丢失时。
似乎将 -b 参数作为 -a 的值。我做错了什么以及如何实现预期的行为?
解决方案
唯一积极的建议是你如何对待但是当我省略参数时'-a'
,你不能直接跳到下一个后续选项。按照惯例getopts a:
,您希望为定义的标志提供一个 arg 值。
因此,即使对于省略的情况,您也需要定义一个空字符串,这意味着未定义 arg 的值,即
-a '' -b bv
或者,如果您不希望-a
获得任何 arg 值,最好将选项字符串更改为不接收任何 as :ab:
。
通过检查OPTARG
for-a
是否不包含-
或不建议使用其他黑客来解决任何其他问题,因为它不符合getopts()
工作流程。
推荐阅读
- javascript - 输入明文时出现错误“文本字符串必须在文本中呈现...”
- r - 如何在r中选择并重复数据框中的多行
- javascript - 当名称字段中存在任何重复值时,无法形成结构和更新标志值
- c++ - 这个函数是返回一个正确的 R 值引用还是返回一个副本?
- excel - How to fix this "ambiguous name detected Worksheet_Change"?
- openedge - FILL-IN基本组件中如何避免千位分隔符
- sql - 在 SQL Server Management Studio (SSMS) 中禁用空白文本的副本
- javascript - ag-grid:key.forEach 在调整列大小时不是函数控制台错误
- nvidia-jetson - Jetson nano 模块与生产开发人员
- javascript - 在 JSX 中的条件语句中的 SetState 反应原生?