sh 与 bash 的用法
sh 与 bash 核心区别对
特性 | sh(Bourne Shell) | bash(Bourne-Again Shell) | 示例代码对比 |
---|---|---|---|
历史背景 | 1977年发布,Unix默认Shell | 1989年发布,兼容sh并扩展功能 | - |
功能扩展 | 仅支持基础功能 | 支持数组、命令行编辑、命令历史、条件增强等 | bash 支持 history 命令,sh 不支持 |
数组支持 | 不支持 | 支持索引数组和关联数组 | # bash arr=(1 2 3) echo ${arr[1]} # 输出 2 |
命令替换语法 | 仅支持 `command` |
支持 `command` 和 $(command) |
# sh/bash均支持 echo date # bash独有 echo $(date) |
条件判断 [[ ]] |
不支持,只能用 [ ] 或 test |
支持 [[ ]] 增强条件判断(模式匹配、逻辑操作符) |
# bash if [[ "abc" == a* ]]; then ... # sh 报错 |
字符串操作 | 无原生字符串截取/替换 | 支持 ${var:0:2} , ${var/old/new} 等操作 |
# bash str="hello" echo ${str:0:2} # 输出 "he" ``` |
算术运算 | 仅支持 expr 或外部工具 |
支持 $(( )) 和 let |
# sh sum= expr 1 + 2 # bash sum=$((1+2)) |
重定向增强 | 仅基础重定向(> , >> , 2> ) |
支持 &> 、进程替换(<(cmd) )等 |
# bash ls &> output.txt diff <(ls dir1) <(ls dir2) |
函数返回值 | 仅能通过 return 返回数字状态码 |
可返回任意数据(需通过 echo 或全局变量) |
# bash func() { echo "result"; } output=$(func) |
别名扩展 | 不支持参数化别名 | 支持带参数的别名(需结合 function ) |
# bash alias l='ls -l' l # 等效于 ls -l |
快捷键支持 | 无命令行快捷键(如 Ctrl+R 搜索历史) |
支持命令行编辑、历史搜索、自动补全等 | bash 中按 Ctrl+R 可反向搜索历史命令 |
示例代码对比
1. 数组操作(仅 bash 支持)
# bash 示例
fruits=("apple" "banana" "cherry")
echo ${fruits[1]} # 输出 banana
fruits[3]="orange" # 动态扩展数组
# sh 中尝试会报错:Syntax error: "(" unexpected
2. 条件判断 [[ ]]
vs [ ]
# bash 支持 [[ ]] 模式匹配
if [[ "file.txt" == *.txt ]]; then
echo "This is a text file."
fi
# sh 中必须使用 [ ] 或外部工具
if [ "$(echo "file.txt" | grep '\.txt$')" ]; then
echo "This is a text file."
fi
3. 算术运算
# bash 使用 $(( ))
result=$(( 3 + 5 * 2 )) # 输出 13
# sh 需依赖 expr
result=`expr 3 + 5 \* 2` # 注意转义符号
4. 字符串截取
# bash 字符串截取
str="hello_world"
echo ${str:6:5} # 输出 "world"
# sh 需使用外部工具(如 cut)
echo "$str" | cut -c7-11
5.变量赋值与输出
sh
和 bash
的代码基本相同,因为变量赋值和输出是基本的 shell 功能,两者都支持。
# sh 示例
#!/bin/sh
name="John"
echo "Hello, $name"
# bash 示例
#!/bin/bash
name="John"
echo "Hello, $name"
总结
- 兼容性:
bash
是sh
的超集,大多数sh
脚本可在bash
中运行,反之不成立。 - 脚本声明:
- 使用
#!/bin/sh
时,系统可能调用dash
(如 Ubuntu)或bash
的 POSIX 模式,禁用扩展功能。 - 使用
#!/bin/bash
可启用全部特性。
- 使用
- 推荐场景:
- 需兼容性 →
sh
(避免使用bash
扩展语法)。 - 需高级功能 →
bash
。
- 需兼容性 →
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
2022-02-18 Java 各版本新特性