news 2026/7/10 8:03:43

Shell脚本精读 · S13-01 | POSIX sh 与 Bash:语法对照表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Shell脚本精读 · S13-01 | POSIX sh 与 Bash:语法对照表

模块:S13 可移植性与规范
篇号:S13-01 / 42
预计阅读:50 分钟
主线:Bash(对照 POSIXsh


文章目录

    • 本篇目标
    • 30 秒速览
    • 正文
      • 1. 先看清 shebang
      • 2. POSIX sh 与 Bash 关系(够用理解)
      • 3. 总对照表(语法)
      • 4. 条件表达式(最常踩坑)
        • 4.1 `[` vs `[[`
        • 4.2 整数比较
        • 4.3 组合条件
      • 5. 参数展开
      • 6. 循环与控制
      • 7. 函数与作用域
      • 8. `set` 选项
      • 9. 读脚本:红旗列表
      • 10. 何时选 sh、何时选 Bash
      • 11. 从 Bash 迁到 sh 的替换思路(预览)
      • 12. 与 ShellCheck
    • 读脚本检查清单
    • 练习
      • 判断题
      • 改错题
      • 对照题
    • 下一篇预告

本篇目标

建立POSIX shBash语法对照:读到#!/bin/sh却满篇[[(( ))时能判断风险;写脚本时能决定坚持 POSIX还是明确 Bash。本篇是对照表;编写清单与command/printfS13-02


30 秒速览

  • POSIX sh:各系统上的/bin/sh(可能是dashbash 的 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常为dash(Debian/Ubuntu)或bash --posix;macOS 曾长期不同。
  • 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-01
let部分S05-04
function f()❌(f()可以)S08-01
localS08-02
数组arr=( )S03-04
${arr[@]}S03-04
${var:0:5}子串S03-02
${var:-def}部分(POSIX 有子集)S03-02
for i in {1..10}S07-01
for (( ))S07-01
selectS08-04
getoptsS08-04
source❌(用.✅ 同.S08-03
$(cmd)S09-03
进程替换<( )S09-04
set -o pipefailS01-04、S09-02
PIPESTATUSS09-02
&>重定向S09-01
here-string<<<S09-01
[[&&S05-03
echo -e不可移植常用printfS13-02
read -rS07-02
trapEXIT部分S11-01
flock非 POSIX 命令常见S11-02
timeout非 POSIX 命令GNUS11-02

4. 条件表达式(最常踩坑)

4.1[vs[[
# POSIXif["$a"="$b"];thenif[-f"$file"];then# Bash onlyif[["$a"=="$b"]];thenif[["$f"==*.log]];then
4.2 整数比较
# POSIX["$n"-eq10]# Bash(脚本内常用,但 sh 不行)((n>=10))
4.3 组合条件
# POSIX:两个 [ 或 -a(不推荐 -a)["$a"="x"]&&["$b"="y"]# Bash[["$a"=="x"&&"$b"=="y"]]

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=$((n+1))done# Bash onlyforiin{1..10};dofor((i=0;i<10;i++));do

break/continue:POSIX 均有。


7. 函数与作用域

# POSIX 函数myfunc(){echo"$1"}# Bash 扩展myfunc(){localx=1declare-in=0}

export -f:Bash,非 POSIX。


8.set选项

选项POSIX shBash
set -e
set -u部分
set -o pipefail
set -x

#!/bin/sh+set -euo pipefail:在dash-u通常可用pipefail不可用(ShellCheckSC3043)。


9. 读脚本:红旗列表

见到#!/bin/sh(或dash)却出现:

  • [[(( )){1..10}
  • source(应用.
  • 数组、${var//x/y}
  • <( )&>
  • select

要么 shebang 错了,要么脚本在部分系统会挂。应改为#!/usr/bin/env bash或改写成 POSIX(S13-02)。

见到#!/usr/bin/env bash:可合理使用专栏全部 Bash 特性。


10. 何时选 sh、何时选 Bash

POSIX shBash
嵌入式/极简 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. f
pipefail拆开管道或显式查$?

细节与command/printfS13-02


12. 与 ShellCheck

shellcheck-sshscript.sh# 按 POSIX 扫shellcheck-sbashscript.sh# 按 Bash 扫

shebang 与-s一致。见S12-02


读脚本检查清单

  • 第一行shebang与文内语法是否一致?
  • #!/bin/sh下是否误用[[、数组、pipefail
  • 需要模式匹配时,sh 是否改用case
  • 整数比较是否用-eq而非(( ))(在 sh 脚本里)?
  • 是否用printf代替echo -e(S13-02)?

练习

判断题

  1. #!/bin/sh保证脚本在所有 Unix 上由 Bash 执行。
  2. [[是 Bash 扩展,不是 POSIX。
  3. getopts可在 POSIX sh 脚本中使用。
  4. set -o pipefail在所有/bin/sh实现上都可用。
  5. 读脚本时 shebang 与语法冲突应优先信语法还是信 shebang?——应让它们一致。
参考答案
  1. 错。
  2. 对。
  3. 对。
  4. 错。
  5. 应一致;冲突时按更严格的 sh 理解或改 shebang。

改错题

下面脚本声称兼容sh,请指出 Bash 专有写法:

#!/bin/shset-euopipefailfiles=("$@")[[${#files[@]}-lt1]]&&exit2source./lib.shforiin{1..3};do[["$i"=~^[0-9]+$]]&&run"$i"done
参考答案
  • 数组files=( )${#files[@]}
  • [[=~、模式
  • pipefail(dash sh 不行)
  • source.
  • {1..10}
    应改为#!/usr/bin/env bash或逐项 POSIX 化(S13-02)。

对照题

将下列 Bash 改为POSIX[/test风格(不要求可运行,表达即可):

  1. [[ -f "$f" && -r "$f" ]]
  2. (( $# >= 1 ))
  3. [[ "$x" == *.log ]]
参考答案
  1. [ -f "$f" ] && [ -r "$f" ]
  2. [ "$#" -ge 1 ]
  3. case "$x" in *.log) ... ;; esac[ -f "$x" ]等按语义改写

下一篇预告

S13-02:《可移植脚本编写清单与command/printf》— 实战 checklist、command -v、避免echo陷阱,完成 S13 模块。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/10 8:02:08

TikTok投流素材产能突围:爆款视频复刻与生成工具横向测评

在TikTok出海赛道&#xff0c;素材的生命周期正被极度压缩。一条跑量极好的视频&#xff0c;往往几天后就会遭遇流量断崖。面对庞大的日更消耗&#xff0c;跨境团队每天都在各大社群里发问&#xff1a;“TikTok 短视频生成工具哪家好&#xff1f;”以及更具体的“TikTok 爆款视…

作者头像 李华
网站建设 2026/7/10 8:00:52

2026年焊接加工选平台犯难?瑞欧量具高精度、优服务值得关

三维柔性焊接平台哪家好&#xff1f;瑞欧量具值得关注在焊接加工领域&#xff0c;三维柔性焊接平台发挥着至关重要的作用&#xff0c;它不仅能提高焊接精度和效率&#xff0c;还能降低生产成本。然而&#xff0c;面对市场上众多的三维柔性焊接平台品牌&#xff0c;许多用户在选…

作者头像 李华
网站建设 2026/7/10 7:58:52

痛点场景还原

假设做一个最经典的追及动画&#xff1a;甲从原点出发&#xff0c;速度 v 1 2 &#xff1b;乙从 x 10 处同向出发&#xff0c;速度 v 2 5 &#xff0c;问多久追上。 如果用纯手工方式写 Manim&#xff1a; class PainfulCatchUp(Scene): def construct(self): # 手动列方程并求…

作者头像 李华
网站建设 2026/7/10 7:54:51

WordPress迁移现代技术栈:性能提升300%的全栈实践指南

&#x1f680; 30款热门AI模型一站整合&#xff0c;DeepSeek/GLM/Qwen 随心用&#xff0c;限时 5 折。 &#x1f449; 点击领海量免费额度 如果你最近还在考虑用WordPress建站&#xff0c;可能需要先了解一个事实&#xff1a;WordPress虽然仍是全球使用最广泛的CMS&#xff…

作者头像 李华