在POSIX sh中替代Bash的[[ ... ]]:脚本兼容性实践

news/2025/12/4 8:25:19/文章来源:https://www.cnblogs.com/qife122/p/19304866

文章正文markdown格式数据

POSIX sh中替代使用Bash的[[ ... ]]的方法

提问:

我正在使用以下代码来解析传递给脚本的第一个参数。它具有错误处理功能,并且工作方式完全符合我的要求:

if [ -z "$action" ]; thenprintf "[${c_RED}ERROR${c_RESET}] The action must be specified.\n" && exit 1
elif [[ "$action" =~ ^-{0,2}[Hh][Ee][Ll][Pp]$ ]] || [[ "$action" =~ ^-{0,2}[Hh]$ ]]; thenprintf "Usage: pocsag [ACTION] [INPUTMETHOD/REDACTION] [OUTPUTMETHOD/PATHTOFILE/SERVICEACTION]                              "printf "Examples:                                                                                                           "printf "  pocsag decode rtlsdr cli                                                                                          "printf "  pocsag decode netcat file                                                                                         "printf "  pocsag redact medical ~/media/signals/pocsag/decoded/POCSAG*                                                      "printf "  pocsag service rtlsdr start                                                                                       "printf "                                                                                                                    "printf "Actions:                                                                                                            "printf "  decode                    Envoke the usage of the input tuner, sox and multimon-ng to decode the signals.         "printf "  redact                    Copy file but redact regex matching lines of a file. For example: Removing medical TXs. "printf "  service                   Used to start/stop the systemd service in user's ~/.config. Relies on rtlsdr_pager_rx   "printf "                                                                                                                    "printf "Input Methods:                                                                                                      "printf "  rtlsdr                    Use an RTLSDR device plugged into the local computer.                                   "printf "  netcat                    Listen to localhost:7355 using netcat, then process and output locally.                 "printf "                                                                                                                    "
elif ! [[ "$action" =~ ^([Dd][Ee][Cc][Oo][Dd][Ee]|[Rr][Ee][Dd][Aa][Cc][Tt]|[Ss][Ee][Rr][Vv][Ii][Cc][Ee])$ ]]; thenprintf "[${c_RED}ERROR${c_RESET}] The action must be 'decode', 'redact' or 'service'.\n" && exit 3
fi

现在我希望使这个脚本符合POSIX标准,因此不能使用[[ ]]这个Bash特有的语法。我应该如何实现这一点?使用复杂的case语句吗?肯定有更好的方法。

答案 2(得分:7)

exprawk是两个可以进行正则表达式匹配的POSIX工具。expr使用基本正则表达式¹,awk使用扩展正则表达式的变体²。expr存在许多设计缺陷,通常被认为已过时(甚至POSIX也建议不要使用它),因此最好避免使用。
虽然几个shell(至少是zsh和yash)的[(即test)内置函数可以通过=~操作符进行正则表达式匹配,但这是POSIX标准之外的扩展,因此不能在sh脚本中使用。
在这里,您可以定义使用awk进行正则表达式匹配的shell辅助函数match(以及用于不区分大小写变体的imatch):

match() {awk -- 'BEGIN{exit(ARGV[1] !~ ARGV[2])}' "$@"
}
imatch() {awk -- 'BEGIN{exit(tolower(ARGV[1]) !~ tolower(ARGV[2]))}' "$@"
}if imatch "$action" '^-{0,2}h(elp)?$'; then...

请注意,严格来说,imatch并不是进行不区分大小写匹配的适当方法,但对于仅ASCII输入和正则表达式来说已经足够好了。
在这里,使用case结构可能同样简单,并且使其更清晰:

case $action in([hH] | -[hH] | --[hH] | [Hh][Ee][Ll][Pp] | -[Hh][Ee][Ll][Pp] | --[Hh][Ee][Ll][Pp]) ...;;
esac

您也可以先删除一个或两个前导的-并转换为小写:

tolower() {awk -- 'BEGIN{for (i = 1; i < ARGC; i++) print tolower(ARGV[i])}' "$@"
}
action=${action#-} action=${action#-}
action=$(tolower "$action")case $action in(h | help) ...
esac

这里使用awktolower()进行大小写转换。POSIX工具集中的替代方案包括dd conv=lcasetr '[:upper:]' '[:lower:]',但在GNU工具集中,截至撰写本文时,只有awk版本适用于多字节字符。³
请注意,[[...]]结构最初来自ksh,而不是bash。它已被包括zsh、bash、yash、busybox ash在内的几个shell复制,并有许多变体。
其中的正则表达式匹配首先于2004年在zsh中添加了-pcre-match操作符(PCRE具有不区分大小写匹配的语法),然后是bash于2005年在3.1版本中添加了=~⁴(进行ERE匹配)。
后来=~被添加到更多shell中,包括zsh和ksh93。在zsh中,对于=~,您可以通过(取消)设置rematchpcre选项来选择ERE或PCRE。
ksh93的模式匹配在2006年的ksh93r+版本中扩展为具有正则表达式匹配语法⁵,因此例如您可以执行[[ $action = ~(Ei)^-{0,2}h(elp)?$ ]](在zmodload zsh/pcre之后,相当于zsh的[[ $action -pcre-match '(?i)^-{0,2}h(elp)$' ]])。

¹ 使用其:操作符。另请注意,expr正则表达式匹配隐式地在开头锚定(就像有一个隐藏的^),而不是在结尾。
² 除了标准ERE外,还识别像\n/\b/\123...这样的内容,这意味着除了busybox awk之外,您无法获得反向引用(标准ERE中也没有反向引用)。请注意,对区间操作符({x,y})的支持在一些awk实现中相对较晚才添加(就mawk而言是非常近期)。
³ 不过,已知一些GNU/Linux发行版维护了解决此问题的补丁,因此您的体验可能有所不同。请注意,Ubuntu上的默认awk实现mawk也不支持多字节字符。
=~可能源自perl中的相同操作符,而perl又可能源自awk的~操作符。
⁵ 本质上,其=~操作符在底层执行一个前面附加了~(E)的模式=
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/986333.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年可靠的轴心加热农用榨油机/温控农用榨油机行业内口碑厂家排行榜

2025年可靠的轴心加热农用榨油机/温控农用榨油机行业内口碑厂家排行榜行业背景与市场趋势随着农业机械化水平的不断提高和食用油安全意识的增强,农用榨油机行业迎来了新一轮发展机遇。2023-2025年,全球榨油机市场规模…

用 Spark Shell 做交互式数据分析从入门到自包含应用 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年知名的双锥干燥机厂家最新用户好评榜

2025年知名的双锥干燥机厂家用户好评榜 开篇:行业背景与市场趋势 双锥干燥机作为化工、医药、食品等行业的关键设备,凭借其高效的干燥性能、稳定的运行表现以及良好的密封性,在真空干燥领域占据重要地位。随着202…

2025年比较好的农田灌溉水泥涵管用户口碑最好的厂家榜

2025年农田灌溉水泥涵管用户口碑的厂家榜行业背景与市场趋势随着我国农业现代化进程的不断推进,农田水利基础设施建设日益受到重视。作为农田灌溉系统中的重要组成部分,水泥涵管因其耐久性强、成本适中、施工方便等优…

2025年评价高的综合管廊水泥涵管/环保水泥涵管热门厂家推荐榜单

2025年评价高的综合管廊水泥涵管/环保水泥涵管热门厂家推荐榜单行业背景与市场趋势随着我国城市化进程的加速推进和"海绵城市"建设的深入开展,综合管廊作为城市地下空间集约化利用的重要载体,正迎来前所未…

【GitHub每日速递 20251204】LightRAG:集多功能于一身,检索增强生成新利器!

原文: https://mp.weixin.qq.com/s/BC8tCReIkciOjQl330SD4g LightRAG:集多功能于一身,检索增强生成新利器! LightRAG 是一个 简单高效的检索增强生成(RAG) 的 框架。简单讲,它通过快速检索外部知识来提升大模型生…

Vite 8 Beta:Rolldown 驱动的新一代 Vite

Vite 8 Beta:Rolldown 驱动的新一代 Vite 由 Rolldown 驱动的 Vite 8 首个 Beta 版本已经发布。Vite 8 带来了显著更快的生产构建性能,并为后续能力升级解锁了更多可能。开发者可以通过将 vite 升级到 8.0.0-beta.0 …

软件设计实验24,25:模板方法模式,模板方法模式

实验 24:模板方法模式 本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解模板方法模式的动机,掌握该模式的结构; 2、能够利用模板方法模式解决实际问题。 [实验任务一]:数据库连接 对数据库的操作…

降本增效进入深水区:2025 中国企业最值得关注的生成式 AI 成本效益方案

一|为什么“成本效益”成为生成式 AI 项目成败的关键? 2024–2025 年,生成式 AI 正式进入企业级落地阶段:智能客服、知识库问答、合同审核、财务流程自动化、行业 Agent、内容生成都在加速推进。 但越往后走,越多…

2025年靠谱的纪念币售卖机高评价厂家推荐榜

2025年靠谱的纪念币售卖机高评价厂家推荐榜 开篇:行业背景与市场趋势 近年来,随着纪念币收藏市场的持续升温,纪念币售卖机作为一种便捷、高效的零售终端设备,逐渐成为各大商场、博物馆、景区及金融机构的热门选择…

一键降重降AI,学术创作高效加速器 - BUAA

毕业季的校园里,论文查重的焦虑如同初夏的热浪般席卷而来。当“翟天临,你睡了吗?”这句调侃又一次在学生群体中刷屏,无数毕业生正与查重系统展开一场惊心动魄的“攻防战”。如今,不仅重复率让人神经紧绷,新增的A…

实用指南:MyBatis完整教程IDEA版(1)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年质量好的纪念章售卖机最新TOP厂家排名

2025年质量好的纪念章售卖机TOP厂家排名 行业背景与市场趋势 随着自助零售行业的快速发展,纪念章售卖机作为细分市场的重要品类,近年来需求显著增长。纪念章不仅具有收藏价值,还广泛应用于旅游景点、博物馆、体育…

如何零成本验证生成式 AI?中国企业可用的免费试用平台全解析

一|为什么“免费试用”成为中国企业落地生成式 AI 的第一步? 过去一年,越来越多中国企业开始把生成式 AI 引入业务链路:智能客服、内部知识库、营销内容生成、RAG 系统、行业 Agent、预测与自动化处理等场景都进入…

中国企业如何选择 NLP 大模型?2025 最值得关注的生成式 AI 能力图谱

一|为什么中国企业在 2025 年重新关注 NLP 大模型? 过去一年,“让内容读得懂”“让文档答得出”“让客服自动回复”“让知识库变得可对话”已经成为中国企业最优先推进的智能化任务。 而支撑这些场景的核心,就是 N…

2025年口碑好的自动寻址售货机厂家推荐及选购指南

2025年口碑好的自动寻址售货机厂家推荐及选购指南行业背景与市场趋势随着人工智能、物联网技术的快速发展,自动寻址售货机行业正迎来前所未有的增长机遇。根据市场研究数据显示,2024年全球智能售货机市场规模已突破5…

实时数据时代:哪些生成式 AI 工具最适合中国企业做分析与洞察?

一|为什么实时数据分析成为中国企业的刚需? 在 2025 年的数字化竞争中,中国企业已经从“是否拥有数据”走向“是否能实时理解数据、立即采取行动”。 无论是制造、零售、金融、能源,还是客服、供应链、物流等行业,…

2025年比较好的储能展会搭建/展会实力优选榜

2025年储能展会搭建/展会实力优选榜 行业背景与市场趋势 随着全球能源转型加速,储能技术作为可再生能源规模化应用的关键支撑,正迎来爆发式增长。据彭博新能源财经(BNEF)预测,2025年全球储能市场规模将突破1000…

推荐几家国内商用咖啡机:从场景适配到性能解析

在商业服务场景中,商用咖啡机的选择直接关系到饮品出品效率与消费者体验。无论是连锁餐饮、办公空间还是酒店大堂,一台适配场景需求的咖啡机不仅能提升服务质量,更能为运营环节注入稳定支持。国内商用咖啡机品牌近年…

cloudevents + jmespath 简单规则执行

cloudevents + jmespath 简单规则执行实际上属于一个简单的业务场景,数据实体基于了cloudevents,但是希望进行里边数据的check,对于不用的check 结果会有一些action(比如发送通知等),以下是一个简单实现示例 参考…