macOS中getopt工具无法识别带空格的字符串参数问题
macOS下getopt处理带空格参数丢失内容的原因
你遇到的问题根源在于macOS自带的是BSD版本的getopt,而Linux系统使用的是GNU版本的getopt,二者的行为逻辑存在本质差异:
参数转义处理不同
GNU getopt在处理包含空格的参数时,会自动为参数添加引号转义,生成的TEMP变量内容会将"testing app"保留为带引号的完整字符串,执行eval set -- "$TEMP"时能正确识别为单个参数。
但BSD getopt不会自动添加引号转义,生成的TEMP中testing app是无引号的纯文本,eval执行时会把空格当作参数分隔符,将其拆分为两个独立参数,最终$PROJECT只能获取到第一个部分testing。默认行为的兼容性差异
GNU getopt对长选项的带空格参数支持是默认开启的,而BSD getopt没有这个默认处理。如果要在macOS上让脚本正常工作,有两种常见方案:- 通过Homebrew安装GNU版本的getopt(包名为
gnu-getopt),使用ggetopt替代原生getopt - 改用更兼容的参数解析方式,比如直接通过shell的
case语句遍历$@,避开getopt的差异问题
- 通过Homebrew安装GNU版本的getopt(包名为
内容的提问来源于stack exchange,提问作者James Taylor
相关产品推荐
相关产品推荐

