发布时间:2026/7/10 8:03:52
Shell脚本精读 · S13-01 | POSIX sh 与 Bash:语法对照表 模块S13 可移植性与规范篇号S13-01 / 42预计阅读50 分钟主线Bash对照 POSIXsh文章目录本篇目标30 秒速览正文1. 先看清 shebang2. POSIX sh 与 Bash 关系够用理解3. 总对照表语法4. 条件表达式最常踩坑4.1 [ vs [[4.2 整数比较4.3 组合条件5. 参数展开6. 循环与控制7. 函数与作用域8. set 选项9. 读脚本红旗列表10. 何时选 sh、何时选 Bash11. 从 Bash 迁到 sh 的替换思路预览12. 与 ShellCheck读脚本检查清单练习判断题改错题对照题下一篇预告本篇目标建立POSIX sh与Bash的语法对照读到#!/bin/sh却满篇[[、(( ))时能判断风险写脚本时能决定坚持 POSIX还是明确 Bash。本篇是对照表编写清单与command/printf在S13-02。30 秒速览POSIX sh各系统上的/bin/sh可能是dash、bash 的 posix 模式等语法最小公共子集。Bash扩展多——[[、(( ))、数组、{1..10}、pipefail、进程替换等。shebang 与内容要一致#!/bin/sh里不要写 Bash 专用语法。可移植优先[、test、$(( ))、printf、.、getopts。本专栏主线是Bash需要sh时查本篇 S13-02。正文1. 先看清 shebang第一行含义#!/bin/sh用系统sh解释不保证是 Bash#!/usr/bin/env bash明确要Bash专栏推荐#!/bin/bashBash路径写死部分系统无此路径读脚本第一问第一行承诺的运行时是否支持下文里的 Bash 语法#!/bin/shif[[-f$f]];then# 错[[ 不是 POSIX常见情况作者本机/bin/sh指向 bash脚本在dash/Alpine busybox sh上直接报错。2. POSIX sh 与 Bash 关系够用理解POSIX标准文档规定 shell 语法子集。实现Linux 上sh常为dashDebian/Ubuntu或bash --posixmacOS 曾长期不同。Bash超集bash script.sh可跑 Bash 语法sh script.sh只能跑 POSIX加实现少量扩展。专栏策略教学用 Bash交付若要求sh按本篇改写法。3. 总对照表语法特性POSIX shBash专栏条件if [ ]✅✅S05-01[[ ]]❌✅S05-03正则~❌✅[[ ]]S05-03模式 *.log❌✅[[ ]]S05-03算术测试(( ))❌✅S05-04[ $n -eq 10 ]✅✅S05-01let部分✅S05-04function f()❌f()可以✅S08-01local❌✅S08-02数组arr( )❌✅S03-04${arr[]}❌✅S03-04${var:0:5}子串❌✅S03-02${var:-def}部分POSIX 有子集✅S03-02for i in {1..10}❌✅S07-01for (( ))❌✅S07-01select❌✅S08-04getopts✅✅S08-04source❌用.✅ 同.S08-03$(cmd)✅✅S09-03进程替换( )❌✅S09-04set -o pipefail❌✅S01-04、S09-02PIPESTATUS❌✅S09-02重定向❌✅S09-01here-string❌✅S09-01[[内—✅S05-03echo -e不可移植常用用printfS13-02read -r✅✅S07-02trapEXIT部分✅S11-01flock非 POSIX 命令常见S11-02timeout非 POSIX 命令GNUS11-024. 条件表达式最常踩坑4.1[vs[[# POSIXif[$a$b];thenif[-f$file];then# Bash onlyif[[$a$b]];thenif[[$f*.log]];then4.2 整数比较# POSIX[$n-eq10]# Bash脚本内常用但 sh 不行((n10))4.3 组合条件# POSIX两个 [ 或 -a不推荐 -a[$ax][$by]# Bash[[$ax$by]]5. 参数展开写法POSIX shBash$1$✅✅${var:-def}✅✅${var:def}✅✅${#var}✅✅${var#prefix}❌✅${var/pat/rep}❌✅数组${a[]}❌✅写#!/bin/sh时避免S03-02里 Bash 专有展开S13-02 给替代写法。6. 循环与控制# POSIXforfin$;dowhile[$n-lt10];don$((n1))done# Bash onlyforiin{1..10};dofor((i0;i10;i));dobreak/continuePOSIX 均有。7. 函数与作用域# POSIX 函数myfunc(){echo$1}# Bash 扩展myfunc(){localx1declare-in0}export -fBash非 POSIX。8.set选项选项POSIX shBashset -e✅✅set -u部分✅set -o pipefail❌✅set -x✅✅#!/bin/shset -euo pipefail在dash上-u通常可用pipefail不可用ShellCheckSC3043。9. 读脚本红旗列表见到#!/bin/sh或dash却出现[[(( )){1..10}source应用.数组、${var//x/y}( )select→要么 shebang 错了要么脚本在部分系统会挂。应改为#!/usr/bin/env bash或改写成 POSIXS13-02。见到#!/usr/bin/env bash可合理使用专栏全部 Bash 特性。10. 何时选 sh、何时选 Bash选POSIX sh选Bash嵌入式/极简 rootfs开发机、CI、团队统一 Bash明确要求dash兼容需要数组、[[、pipefail被sh调用的极小片段复杂逻辑、运维工具专栏默认不要假设「sh 就是 bash」。11. 从 Bash 迁到 sh 的替换思路预览BashPOSIX 倾向[[ -f f ]][ -f f ](( $# 1 ))[ $# -lt 1 ][[ $x *.log ]]case $x in *.log)${s#pre}sed/expr笨但可移植source f. fpipefail拆开管道或显式查$?细节与command/printf在S13-02。12. 与 ShellCheckshellcheck-sshscript.sh# 按 POSIX 扫shellcheck-sbashscript.sh# 按 Bash 扫shebang 与-s一致。见S12-02。读脚本检查清单第一行shebang与文内语法是否一致#!/bin/sh下是否误用[[、数组、pipefail需要模式匹配时sh 是否改用case整数比较是否用-eq而非(( ))在 sh 脚本里是否用printf代替echo -eS13-02练习判断题#!/bin/sh保证脚本在所有 Unix 上由 Bash 执行。[[是 Bash 扩展不是 POSIX。getopts可在 POSIX sh 脚本中使用。set -o pipefail在所有/bin/sh实现上都可用。读脚本时 shebang 与语法冲突应优先信语法还是信 shebang——应让它们一致。参考答案错。对。对。错。应一致冲突时按更严格的 sh 理解或改 shebang。改错题下面脚本声称兼容sh请指出 Bash 专有写法#!/bin/shset-euopipefailfiles($)[[${#files[]}-lt1]]exit2source./lib.shforiin{1..3};do[[$i~^[0-9]$]]run$idone参考答案数组files( )、${#files[]}[[、~、模式pipefaildash sh 不行source→.{1..10}应改为#!/usr/bin/env bash或逐项 POSIX 化S13-02。对照题将下列 Bash 改为POSIX[/test风格不要求可运行表达即可[[ -f $f -r $f ]](( $# 1 ))[[ $x *.log ]]参考答案[ -f $f ] [ -r $f ][ $# -ge 1 ]case $x in *.log) ... ;; esac或[ -f $x ]等按语义改写下一篇预告S13-02《可移植脚本编写清单与command/printf》— 实战 checklist、command -v、避免echo陷阱完成 S13 模块。

相关新闻

2026/7/10 8:03:52

OpenClaw 2.6.4 Windows零代码部署实战指南

1. 项目概述:这不是“一键安装”,而是 Windows10 上真正可落地的 OpenClaw 零代码部署闭环OpenClaw 2.6.4 这个版本在开发者圈子里最近被反复提起,不是因为它加了什么炫酷的新模型,而是它第一次把“零代码部署”从宣传口号变成了 …

2026/7/10 8:03:52

学校用知网还是维普都要降 AI 率?这样一次降到 20% 以内

学校用知网还是维普都要降 AI 率?这样一次降到 20% 以内 你现在最头疼的,可能不是论文写得好不好,而是根本搞不清学校到底用哪个平台查。同学群里有人说学院走的是知网,有人说答辩前又要过一遍维普,还有人说两个都要传…

2026/7/10 9:03:55

基于 HT for Web 的智慧水泥工厂数字孪生可视化系统技术实现方案

针对水泥行业产线流程长、设备密集、能耗管控复杂、安全监管难度大、多系统数据孤岛等行业痛点,本文基于图扑自研HT for Web前端可视化引擎(底层基于 WebGL/Canvas 纯前端渲染架构),设计一套面向流程制造的 B/S 架构数字孪生管控平…

2026/7/10 9:03:55

Vertex AI Pipelines自定义Docker镜像生产实践指南

1. 项目概述:为什么用自定义Docker镜像跑Vertex AI Pipelines,而不是直接用Google预置环境?“Vertex AI pipelines for beginners using custom Docker images [Part 2]”这个标题一出来,我就知道——这不是一篇讲“怎么点几下控制…

2026/7/10 8:58:55

EDUSRC | 记一次认证绕过接管平台

参数置空获取平台用户信息 (1)每次看到这种干净整洁的注册页面,就感觉要出货了,主要是页面看着太舒服了 (2)注册账号进入平台,进行功能点测试 (3)个人信息数据包看到用户…

2026/7/10 5:21:51

国内大模型选型与企业级落地实战指南

我不能提供任何关于访问境外网络信息的技术方案或变通方法。根据中国法律法规和网络管理要求,所有互联网服务必须遵守国家关于网络安全、数据安全和内容安全的规定。ChatGPT及其后续版本(如所谓“GPT-5”)是由境外机构研发的大语言模型&#…

2026/7/10 2:34:05

三步实战方案:高效获取智慧教育平台电子课本PDF的完整流程

三步实战方案:高效获取智慧教育平台电子课本PDF的完整流程 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内容。 项目…

2026/7/10 0:02:49

5大实战技巧:用ExifToolGUI轻松解决照片元数据管理难题

5大实战技巧:用ExifToolGUI轻松解决照片元数据管理难题 【免费下载链接】ExifToolGui A GUI for ExifTool 项目地址: https://gitcode.com/gh_mirrors/ex/ExifToolGui 你是否曾为整理旅行照片时发现拍摄时间错乱而头疼?是否需要在数百张照片中批量…

2026/7/10 6:36:15

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…