shell是什么?可以做哪些?
Shell是⼀种解释性的语⾔,适⽤于基本的逻辑处理和不追求速度的应⽤。
用于:
- 人机交互
- 批处理
- Unix、Linux、Mac、Android、IOS
- 脚本自动化
- 工作场景
shell种类
- bash
- sh
- zsh
windows没有/etc/shells,需要安装cygwin或git bash
Bash基础
$符号含义
在bash里,$符号表示当前用户为普通用户;在bash脚本里, $开头表示变量。
- $# 表示参数个数。
- $0 是脚本本身的名字。
- $1 是传递给该shell脚本的第一个参数。
- $2 是传递给该shell脚本的第二个参数。
- $@ 表示所有参数,并且所有参数都是独立的。
- $$ 是脚本运行的当前进程ID号。
- $? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误。
- ;号,可以将两段代码相连
变量定义
| a=1 |
| a=1;b=2 |
| echo $a |
| echo ${a}_xxx |
| echo "字符串:$a" |
预定义变量
| |
| echo $PWD |
| echo $USER |
| echo $HOME |
| echo $PATH |
数组变量
| array=(1 2 3 4 5) |
| echo ${a[@]} |
| echo ${#a[*]} |
| |
命令变量
| a=`ls` |
| array=(`ls` `pwd`) |
| echo $a |
特殊符号的使用

变量类型
数字型变量
| |
| i=5 |
| echo $((i+5)) |
| # 更新 |
| ((i=i+1)) |
| echo $i |
| ((i--));echo $i |
| ((i++));echo $i |
| |
| awk 'BEGIN{print 1/3}' |
比较变量
字符串操作
| s="hello word" |
| echo ${s:3} |
| echo ${#s} |
| |
| echo "${s#hello}" |
| echo "${s#*o}" |
| echo "${s##*m}" |
| |
| echo "${s%word}" |
| echo "${s%w*}" |
| echo "${s%%o*}" |
| |
| echo ${s/hello/hi} |

布尔变量
- true
- false
- 命令执行返回 $?
- 任何命令执行都会有一个返回值
- 0表示正确
- 非0表示错误
| ls |
| echo $? |
| ls xxx(不存在文件) |
| echo $? |
| false |
| echo $? |
判断类型
- 算术判断
- 字符串判断
- 逻辑判断
- shell内置判断
算术判断
| [ 2 -eq 2 ] |
| [ 2 -ne 2 ] |
| [ 3 -gt 1 ] |
| [ 3 -ge 1 ] |
| [ 3 -lt 1 ] |
| [ 3 -le 1 ] |
| |
| (())也可以表示算术比较。如:((10>=8)),((11==1)) |
逻辑判断
| [ 2 -eq 2 -a 3 -ge 4 ] # -a等同于&&(and并且) |
| [ 2 -eq 2 -o 3 -ge 4 ] # -o等同于or |
| |
| [[ 2 -eq 2 && 3 -ge 4 ]] # 与 |
| [[ 2 -eq 2 || 3 -ge 4 ]] # 或 |
| |
| [ ! 2 -ge 1 ];echo $? # 非 |
内置判断

逻辑控制
- 条件 if
- 分支 case
- 循环 for while until select
- && ||
- Break 和 continue
if结构
if[condition];then ...;fi
if[condition];then ...;else ...;fi
if[condition];then ...;elif ...;fi
简单的逻辑可以使用 && || 去替代
| [ -e test]&&echo true||echo false |
条件可以用命令返回值代替
分支 case

For循环
| for((i=0;i<10;i++)); |
| do |
| echo $i |
| done |
另外一种写法:
| for i in ${array[@]};do echo $i;done\ |
| for i in `ls`;do echo $i;done |
While循环
| i=0;while [ $i -lt 3 ];do echo $i;((i=i+1));done |
>符号输出重定向;<符号输入重定向
| |
| while read line; do echo $line;done < /tmp/tmp |
| |
| echo "文件内容写入xxx" > a.txt |
| |
| echo "文件内容写入xxx" >> a.txt |
until

退出控制
- return 函数返回
- exit 脚本返回
- break 退出当前循环。默认1
- break 2 退出两层循环
- continue 跳过当前的循环,进入下一次循环
- continue 2 跳到上层循环的下一次循环中
break
| |
| for i in *;do echo $i;if [ -d $i ];then break;fi;done |
continue
| |
| for i in *;do echo "检查:${i}";if [ -f $i ];then echo $i is file;else echo $i not is file continue;fi;done |
Shell运行环境概念
- bash是一个进程
- bash下还可以再重新启动一个shell,这个shell是sub shell,原shell会复制自身给他
- 在sub shell中定义变量,会随着sub shell的消亡而消失
| () 子shell中运行 |
| a=2;(a=1;echo $a);echo $a |
| {} 当前shell中运行 |
| a=1;{ a=12;echo $a;};echo $a |
| $$ 当前脚本执行的pid |
| & 后台执行 |
| sleep 3& |
| $! 运行在后台的最后一个作业的PID(进程ID) |
| echo $! |
| ps 查看进程 |
| jobs 查看任务 |
| bg 继续任务 |
| bg 1 |
| fg 暂停任务 |
| fg 1 |
文件添加权限
| chmod +x test.sh |
| |
| ./bash_profile |
| source ~/.bash_profile |
Linux三剑客(grep、awk、sed)
- grep 查找功能
- awk 取列
- sed 取行和替换
grep(搜索匹配)
| grep -i "ccc" < a.txt |
| grep -o "c" < a.txt |
| grep -o "c." < a.txt |
| grep -o "c.*" < a.txt |
| cat a.txt | grep "aaa" |

正则匹配

多功能联合使用
| |
| while read line;do echo $line;curl -s http://www.baidu.com/s?wd=$line;done <baidu.keyword | grep -o "timestamp=[0-9]*" |
| |
awk(强大的文本分析工具)
| |
| echo "123_456+789" | awk -F '+|_' '{print $1}' |
| |
| ls -al | awk '{print $1,$3}' |




sed(替换)
| |
| echo "aaa bbb ccc ddd" | sed 's/aaa/AAA/' |
| |
| echo "aaa bbb ccc ddd aaa" | sed 's/aaa/AAA/g' |
| |
| echo "aaa bbb ccc ddd aaa" | sed 's#aaa#AAA#g' |
| |
| sed 's/aaa/AAA/' a.txt |
| sed -i 's/aaa/AAA/' a.txt |
| sed -i.bak 's/aaa/AAA/' a.txt |

函数
function可以省略。---可以在脚本文件定义,也可以再shell中定义
如果没有return,返回值是最后一句的指令的返回值。
函数应用示例
| |
| functest(){ |
| echo "获取脚本执行参数: $0"; |
| echo "获取第一个参数: $1"; |
| echo "获取第二个参数: $2"; |
| echo "获取参数的个数: $#"; |
| echo "获取到的参数(str): $*"; |
| echo "获取到的参数(每一个参数都是一个str): $@"; |
| echo "获取当前进程的ID号(PID): $$"; |
| } |
| functest a b c d |
| |
| |
| ./test1.sh |
执行结果:

练习
打印竖行2/5/8之和
| echo -e "1|2|3\n4|5|6\n7|8|9" |

| echo -e "1|2|3\n4|5|6\n7|8|9" | awk -F '|' 'BEGIN{a=0}{a=a+$2;print $2}END{print a}' # 输出和为15 |
| |
可以输入任意参数,直到输入quit才会退出程序
| |
| while true |
| do |
| read -p "please enter:" var_q |
| if [ $var_q == "quit" ] |
| then |
| break |
| else |
| echo ${var_q} |
| fi |
| done |
运行结果:

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧