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,各有优缺点”:

  1. dash:轻量级、快,适合简单任务和资源有限的场景,但功能少,写脚本要避开很多坑;
  2. zsh:功能强大、可定制性高,日常用和写复杂脚本都爽,还支持插件和模块,程序员最爱;
  3. 选择建议:日常用zsh提升效率,写跨平台脚本用bash保兼容,简单系统任务用dash省资源。

不管用哪个Shell,关键是“明确需求”,像选交通工具:短距离骑dash(轻便),长途开zsh(舒适),拉货用bash(稳定)~