getopts
和getopt
都是 Unix/Linux 系统中用于解析命令行选项的工具,但它们之间有一些关键的不同点:
•getopts 是大多数 shell(如 bash)内置的命令,不需要额外安装。它适用于简单的选项解析,可以处理带有参数的单个字符选项,识别短横线-
开头的选项。•getopt 是一个外部命令,通常Linux发行版会自带。它支持短选项和长选项,并且可以重组命令行参数以将所有选项放在非选项参数之前。
•getopts 比较简单,适合于脚本内部使用,当你的程序只需要处理有限数量的单字符选项时,这是一个很好的选择。它的语法相对直接,易于理解和使用。•getopt 更加复杂和灵活,它可以处理复杂的命令行选项组合,包括长选项、分组选项、带等号的选项值(如--output=file.txt
),以及更多高级特性。
•getopts 在遇到未知选项或缺少选项参数时会自动输出错误信息到标准错误流,并返回一个错误状态,这使得在脚本中处理这些情况变得容易。•getopt 的错误处理机制依赖于你如何调用它。你可以通过检查退出状态码来确定是否有问题发生,并根据需要采取行动。
•getopts 不会重排所有参数的顺序,它通过修改内置变量OPTARG
来依次获取参数。•getopt 会重新排列参数列表,把所有选项移到前面,而不管它们最初的位置如何。然后需要使用set
命令来重新设定位置参数。
•getopts 负责参数解析,可以方便地提取参数值。•getopt 只负责按规则重新对参数进行排列,进一步解析需要自行编写代码去处理。
使用getopts
的例子:
#!/bin/bash
while getopts "ab:cd:" Option; do
case $Option in
a) echo "a, next index: $OPTIND";;
b) echo "b's arg: $OPTARG, next index: $OPTIND";;
c) echo "c, next index: $OPTIND";;
d) echo "d's arg: $OPTARG, next index: $OPTIND";;
esac
done
shift $(($OPTIND - 1))
echo "left arg num: $#"
Ps: 每次 shell 或 shell 脚本被调用时,OPTIND
都会被初始化为 1。
脚本测试输出如下:
使用getopt
的例子参考前文 如何在Bash中解析命令行参数? 末尾的脚本 myscript。
综上所述,如果你的需求较为简单,推荐使用getopts
,因为它更简单易用;如果需要更复杂的功能,比如长选项或参数重排序,则应该考虑使用getopt
。
•help getopts•man getopt