Bash getopt 使用


本文摘自网络,作者,侵删。

背景

需要写个shell脚本,运行在服务器上(centos),处理一些简单的参数。

选型

Node.js/Python要考虑服务器上的版本,临时小脚本,也没必要去规范/统一服务器上的版本。
所以选择Bash。

接下来看到小白文章里都会介绍getopt和getopts,就选了个支持长选项(--key1 val1 这样的用法)的getopt, 弯路就此开始。

爬坑

坑1

macOS 上的getopt是 BSD UNIX implementation of standalone getopt command, 也就是说,本地调试好的脚本,拿到Linux上执行,是跑不通的,因为对参数解析的处理不同。

坑2

在macOS上装了 gnu-getopt, 然而拿到Linux上执行,再次跑不通。
研究一番,发现还是有差异,macOS上,gnu-getopt是个命令,而在Linux上,getopt(GNU)是个C库函数,会被getopt命令调用。而这个getopt命令,和gnu-getopt命令的实现效果也不一样。

坑3

新玩意儿上手,从小白建议开始,有时候不坏,但在mac上写shell,拿去Linux上执行,这种要提前有“兼容性”危机感,还是先搜索下“最佳实践”为秒。以往也有在grep(也可能是在sed)的用法上困顿好久的经历。

换做Python可能是个不错的选择,可以提前消除兼容性危机感。在运维群体中的流行度也比Node.js高太多,资料会多很多。
如果是要发行一个对外稳定使用的cli工具,那Golang可能更佳,不需要纠结环境依赖。

BashFAQ 中建议永不使用 getopt, 而应使用getops

Unless it's the version from util-linux, and you use its advanced mode, never use getopt(1). getopt cannot handle empty >arguments strings, or arguments with embedded whitespace. Please forget that it ever existed.

The POSIX shell (and others) offer getopts which is safe to use instead.

https://stackoverflow.com/a/2728625/251496

而这里,建议如果需要长选项,别用getopts去模拟,有隐患

https://stackoverflow.com/a/402410/251496

结论

如果不希望爬这么多坑,推荐使用getopts,因为它在The POSIX shell的范围。
推荐不去使用长选项(因为getopts对此并没有原生支持)。

过程中找到的好资料:

  • BashGuide - Greg's Wiki
  • BashFAQ - Greg's Wiki

本文来自:简书

感谢作者:yicone

查看原文:Bash getopt 使用

相关阅读 >>

Golang 什么时候用锁

Golang中方法的receiver为指针和不为指针有什么区别

Go开源说第四期:Go-zero解读与最佳实践(上)

Go fmt

开发者的福音,Go也支持linq了

关于 Golang 字符串 格式化

Go从学会到学废】(零) Golang简介

Golang如何生成json及解析json

visdom: rust版使用类jquery api的html解析操作库

Golang基础-单元测试与mock

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...