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,用$[ ]会报错:
#!/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只认“=”,用“==”会报错:
#!/bin/dash
str1="hello"
str2="hello"
# 正确:用=
if [ $str1 = $str2 ]; then
echo "字符串相同"
else
echo "字符串不同"
fi
# 错误:dash不支持==
# if [ $str1 == $str2 ]; then # 报错 (3)函数定义:只能用“函数名()”,不能用“function 函数名” 🔧
bash支持两种函数定义,dash只认“函数名()”,加function关键字会报错:
#!/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完全不支持数组,想存多个数据只能用变量拼接(比如用空格分隔):
#!/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跑,导致报错:
#!/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能算浮点数,还支持高级数学函数(要加载模块):
#!/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命令,更简洁:
#!/bin/zsh
# 循环5次,打印“Hello zsh”
repeat 5 {
echo "Hello zsh"
} 跑脚本会连续输出5次“Hello zsh”,比bash的for循环少写几行代码~
(3)数组:支持关联数组(字符串索引) 📚
bash支持普通数组(数字索引),zsh还支持关联数组(像字典,用字符串当索引),存键值对超方便:
#!/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下载文件,像给电脑装了新软件:
#!/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,各有优缺点”:
- dash:轻量级、快,适合简单任务和资源有限的场景,但功能少,写脚本要避开很多坑;
- zsh:功能强大、可定制性高,日常用和写复杂脚本都爽,还支持插件和模块,程序员最爱;
- 选择建议:日常用zsh提升效率,写跨平台脚本用bash保兼容,简单系统任务用dash省资源。
不管用哪个Shell,关键是“明确需求”,像选交通工具:短距离骑dash(轻便),长途开zsh(舒适),拉货用bash(稳定)~