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.变量赋值与输出

shbash 的代码基本相同,因为变量赋值和输出是基本的 shell 功能,两者都支持。

# sh 示例
#!/bin/sh
name="John"
echo "Hello, $name"

# bash 示例
#!/bin/bash
name="John"
echo "Hello, $name"

总结

  • 兼容性bashsh 的超集,大多数 sh 脚本可在 bash 中运行,反之不成立。
  • 脚本声明
    • 使用 #!/bin/sh 时,系统可能调用 dash(如 Ubuntu)或 bash 的 POSIX 模式,禁用扩展功能。
    • 使用 #!/bin/bash 可启用全部特性。
  • 推荐场景
    • 需兼容性 → sh(避免使用 bash 扩展语法)。
    • 需高级功能 → bash
posted @   little_lunatic  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
历史上的今天:
2022-02-18 Java 各版本新特性
点击右上角即可分享
微信分享提示