linux中bash与sh脚本区别

一.基本对比

1.基础概念

#!/bin/bash # 使用 bash shell 执行脚本

#!/bin/sh # 使用系统默认的 sh 执行脚本

2.主要区别

二.实践建议

1.何时使用 #!/bin/bash

#!/bin/bash

以下情况使用 bash:

1.1. 需要数组

declare -a servers=("web1" "web2" "db1")

1.2. 需要进程替换

comm -23 <(sort file1) <(sort file2)

1.3. 需要正则表达式匹配

if \[ "$input" =\~ \^\[A-Za-z+$ ]]; then

1.4. 需要高级字符串操作

filename="${fullpath##*/}" # 获取文件名

dirname="${fullpath%/*}" # 获取目录名

1.5. 需要关联数组

declare -A config

config"host"="localhost"

config"port"="8080"

1.6. 需要更多调试功能

set -euo pipefail # 严格模式

trap 'echo "错误发生在第 $LINENO 行"' ERR

1.7. 需要 here-string

read -r first_line <<< "$content"

2. 何时使用 #!/bin/sh

#!/bin/sh

以下情况使用 sh:

2.1. 系统启动脚本(init.d 脚本)

/etc/init.d/* 通常使用 sh 以保证兼容性

2.2. Docker 容器基础镜像

Alpine Linux 等小型镜像只有 sh

2.3. 需要最大兼容性的脚本

在多种 Unix 系统上运行

2.4. 简单的系统工具脚本

不需要 bash 高级特性

2.5. 嵌入式系统

资源有限的环境

2.6. 确保 POSIX 合规

用于标准化的项目

3.总结

建议:

个人脚本/项目脚本:使用 #!/bin/bash,享受丰富功能

系统脚本/发布脚本:使用 #!/bin/sh,确保最大兼容性

黄金法则:如果不确定是否需要 bash 特性,先用 #!/bin/sh 编写,遇到限制时再切换到 #!/bin/bash。

相关推荐
wuminyu2 小时前
Kafka中sendfile与mmap实现机制解析
java·linux·c语言·jvm·c++
新时代牛马2 小时前
嵌入式网络完整篇:从LwIP/以太网驱动到 Linux netdev 与排障
linux·网络·php
猿与禅2 小时前
Linux(Ubuntu)入门到实战:系统管理、常用命令与权限体系完整指南
linux·ubuntu·apt·进程管理·系统运维·用户权限·vi/vim
前端世界3 小时前
Linux服务器实战:NTP时间同步、SELinux权限与rsyslog日志管理,一次搞懂三大运维问题
linux·运维·服务器
Android系统攻城狮3 小时前
Linux Gstreamer深度解析之gst_audio_converter_new调用流程与实战(二十)
linux·运维·服务器·gstreamer音视频·音视频进阶
海宇服务3 小时前
零信任架构实战:基于海宇对外投资历史查询服务构建自动化供应商准入网关
运维·人工智能·架构·自动化
上海云盾-小余3 小时前
BGP 高防底层原理:TCP 异常流量识别与清洗机制
运维·网络·tcp/ip
言乐64 小时前
Python加速器4跨境网络加速器
运维·服务器·开发语言·网络·python
蓝速科技7 小时前
医院导诊 AI 数字人一体机场景适配与落地指南丨蓝速科技
运维·数据库·人工智能·科技·自然语言处理·技术分享
H_oRIZoN_8 小时前
Linux入门DAY41(51 单片机 串口与通信协议)
linux·运维·单片机