/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 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=c” # 输出3.5 # 加载mathfunc模块,支持sqrt(开平方) zmodload zsh/mathfunc d=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 “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(稳定)~