# Linux 其他 Shell 笔记:除了 bash,还有这些“好用工具”🐚
## 一、dash Shell:轻量级的“小快灵”选手 ⚡
dash 是 bash 的“精简版表弟”,源自 ash Shell,体积小、运行快,像个“轻便自行车”,适合快速执行简单任务,但功能没 bash 全,Ubuntu 里它藏在 `/bin/sh`(符号链接到 dash),一不小心就会踩坑~
### 1. dash 的特点:小而快,但功能有限 🚲
– ** 优势 **:启动快、占内存少,适合做系统初始化脚本(比如安装程序时的脚本),也适合嵌入式 Linux(资源有限的设备);
– ** 劣势 **:不支持 bash 的很多高级功能(比如数组、某些语法),写脚本时容易“水土不服”。
比如 Ubuntu 里输 `ls -l /bin/sh`,会看到 `/bin/sh -> dash`,这就是为什么有些 bash 脚本在 Ubuntu 里跑报错,因为默认用了 dash~
### 2. dash 脚本:这些坑要避开 ❌
写 dash 脚本和 bash 很像,但有几个关键区别,像骑自行车要避开减速带:
####(1)数学计算:只能用两种方式 🧮
bash 支持 `$[]`、`$(())`、`expr` 三种数学计算,dash 只支持 `$(())` 和 `expr`,用 `$[]` 会报错:
“`bash
#!/bin/dash
# 正确:用 $(())
a=10
b=5
c=$((a + b))
echo “a+b=$c” # 输出 15
# 错误:dash 不支持 $[]
# d=$[a – b] # 跑脚本会报错
“`
####(2)字符串比较:只能用“=”,不能用“==”📝
bash 里 `[$a == $b]` 和 `[$a = $b]` 都能用,dash 只认“=”,用“==”会报错:
“`bash
#!/bin/dash
str1=”hello”
str2=”hello”
# 正确:用 =
if [$str1 = $str2]; then
echo “ 字符串相同 ”
else
echo “ 字符串不同 ”
fi
# 错误:dash 不支持 ==
# if [$str1 == $str2]; then # 报错
“`
####(3)函数定义:只能用“函数名 ()”,不能用“function 函数名”🔧
bash 支持两种函数定义,dash 只认“函数名 ()”,加 `function` 关键字会报错:
“`bash
#!/bin/dash
# 正确:函数名 ()
say_hello() {
echo “Hello from dash!”
}
# 错误:dash 不支持 function 关键字
# function say_hi() { # 报错
# echo “Hi!”
# }
say_hello # 输出 Hello from dash!
“`
####(4)没有数组:存多数据要绕路 📦
bash 里 `arr=(1 2 3)` 很方便,dash 完全不支持数组,想存多个数据只能用变量拼接(比如用空格分隔):
“`bash
#!/bin/dash
# 用变量存多个数据,空格分隔
data=”1 2 3 4″
# 循环读取
for num in $data; do
echo “ 数字:$num”
done
“`
输出会依次显示 1、2、3、4,虽然麻烦,但能实现类似数组的效果~
### 3. 如何让脚本用 bash 跑:指定 shell 很重要 📌
如果写的是 bash 脚本,一定要在第一行写 `#!/bin/bash`,而不是 `#!/bin/sh`,否则 Ubuntu 里会用 dash 跑,导致报错:
“`bash
#!/bin/bash
# 明确指定用 bash,避免 dash
arr=(1 2 3) # bash 支持数组,没问题
echo “ 数组第 2 个元素:${arr[1]}” # 输出 2
“`
这样不管 `/bin/sh` 指向谁,脚本都会用 bash 跑,避免踩坑~
## 二、zsh Shell:功能强大的“全能选手”🚀
zsh 是 bash 的“升级版表哥”,集各家所长(bash、ksh、csh 的优点),还支持“插件扩展”,像个“变形金刚”,程序员超爱用,能自定义的地方特别多~
### 1. zsh 的亮点:功能多到眼花缭乱 ✨
– ** 自动补全 **:比 bash 强太多,输命令、路径、参数时,按 Tab 能智能补全(比如输 `cd /ho`,Tab 补全成 `cd /home`,甚至能补全命令参数);
– ** 命令历史 **:能跨终端同步历史命令,还能搜索历史(按 Ctrl+ R 输关键词,快速找之前的命令);
– ** 插件支持 **:有超多第三方插件(比如 `oh-my-zsh` 框架,自带很多主题和插件),能扩展功能(比如显示 Git 分支、自动纠正命令拼写);
– ** 模块加载 **:支持“按需加载模块”,比如需要高级数学功能就加载 `zsh/mathfunc`,需要 FTP 功能就加载 `zsh/zftp`,像给变形金刚装配件。
比如装了 `oh-my-zsh` 后,终端会显示当前 Git 分支,输错命令(比如 `sl`)会提示“是不是要输 `ls`”,超贴心~
### 2. 安装 zsh:两步搞定 🛠️
大部分 Linux 默认没装 zsh,装起来很简单:
– Ubuntu/Debian:`sudo apt install zsh`;
– CentOS/RHEL:`sudo yum install zsh`;
– 装完输 `zsh` 就能进入 zsh 界面,第一次进会让你选配置,选“2”(默认配置)就行。
想让 zsh 成为默认 Shell,输 `chsh -s /bin/zsh`,注销再登录就生效~
### 3. zsh 脚本:这些功能比 bash 爽 🎉
zsh 兼容 bash 脚本,还多了些好用功能,像变形金刚多了新技能:
####(1)数学计算:支持浮点数 🧮
bash 只能算整数(比如 `echo $((10/3))` 输出 3),zsh 能算浮点数,还支持高级数学函数(要加载模块):
“`bash
#!/bin/zsh
# 支持浮点数
a=10.5
b=3
c=$((a / b))
echo “10.5/3=$c” # 输出 3.5
# 加载 mathfunc 模块,支持 sqrt(开平方)
zmodload zsh/mathfunc
d=$((sqrt(16)))
echo “16 的平方根 =$d” # 输出 4.0
“`
####(2)repeat 命令:循环指定次数 🔄
bash 里循环 N 次要用 `for ((i=1; i<=N; i++))`,zsh 有 `repeat` 命令,更简洁:
“`bash
#!/bin/zsh
# 循环 5 次,打印“Hello zsh”
repeat 5 {
echo “Hello zsh”
}
“`
跑脚本会连续输出 5 次“Hello zsh”,比 bash 的 for 循环少写几行代码~
####(3)数组:支持关联数组(字符串索引)📚
bash 支持普通数组(数字索引),zsh 还支持关联数组(像字典,用字符串当索引),存键值对超方便:
“`bash
#!/bin/zsh
# 定义关联数组(键值对)
declare -A user_info
user_info[“name”]=”Alice”
user_info[“age”]=”25″
user_info[“city”]=”Beijing”
# 遍历关联数组
for key in “${(@k)user_info}”; do
echo “$key: ${user_info[$key]}”
done
“`
输出会显示:
`name: Alice`
`age: 25`
`city: Beijing`
像给数据贴了“标签”,找起来更直观~
####(4)模块扩展:需要啥功能就装啥 🧩
zsh 能加载各种模块,比如加载 `zsh/zftp` 模块,就能在脚本里用 FTP 下载文件,像给电脑装了新软件:
“`bash
#!/bin/zsh
# 加载 zftp 模块
zmodload zsh/zftp
# 连接 FTP 服务器(替换成你的 FTP 信息)
zftp open ftp.example.com username password
# 下载文件
zftp get “test.txt” “local_test.txt”
# 关闭连接
zftp close
echo “ 文件下载完成 ”
“`
不用额外装 FTP 客户端,zsh 模块直接搞定,超方便~
## 三、怎么选 Shell:看场景“对症下药”🎯
不同 Shell 有不同擅长的场景,像选工具干不同活:
### 1. 选 dash 的场景 🚲
– 写系统初始化脚本、安装脚本(需要快速启动,功能简单);
– 嵌入式 Linux(设备内存小、CPU 弱,跑不动 bash);
– 只需要执行简单命令,不需要高级功能(比如循环、简单判断)。
### 2. 选 zsh 的场景 🚀
– 日常终端使用(自动补全、命令历史超爽,提升效率);
– 写复杂脚本(需要浮点数、关联数组、模块扩展);
– 程序员开发(Git 集成、命令纠错等插件能省很多事)。
### 3. 选 bash 的场景 🏠
– 写跨 Linux 发行版的脚本(大部分 Linux 默认 bash,兼容性最好);
– 不需要 zsh 的高级功能,只想稳定运行;
– 新手入门(教程多,遇到问题容易找到解决方案)。
## 总结:Shell 没有“最好”,只有“最适合”🎯
本章核心是“除了 bash,还有 dash 和 zsh 这两个好用的 Shell,各有优缺点”:
1. dash:轻量级、快,适合简单任务和资源有限的场景,但功能少,写脚本要避开很多坑;
2. zsh:功能强大、可定制性高,日常用和写复杂脚本都爽,还支持插件和模块,程序员最爱;
3. 选择建议:日常用 zsh 提升效率,写跨平台脚本用 bash 保兼容,简单系统任务用 dash 省资源。
不管用哪个 Shell,关键是“明确需求”,像选交通工具:短距离骑 dash(轻便),长途开 zsh(舒适),拉货用 bash(稳定)~