shell编程
2026-10-15 08:10:32 0 举报123
组织结构
模板推荐
作者其他创作
大纲/内容
shell前置概述知识点
为什么要学shell编程
世界上最重要的信息资源的在服务器上90%服务器操作系统都是在linux用户和linux交互通过shell解释器完成
shell是什么
shell解释器
<br>
一种文件包含一系列linux命令,可以反复执行,能实现自动运维
shell脚本
将用户发送的Linux命令,解释成linux内核能理解指令
目录相关命令
linux目录结构
根目录
bin命令目录
root管理员目录
<br>
<br>
etc配置文件
home用户家目录
查看目录
ls用法
ls查看当前目录的内容
ls 目录路径 查看特定目录内容
如 :ls/bin
ls-l 目录路径 查看目录的详情
如: ls-l/etc
ls-a目录路径 查看所有目录
如:ls-a/usr
||查看目录详情,作用和ls-l相同
pwd查看当前目录
<br>
tree 目录路径 树状结构展示目录
<br>
tree -/etc
切换目录
cd
用法:
cd 目录路径
目录里路径包含:绝对路径和相对路径
绝对路径 从/根目录开始,相对路径是相对当前的路径
<br>
如
cd/usr
绝对路径 cd/usr/local
相对路径 cd local
回到上级目录cd...
创建目录
mkdir
用法
1 创建单个路径
mkdir 目录路径
如 :mkdir/hello
2 创建多个 目录
mkdir 目录1 目录2 目录 3...
<br>
cd /hello
mkdir aa bb cc dd
mkdir{开始...结束}
如: mkdir a{1..9}
3创建多级目录
mkdir-p aaa/bbb/ccc
删除目录
rm
用法 :-r 递归-f 强制
rm- rf a1
rm -rf /(删库跑路)
rm-rf a{1...7}
rm-rf b*
rm -rf *
文件相关命令
创建多个文件
touch
创建新文件或修改文件时
用法
touch 文件名
touch 文件1 文件2 文件3
touch {开始...结束}
实例 :
mkdir /test
cd /test
touch hello
touch aa bb cc
touch a{1...9}
||
touch a3
||
<br>
编辑文件
vi或vm
用于创建文件或对文件内容进行编辑
三种模式
命令模式
可以进行复制和粘贴,删除替换等操作,
插入模式
可以编辑文字
命令行模式
可以保存,退出,查找等操作
:q 直接退出(不做任何修改)
:wq 保存退出
:q 强制退出(不保存)
一开始默认是命令模式,按i进入插入模式,按:命令行模式按etc回到命令模式
实例
vim haha
按i进入编辑,输入文字
按esc ,再按:wq回车
高级操作 (在命令模式下):
复制粘贴 yy复制一行 p粘贴
多行复制 行数+yy 复制多行
<br>
删除一行 dd
删除多行 行数+dd
删除一个 x
删除多个 字数+x
查找文字 /文字 回车 按n 查找下一个
快捷键 :u撤销 G 定位末行 gg定位首行 A 移动行尾
设置行号 :set nu 取消行号 :set nonu
粘贴模式: 避免粘贴文字格式混乱
:set paste 回车 按i 粘贴文字
<br>
查看文件
cat 文件名
查看全部文件内容
<br>
<br>
more文件名
分页查看文件内容
回车 下一页 q退出
任何命令可以通过 --help 查看帮助
more --help
tail -行数 文件名
查看末尾几行
tail -2 haha
head --行数 文件名
查看开头几行
head -1 hehe
子主题
压缩和解压缩
tar 选项 文件路径
选项:
-c 压缩
-x 解压缩
-v 查看详情
-f 指定文件
-z gz格式
压缩案例:
mkdir 、test
cd 、test
touch a{1..6}
tar-cvf aaa.tar.gz a{1..6}
<br>
LS
解压案例:
tar-续费压缩包路径 (解压到当前目录)
<br>
rm -rf a{1..6}
tar -xvf 压缩包路径 -c 解压路径
tar -xvf aaa.tar.gz.-C /root
ls /root
实战案例 :安装jdk
1) 将jdk 安装包,上传到服务器、usr/local 目录下
cd/ usr/local
ls
2)解压jdk是
tar xvf jdk-8u181-linux -x64.tar.gz
目录重命名
mv jdk 1.8.0-181 jdk8
4)编辑系统配置文件
vi /etc/profile
G 定位末行 按i 加入:
export JAVA-HOME=/USR/LOCAL/jdk8
export PATH=$PATH:$JAVA-HOME/BIN
5)系统产生
source/etc/profile
6)java -version
<br>
<br>
子主题
其他文件操作
复制
cp 原文件 目标文件
复制目录要加-r
如:
cp hello haha
cp -r jdk8 jdk88
移动
mv 原文件 目标文件
<br>
如
mv hello hehe
排序
sort 文件名
-r 降序
去重
uniq 文件名
<br>
统计wc 选项 文件名
-c 字节数
-m 字符数
-l 行数
wc -c hehe
查找文件
find 用于在系统中通过各种条件查找文件
用法:find 查找位置 查找条件
查找位置
根目录,/
当前目录 .
指定目录 如 :/etc/root
查找条件
按名字查找
-name 名字
示例
1)在整个磁盘找名称为a开头
find /-name a*
2)在/etc目录下查找以sh结尾的文件
find /etc-name *sh
3)在/usr目录下查找名字包含abc的文件
find /usr -name *abc
按大小查找
-size 大小
大写单位:默认是字节,还可以是K,M,G
+大于
-小于
示例
1)查找整个磁盘中超过500m的文件
find/ -size 500M
2)查找整个目录中b开头的大小超过2M的文件
find /etc -name b*-size+2k
<br>
子主题
3)在/etc目录中查找 1k到200k的以.sh结尾的文件
find /etc -name*sh -size+1k-size -200k
按类型查找
-type 类型
类型
f 文件
d 目录
l 链接
b 块
示例
1)查找/usr目录下名字c开头的目录
find/usr -name b*-type f
按时间查找
-ctime 创建时间
-mtime 修改时间
-atime 访问时间
时间单位是天
-ctime 2前两天
-ctime +2 两天前
-ctime -2 两天内、
示例
1)找出/etc目录中,5天前创建的c开头的文件
find /etc-name c*-ctime+5
2) 找出整个磁盘中,名称为aaa,大小为0,2天内创建的文件
find/-name aaa-size 0 -ctime -2
特殊符号
管道符
用于将多个命令连接起来,前一个命令的结果作为后一个命令的输入
用法:命令1|命令2|命令3....\
示例
1)找出/etc目录中,5天谴创建的c开头的文件数量
find /etc -name c*-ctime+5| wc -|
2)统计aaa文件中间,不重复文字的行数
子主题
cat aaa |sort |uniq |wc-l
重定向
用于对文件内容进行输入输出
>
向文件输出文字,覆盖原文件
示例
echo hello >1.txt
echo haha>1,txt
>>
向文件输出文字,追加到末尾
示例
echo hehe >>1.txt
<
从文字中读取文字
示例
cat<1.txt
cat<1.txt>2.txt
<br>
<<
从控制台读取文字,直到特定符号为止
<<EOF
......
......
<br>
EOF
示例
cat>a.txt<<EOF
......
EOF
子主题
权限相关命令
用户管理
用户相关文件
用户相关的文件
/etc/passwd 用户有关信息
用户id 0-999系统用户
1000+自定义用户
etc/group 用户组密码
1)用户密码 2)密码 3)
5)组名 6)家目录 7)解释命令组
查看用户
id 用户名
如
id root
uid用户编号gidzu编号组包含用户组和附加组
一个用户属于用户组,可以有多个附加组
添加用户
useradd 选项 用户名 选项 -u 设置uid -g 设置组 -G 设置附加组 -d 设置家目录
创建普通用户 user1
useradd user1<br>id user1<br>
uid 默认从 1000 开始,同时会创建同名的组,gid 和 uid 相同
创建用户 user2,设置 uid 为 2000
useradd -u 2000 user2<br>
子主题
创建用户 user3,设置组为 user1
useradd -g user1 user3<br>
子主题
创建用户 user4,设置组为 user1,附加组为 user2 和 root
useradd -g user1 -G user2,root user4<br>
子主题
默认情况下,用户家目录都在 /home 下<br>创建用户 user5, 设置家目录在 /usr/local/user5
useradd -d /usr/local/user5 user5<br>
子主题
设置密码
passwd
交互式
`passwd 用户名`<br>如:`passwd user`
非交互式
echo 123456 | passwd user2 --stdin `--stdin` 允许从控制台输入密码<br>
测试登陆系统
<br>
切换用户
SSH<br>测试登录系统<br><br>su 用户名 切换用户,不能切换家目录<br>su - 用户名 切换用户,同时切换家目录<br>从 root 切换普通用户不用密码,其它需要输入密码<br>如:<br>su user1<br>su user2
修改用户
命令:usermod 选项 用户名<br> 选项<br> -u 设置uid<br> -g 设置组<br> -G 设置附加组<br> -d 设置家目录
示例:<br>创建 zhangsan 用户,修改 uid<br>useradd zhangsan<br>usermod -u 6666 zhangsan<br>usermod -g root zhangsan<br>id zhangsan
<br>
父主题
删除用户
userdel 选项 用户名<br>选项:-r 删除主目录和邮件<br>示例:<br>userdel -r zhangsan<br>/etc/group
用户组操作
查看组
/etc/group<br>cat /etc/group<br>tail -1 /etc/group
新建组
groupadd 选项 组名<br>选项:-g 组 ID<br>示例:<br>创建 emp 组,设置为 2000<br>groupadd -g 2000 emp<br>创建 zhangsan 用户,设置组为 emp<br>useradd -g emp zhangsan<br>id zhangsan
修改组
groupmod 选项 组名<br>示例:<br>修改 emp 组的 ID 为 9999<br>groupmod -g 9999 emp
删除组
groupdel 组名<br>示例:<br>groupdel emp 组中有用户,不能删<br>groupdel -f emp 强制删除<br>常规做法:先删组的用户,再删除组<br>练习
练习<br><br>1. 创建 boss 组,设置 ID 为 5555<br>2. 修改 boss 组的 ID 为 8888<br>3. 创建用户 lisi,设置组为 boss<br>4. 删除用户 lisi,删除 boss 组<br>5. id 查看 lisi,查看 group 文件,验证<br>Linux 的权限管理非常严格,每个用户可以有不同权限,由 root 来分配<br>
子主题
权限操作
Linux 的权限管理非常严格,每个用户可以有不同权限,由 root 来分配
权限的表示
<br>
权限字符串
r 读 4<br>w 写 2<br>x 执行 1
示例含义:-rw-r--r--<br>是一个文件,所有者可以读写,同组用户和其他用户只读
权限数字
rwx 7<br>rw- 6<br>r-x 5<br>r-- 4<br>-wx 3<br>-w- 2<br>--x 1<br>--- 0
修改权限
chmod
权限字符|权限数字 文件路径
权限数字是三位数字<br>第一位:所有者<br>第二位:同组用户<br>第三位:其他用户<br>示例<br><br>1. 创建文件,设置权限为所有者读写同组用户读写其他只读<br>cd /opt<br>chmod 664 test<br>ll<br>2. 创建 test1 用户,切换该用户<br>useradd hello<br>su hello<br>cat hello 允许读<br>echo 666 > test 不能写 bash: test: Permission denied 权限拒绝<br>3. 切换回 root,修改文件权限 666<br>su root<br>chmod 666 test<br>4. 再切换到 hello,尝试读写<br>su hello<br>echo 666 > test 成功<br>cat test 成功
权限字符
可以单独设置某一个部分的权限,更方便<br><br>分为几个部分<br>u 所有者<br>g 同组用户<br>o 其他用户<br>a 所有用户、<br>
示例<br>1)给所有者添加执行权限<br>cd /opt<br>touch aa<br>chmod u+x aa<br>ll<br><br>2)将同组用户权限设置为读写<br>chmod g=rw aa<br><br>3)将其他用户的读权限去掉<br>chmod o-r aa<br><br>4)将所有用户的权限设置为读写<br>chmod a=rw aa
修改所有者
文件所有者的权限是最高的,如果能修改文件所有者,用户的权限会得到提高
chown 选项 用户名。组名 文件路径
1)修改文件所有者
示例<br>1)root 创建文件<br>touch test<br><br>2)创建 test 组,test1 用户<br>groupadd test<br>useradd -g test test1<br><br>3)切换到 test1 用户,尝试读写文件<br>su test1<br>echo hello > test 权限错误 Permission denied<br><br>4)切换回 root,将文件所有者改为 test1<br>su root<br>chown test1.test test<br>5) 重复执行第三步
2)修改目录的所有者
1)创建多级目录<br>su root<br>mkdir -p aaa/bbb/ccc<br>2)递归修改所有者为 test1<br>chown -R test1.test aaa
实战案例
1)安装 JDK<br>1)上传 JDK 安装包到服务器 /usr/local 下<br>cd /usr/local<br>ls
2)解压 jdk<br>tar -xvf jdk-8u181-linux-x64.tar.gz<br>ls
3)重命名为 jdk8<br>mv jdk1.8.0_181/jdk8<br>4)配置系统环境变量<br>vi /etc/profile<br>按 G 定位末行,按 A 添加内容:<br>export JAVA_HOME=/usr/local/jdk8<br>export PATH=\(PATH:\)JAVA_HOME/bin<br>保存退出<br>5)生效<br>source /etc/profile<br>6)验证<br>java -version
<br>
软件管理
系统服务的管理
系统服务救是linux系统自带的软件,可以通过systemctl命令统一管理
systemctl 操作 服务名称
操作 start 启动 stop 停止 restart 重启 reload 重新加载 enable 启用 开机自启 disable 禁用 不开机自启 status 查看状态
示例一 操作防火墙服务
1) 查看防火墙状态
system status firewalld
2)关闭防火墙
systemctl start firewalld
3)启动防火墙
systemctl stop firewall
示例二 操作ssh服务
1)查看ssh服务状态
system status sshd
2)关闭ssh 服务
systemctl stop sshd
3)启动ssh 服务
systemctl start sshd
子主题
子主题
普通软件管理
linux 系统的centos\红帽\rocky都使用yum 管理软件
ubuntu使用dnf工具管理软件,软件保存在远程 仓库中
列举所有软件 yum list yum list |wc-l
搜索软件 yum search 软件名 如:yum search nginx
卸载软件 yum remove -y 软件名
如 yum remove -y nginx
更新软件 yum remove -y nginx
对软件库做升级 yum upgrade
清理缓存 yum clean all
创建缓存 yum make cache
1)安装 nginx<br>yum install -y nginx<br>2)启动 nginx<br>systemctl start nginx<br>systemctl status nginx<br>3)关闭防火墙<br>systemctl stop firewalld<br>4)浏览器输入:<br>[http://192.168.43.100]<br>5)使用 deepseek 开发页面<br>6)把页面上传到<br>/usr/share/nginx/html 目录<br>7)重启 nginx<br>systemctl restart nginx<br>8)浏览器访问<br>[http://192.168.43.100/nba.html]<br>
磁盘在管理
linux名言:一切皆为文件,Linux所有硬件和软件都作为文件保存,文件保存在磁盘
1)添加新的磁盘 2)磁盘分区 3)格式化分区 4)挂载
磁盘分区
为什么要分区
1)添加新的磁盘 2)文件分开便于管理 3)不同的分区可以用不同的文件系统
Linux磁盘命名规则<br> 以sd开头,第三位a~p<br> 如:sda、sdb、sdc....sdp
分区类型
子主题
主分区 数量1~4个,以P表示<br> 扩展分区 数量0~1个,不能直接使用,需要在上面创建逻辑分区,以E表示<br> 主分区+扩展分区 最多4个<br> 逻辑分区 数量不限,编号从5开始<br> 分区方式:<br> P<br> PP<br> PPP<br> PPPP<br> PE<br> PPE<br> PPPE
查看分区和挂载命令
df 命令<br> df -h 带单位 M/G/K
<br>
案例1:添加新磁盘
虚拟机右键--设置--添加
子主题
子主题
<br>
子主题
案例2:实现磁盘分区
磁盘分区的命令:fdisk<br>查看磁盘分区:fdisk -l <br><br>fdisk 分区名称<br>如:fdisk /dev/sdb<br>命令:<br>m 菜单<br>n 新建分区<br>d 删除分区<br>p 打印分区<br>w 保存退出<br>q 直接退出 <br><br>案例 2:实现磁盘分区(PPPE)<br>新建分区,输入 n<br>重复三次,新建三个主分区<br>扩展分区,全部回车<br><br>命令输入 p<br>输入 w 保存退出<br><br>云电脑<br><br>项目<br><br>技能<br><br>自动高
案例三) 对分区格式化
格式化类型
ext2 最终文件系统 ,不支持日志(淘汰)
ext3 ext2升级 , 支持日志和更大分区
ext4 ext3 升级,性能更高(主流)
xfs 支持高性能的计算(主流)
格式化命令:
mkfs 格式化类型 分区
如:
mkfs.ext4/dev/sdb1
子主题
文件挂载
临时挂载(重启失败)
mount 分区 目录路径
案例4) 挂载sdb1到/mnt/sdb1目录
mkdir/mnt/sdb1
mount/dev/sdb1/mnt/sdb1
df-h
cd/mnt/sdb1
echo 8888>aa
cat aa
永久挂载
文件处理三剑客
grep
对文件内容进行筛选
用法:
grep 选项 “查找内容”文件路径
或
命令|grep “查询内容”
选项:
—n 显示行数
-0 只显示查找内容
-e 支持多个条件
-m 限定返回的行数
案例
1)查找/etc/passwd文件中的root grep“root”/etc/passwd
2)显示root存在的行数
3)只显示root grep-o ’root‘/etc/passwd
4)查找root grep-i ‘ROOT'/etc/passwd
5)查找root或ftp
grep -f ‘root’-e‘etc’
正则表达式
专门用于处理字符串的表达式,包含一系列特殊符号
元字符
任意一个字符
\w 任意的字母,数字或下划线
\d 任意的数字
[] 一个范围或多个字符中的任意一个
如:[0-9]一个数字[a-z]小写字母【A-Z]大写字母
[aom]a\o\m中的任意一个
[0-9a-zA-Z]任意的数字或字母
【^]对范围或字符取反
如:[^0-9]非数字[^abc]不能是abc
案例 1. 查看 /etc 目录中以 rc 开头第三位是数字的文件<br> ls /etc | grep 'rc [0-9]'<br> 2. 查看 /etc 目录中以 rc 开头的文件<br>ls /etc | grep 'rc.'
位置字符
^ 匹配行开头<br>$ 匹配行末尾
案例
1.查找 root 开头的行<br>grep '^root' /etc/passwdA
查找 bash 结尾的行<br>grep 'bash$' /etc/passwd
数量字符
控制字符匹配次数<br><br>- 匹配任意次数<br>? 匹配 0 到 1 次<br><br>- 匹配 1 次以上<br>{n} 匹配 n 次<br>{n,m} 匹配 n 到 m 次<br>{n,} 匹配 n 次以上<br>{,m} 最多匹配 m 次<br>属于扩展正则表达式,需要 grep -E 或 egrep
案例
1. 查找 so 开头,go 结尾的行<br>cat > test << EOF<br>dfajskfjdkalsgo<br>so3289udfsafdsa<br>sosoofdjksljklsfljfdsg<br>32789fdshjjn<br>434334<br>gsdfdja<br>EOF<br>grep '^so.*go$' test
2) 查找正整数、负整数和小数<br>echo 566 >> test<br>echo -454 >> test<br>echo +43 >> test<br>echo 656.44 >> test<br>echo 43.55.66 >> test<br><br>正整数:开头可以有 + 也可以没有,数字要 1 个以上<br>grep -E '^+?[0-9]+\(' test<br>负整数: 开头要有一个-号,数字要1个以上<br>grep -E '^\-[0-9]+\)' test<br>小数:必须有一个.,前后都有一位以上数字<br>grep -E '^[0-9]+.[0-9]+$' tes
3. 查找手机号<br>11 位数字,第一位是 1 第二位是 3-9 后面有 9 位数字<br>echo 13457656754 >> test<br>echo 23457656754 >> test<br>echo 134576567545 >> test<br>echo 12457656754 >> test<br><br>grep -E '^1[3-9][0-9]{9}$' test
分组字符
把多个字符分组,作为一个整体进行匹配 (多个字符)
1. 匹配有两个连续 root 的行<br>echo root >> test<br>echo rootroot >> test<br>echo rootrootroot >> test<br><br>grep -E '^(root){2}$' test<br><br>
匹配有两个 root 或 hello 的行<br>echo hellohello >> test<br>echo roothello >> test<br>grep -E '^(root|hello){2}$' test
匹配两个连续的手机号<br>echo 1562333456713445556789 >> test<br>echo 1562333456711445556789 >> test<br>echo 1562333a5671344555s789 >> test<br>egrep '^(1 [3-9][0-9]{9}){2}$' test
获得当前 IP 地址<br>ifconfig | grep 'broadcast' | grep -o -E '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' | head -1
sed
sed 按行对文件内容进行处理(增删改查)批量修改文件的内容,效率更高
用法: sed 选项 ' 执行指令 ' 文件路径
常用选项<br>-n 只输出查找的内容<br>-e 匹配多个条件<br>-r 识别扩展正则表达式<br>-i 生成备份文件
执行指令<br>p 打印<br>d 删除<br>a\ 追加(插到后面)<br>i\ 插入(插到前面)<br>c\ 替换
案例
打印 passwd 文件<br> sed 'p' /etc/passwd<br> sed -n 'p' /etc/passwd 关闭默认输出<br> 内容打印了两遍(sed 有默认输出)
匹配行数<br><br>1. 打印第 5 行<br>sed -n '5p' /etc/passwd<br>2. 打印 5 到 10 行<br>sed -n '5,10p' /etc/passwd<br>3. 打印 20 行到末尾<br>sed -n '20,$p' /etc/passwd<br>4. 打印末行<br>sed -n '$p' /etc/passwd
5)打印奇数行
1~2 n~m n开始,步长为m
sed -n ‘3,8p’/etc/passwd
6)统计0~100之间的偶数和 seq 100 |sed g、
正则表达式匹配
1. 匹配 m 开头的行到 ln 结尾的行 sed -n '/^m/,/ln$/p' /etc/passwd<br>练习:打印 root 开头的行到第五行 sed -n '/^root/,5p' /etc/passwd<br><br>2. 忽略大小写,匹配 ROOT 开头的行到 MAIL 开头的行 / 表达式 / 大写的 i sed -n '/^ROOT/I,/^MAil/Ip' /etc/passwd
子主题
删除文件内容
3. 删除文件的第二行<br>cat > test << EOF<br>11111111111111111111<br>22222222222222222222<br>33333333333333333333<br>fdahsfhdaskhfdka<br>hello0349430943<br>1238ysafhkhgkh<br>EOF<br><br>sed '2d' test 输出内容第二行被删除,文件中没有删除<br>sed -i '2d' test -i 可以对原始文件进行修改<br>sed -i -n '2,5d' test # -i 不可以和 - n 一起用,否则文件会清空<br>sed -i.bak '5d' test # 备份原始文件,后缀为 bak<br><br>练习 1:删除 /etc/passwd 里 game 开头的行,备份原文件<br>sed -i.bak '/^game/d' /etc/passwd<br>练习 2:删除 mail 开头~sshd 开头之间所有行,备份原文件<br>sed -i.bak '/^mail/,/^sshd/d' /etc/passwd
<br>
子主题
子主题
添加文件内容
追加
追加指令是 a\ 在位置后面添加<br>案例<br>10) 在 passwd 文件第 5 行后面添加 hello5555<br>sed '5a\hello5555' /etc/passwd<br><br>11. 在 root 开头行的后面追加 hello root<br>sed '/^root/a\hello root' /etc/passwd
插入
插入<br>指令是 i\ 在前面添加<br>案例<br>12) 在 passwd 的第三行前面添加 hello333<br>sed '3i\hello333' /etc/passwd<br><br>13. 在 adm 开头行的前面添加 hello adm<br>sed '/^adm/i\hello adm' /etc/passwd
替换文件内容
c指令,将整行替换
1. 把 passwd 的第三行替换为 hello333<br>sed '3c\hello333' /etc/passwd<br>2. 正则表达式替换<br>创建 test 测试文件 (here-doc)<br>cat > test <<EOF<br>aaahelloaaheloaaa<br>bbbbhellobbbhellobb<br>ccccchellocccchello
子主题
s 指令 搜索替换<br>s# 要搜索的文字 #要替换的文字 #<br>s / 要搜索的文字 / 要替换的文字 /<br>全局替换(一行所有匹配都替换)末尾加 g<br>s / 要搜索的文字 / 要替换的文字 /g<br><br>16)替换 hello 为 good<br>只替换一行的第一个 hello<br>sed's/hello/good/' test<br><br>全局替换(一行全部 hello 都替换)<br>sed's/hello/good/g' test
子主题
awk
awk<br>按列对文件内容进行处理<br>awk 是一种脚本语言,按列对文件内容进行处理,将文件每行拆分为多列处理,还支持变量、条件、循环、数组<br>用法:awk 选项 ' 脚本代码 ' 文件路径<br><br>选项<br>-F:指定分隔符,默认是空格<br>-v:定义变量<br>-f:指定脚本文件<br>
案例<br><br>1. 打印指定的列<br><br>- $0 整列<br>- $n 第 n 列<br>- $NF 最后一列<br>打印 passwd 的第一列<br>awk -F: '{print $1}' /etc/passwd<br>打印第一列,第三列,最后一列<br>awk -F: '{print $1,$3,$NF}' /etc/passwd<br><br>2. 获得磁盘利用率<br>df | sed -n '2,$p' | awk '{print $5}' | tr '%' ''<br><br>模式<br>BEGIN 模式 —— BEGIN {代码} 处理所有行之前执行一次<br>行模式 —— {代码} 每行执行一次<br>END 模式 —— END {代码} 所有行处理后执行一次<br><br>3. 打印 passwd 的第一列<br>awk -F: 'BEGIN {print "开始打印!!!"};{print $1};END {print "我打印完了!"}' /etc/passwd
子主题
模式
BEGIN 模式 —— BEGIN {代码} 处理所有行之前执行一次<br>行模式 —— {代码} 每行执行一次<br>END 模式 —— END {代码} 所有行处理后执行一次<br><br>3. 打印 passwd 的第一列<br>awk -F: 'BEGIN {print "开始打印!!!"};{print $1};END {print "我打印完了!"}' /etc/passwd
计算总成绩<br>怎么算平均成绩??<br>cat > test <<EOF<br>张三 男 55<br>李四 女 78<br>王五 男 95<br>赵六 女 75<br>EOF awk 'BEGIN {sum=0};{sum+=$3};END {print "总成绩是:" sum}' test<br>awk 'BEGIN {sum=0;count=0};{sum+=$3;count++};END {print "平均成绩是:" sum/count}' test
子主题
SHELL
shell解释器
sh 最早的解释器,系统内置<br>bash 系统默认的解释器<br>c、python、perl 等 需要安装<br><br>查看系统当前的解释器 —— echo $SHELL<br><br>查看系统支持的解释器 —— cat /etc/shells<br><br>切换系统当前的解释器 —— chsh -s 解释器路径<br>chsh -s /bin/sh<br>生效需要重新登录<br>
<br>
子主题
脚本文件的命名规则:<br><br>1. 以.sh 为后缀名<br>2. 以字母数字下划线组成,不能有特殊符号<br>3. 以英文单词组成 如: install_nginx.sh<br><br>基本脚本的编写步骤:<br><br>1. 创建脚本文件<br>vim hello_world.sh<br>2. 编辑内容:<br><br>#!/bin/bash<br>说明:开头必须是这一句,指定解释器<br>加入代码和注释
echo "Hello Shell"<br>按 esc,输入:wq<br>3) 添加可执行权限<br>chmod +x hello_world.sh<br>4) 执行脚本<br>./hello_world.sh<br><br>脚本执行的几种方式:<br><br>1. ./ 脚本名称 必须有执行权限<br>2. . 脚本名称 类似上面<br>3. sh 脚本名称<br>4. bash 脚本名称<br>5. source 脚本名称<br>6. / 完整路径 / 脚本名称<br>
案例
1. 统计学生的总成绩(平均成绩?最高分?)<br>vim test1.sh<br>代码内容:<br><br>#!/bin/bash<br><br># 创建成绩文件<br><br>cat > student <<EOF<br>张三男 88<br>李四女 93<br>王五男 67<br>赵六女 78<br>EOF<br><br># 统计总分、计算行数、计算平均成绩<br><br>awk 'BEGIN {sum=0;count=0;}{sum+=$3;count++;} END {print "总成绩是:"sum,"平均成绩是:"sum/count}' student<br><br>2. 向多个文件中写入文字内容,打包后复制到 /opt 目录下<br>vim test2.sh<br>代码:<br><br>#!/bin/bash<br><br># 向多个文件写入文字<br><br>echo "hello" > 1.txt<br>echo "world" > 2.txt<br>echo "6666" > 3.txt<br><br># 压缩文件<br><br>tar -cvf 123.tar.gz 1.txt 2.txt 3.txt<br><br># 复制到 /opt<br><br>cp 123.tar.gz /opt/<br><br>3. 统计女学生的平时成绩<br><br>#!/bin/bash<br>awk '$2=="女"{sum+=$3;count++} END {print "女生总成绩:"sum,"女生人数:"count,"女生平均成绩:"sum/count}' student
shell变量
变量分类
变量是程序在内存中保存数据的空间<br>命名规则<br><br>1. 以字母、数字、下划线组成<br>2. 不能以数字开头<br>3. 要有意义单词组成,如:name、age<br>4. 不能是关键字或命令:cd、mkdir<br><br><br>
子主题
自定义变量
变量的分类<br>自定义变量<br>开发者自己定义的变量,只能在当前进程(脚本)中使用<br>变量的定义<br>变量名 = 值<br>例:name="张三";<br>age=20<br>变量的访问<br>$ 变量名<br>${变量名}<br>缡
子主题
<br>
分支主题
Collect
Get Started
Collect
Get Started
Collect
Get Started
Collect
Get Started
评论
0 条评论
下一页