shell编程
2025-12-31 14:00:29 0 举报
AI智能生成
1
作者其他创作
大纲/内容
Linux系统安装
安装rocky系统
在wml中点击文件,新建虚拟机
选择版本
设置名称和保存
选择磁盘大小
完成安装
打开虚拟机
设置密码和安装位置
安装和重启
输入账号和密码
输入指令vi /etc/sysconfig/network-scripts/ifcfg-ens33
子主题
编辑ip
重启,查看IP,并进行ping测试
连接虚拟机
连接成功
目录和文件操作
目录操作
Linux目录结构
树状结构,根节点是/
/ <br> /bin 命令目录<br> /root 管理员目录<br> /sur 用户目录<br> /home 家目录<br> /mnt 文件挂载目录<br>
查看目录
ls
查看目录中的内容
ls 目录路径(查看特定目录)<br>ls (查看当前目录)<br>ls -l 目录路径(查看详细文件)<br>ls -a 目录路径(查看所有文件,包含隐藏文件)
示例1:查看根目录下的内容<br> ls /<br> ls /bin<br> ls<br> ls -l /etc<br> ls -a / 查看根目录所有文件
ll
查看目录的详细信息,等价于ls -l
tree
查看目录的树状结构
用法:tree 目录路径
示例:查看/etc的树状结构<br> tree /etc
目录路径
绝对路径:完整路径,从根目录开始,如/usr/local/bin
相对路径:相当于当前目录的路径,如当前路径为/usr/local,则直接bin
切换目录
修改当前路径的位置
cd 目录路径
示例:切换到usr下的各个目录
pwd 查看当前目录的完整路径
创建目录
mkdir
用法:<br>mkdir 目录路径(创建一个目录)<br>mkdir 目录1 目录2(创建多个目录)<br>mkdir -p 目录1 目录2(创建多级目,-p自动创建上级目录)
示例:在otp中创建hello目录<br> cd otp<br> mkdir hello<br> ls
示例:创建多个目录<br>mkdir hello1 hello2 hello3 hello4 hello5<br>或mkdir hello{1..5}
示例:创建多级目录<br>mkdir -p aa/bb/cc
删除目录
rm 删除目录或文件
用法:rm [选项】目录或文件路径<br> -r 递归删除<br> -f 强制删除
示例:删除目录<br>rm -rf test1
示例:删除多个目录<br>rm -rf test{1..5}<br>rm -rf h*(删除h开头文件)<br>rm -rf *(删除当前目录所有文件)
复制目录
复制目录或文件
用法:cp 源文件路径 目标文件路径<br>x选项:复制目录要加 -r 递归复制
示例:mkdir aaa<br> cp -r aaa bbb
移动目录
mv 移动目录或文件
用法:mv 源文件路径 目标文件路径
示例:给aaa命名为abc<br> mv aaa abc
示例:把bbb移到/mnt下<br> mv bbb /mnt/
文件操作
创建文件
touch 用于创建空文件或修改文件状态(如果文件不存在就创建空文件,在就修改文件状态)
用法:touch 文件路径
示例:创建空文件<br>ttouch test1<br> 创建多个文件<br>touch a{1..9}<br> 修改文件状态<br>ttouch a1
编辑文件
vi或vim(vi的升级版)<br>k可用于创建并编辑文件的内容<br>安装vim yum install -y vim
三种模式
命令模式(进入后默认的模式,不能编辑,可以复制粘贴,查找,删除)
编辑模式(命令模式按i或a进入)
命令行模式(命令模式下按:进入,可以保存,退出)
基本使用
1.创建文件<br> vi test1.txt<br>2.进入命令模式,按i进入编辑模式,进行编辑<br>3.编辑完成后,按esc退出到命令模式<br>4.按:进入命令行模式,输入wq保存退出
命令行模式的用法
:w保存<br>:q退出(没有修改时退出)<br>:q!强制退出(有修改时,不保存退出)<br>:wq保存退出
高级应用
复制粘贴
命令模式下:复制一行 yy<br> 粘贴 p<br> 复制多行 数字yy
删除
删除一行 dd
删除多行 数字dd
查找文字
按/输入文字<br>按n切换到下一个
撤销
按u
显示行号
输入:set number
粘贴模式
输入:set paste 回车<br>按i进入编辑模式(显示--IINSERT(paste)--)<br>将文字复制,按右键粘贴<br>b保证文字格式和原来文件一致
查看文件
cat
查看文件的所有内容
用法:cat 文件路径
more
分页查看文件的内容
用法:more 文件路径<br> 回车显示下一行<br>空格显示下一页<br>a按b显示上一页<br>a按“显示第一页<br>按q退出
head
显示文件的头几行
head -数字 文件路径
示例:显示文件的前三行<br>head -3 test1.txt
tail
显示文件的后几行
tail -数字 文件路径
示例:显示文件的后两行<br>tail -2 test1.txt
sort
对文件排序
sort 文件名<br>-r 降序
基本的排序
降序排序
uniq
相邻内容去重
uniq 文件
压缩和解压
tar
压缩和解压文件<br>压缩包格式:tar/tar.gz/zip
tar 选项 文件名<br>选项:<br> -c 压缩<br> -x 解压<br> -v 显示过程<br> -f 指定文件<br> -z y压缩格式gz
压缩文件
tar -cvf 文件1 文件2....
示例:<br>touch test{1..5}<br>tar -cvf test.tar test{1..5}
解压文件
tar -xvf 压缩包文件(默认解压到当前目录)<br>-C 指定解压目录
示例:<br>rm -rf test{1..5}<br>tar -xvf test.tar<br>解压到/mnt下<br>tar -xvf test.tar -C /mnt
zip格式
zip
压缩zip格式包
zip 包名 文件...
zip test.zip test{1..5}
unzip
解压zip格式包
unzip 压缩包名
unzip test,zip
综合案例:安装JDK
1..将JDK安装包上传到/usr/local目录
2.切换到local下,节约安装包<br> cd /usr/local<br> tar -xvf jdk-17_linux-x64_bim.tar.gz<br>
3.给目录改名为jdk17<br>mv jdk-17.0.12 jdk17
4.配置环境变量,修改profile文件<br>vi /etc/profile<br>在末尾加两行<br>export JAVA_HOME=/usr/local/jdk17<br>export PATH=$PATH:$JAVA_HOMEbin
5.让环境变量生效<br>ssource /etc/profile
6.查看Java版本<br>java -version
文件查找
find
通过多种条件查找文件
用法:find 查找位置 查找条件 值
查找位置
特定位置:/etc
全盘查找:/
当前目录:.
按名称查找
-name "名称" 名称可以带*
示例:在/etc目录查找a开头文件<br>find /etc -name "a"<br>示例:全盘查找以.sh结尾的文件<br>find / -name ".sh"
按大小查找
-size 大小 (大小可以带单位,k,g,m,+大于 -小于)
示例:在/etc目录查找大于10M的文件<br>find /etc -size +10M
示例:全盘查找大于500M的文件<br>find / -size +500M
示例:在/etc下查找s开头的,大小在1k到20K之间的文件<br>find /etc -name "s*" -size +1k -size -20k
按类型查找
- type 类型 f 普通文件 d 目录 l 链接文件 块文件
示例:在/etc下查找n开头的链接文件<br>find /etc -name "n*"-type l
示例:全盘查找a开头,大于1k的普通文件<br>find / -name "a*" -size +1k -type f
按时间查找
-citme 创建时间 -atime 访问时间 -mtime 修改时间
示例:在/usr目录下查找小于10k,三天内创建的文件<br>find/usr -size -10k -ctime -3
示例:全盘查找以s开头s结尾,大小在1k到2M之间,创建时间在2天到5天之内的普通文件<br>find / -name "s*s" -size +1k -size -2M -ctime +2 -ctime -5 -type f
文件统计
wc
统计文件的行数,字节数,字符数等信息
用法:wc 选项 文件路径<br>选项:<br>-l 行数<br>-m 字符数<br>-c 字节数<br>-L最长行的行数<br>-w 单词数
示例:统计文件信息
管道符
|
将多个命令依次执行,前面执行的结果,作为后面命令的输入
用法:命令1 | 命令2 | 命令3....
示例:统计磁盘上脚本(以.sh结尾的文件)的数量<br>find / -mane "*.sh" -type f | wc -l
示例:统计文件中不重复的内容数量<br>cat test1 | sort | uniq | wc -l
显示文件中3行到5行的内容 head tail<br>cat test1 | head -5 | tail -2
重定向
读写文件
>
写入文件对原有内容进行覆盖
示例:写入文字到test1中<br>echo "hello" > test1
示例:统计磁盘上脚本的数量保存到count中<br>find / -name "*.sh" -type f | wc -l > count
>>
写入文件,对原有内容进行追加
示例:写入文字到test1中<br>echo "hello" >> test1
<
从文件读取
示例:读取文字<br>cat < test1
示例:复制文件<br>cat <test1> test2
<<
从控制台读取文字,遇到结束符停止
读取文字,写入test文件<br>cat > test <<EOF<br>...........<br>...........<br>EOF
用户和权限相关操作
Lunix是多用户多任务的操作系统,不同的用户拥有不同的权限
用户分为
超级管理员 root 最高权限 uid 是 0
系统用户 系统自带uid在1到999
自定义用户 自己创建的 uid>=1000
用户相关文件
/etc/passwd 用户信息
用户名:密码:用户ID:组ID:家目录:解释器类型
/etc/shadow 用户密码
用户名:加密后的密码:密码过期时间
/etc/group 用户组信息
组名:组密码:组ID
用户相关命令
查看用户
id 用户名
显示用户名和组的相关信息
创建用户
useradd 选项 用户名<br>选项:<br>-g 设置组<br>-G 设置附加组<br>-u 设置uid<br>-d设置家目录(默认在home)<br>-m自动创建家目录
示例
1.创建test用户<br>useradd test
创建用户如果没有设置组,会自动创建和用户同名的组
2.创建test1用户,设置组为test<br>useradd -g test test1
创建用户设置组,不会创新组
3.创建test2用户,附加组有test和root<br>uuseradd -G test,root test2
附加组可以有多个
4.创建test3用户,设置uid为1800<br>useradd -u 1800 test3
5,创建用户test4,设置家目录为/otp/test4<br>useradd -d /otp/test5 -m test5
设置密码
passwd
交互式
passwd 用户名
非交互式
echo "密码" | passwd 用户 --stdin
切换用户
su
su 用户名(不会修改当前目录,不会加载用户的配置)
su -用户名(切换到用户的家目录,会加重用户的配置)
修改用户
usermod
用法:usermod 选项 用户<br>选项和usermod相同
示例.修改test的id<br>usermod -u 2000 test
示例.修改用户test的组为root<br>usermod -g root test
删除用户
userdel
用法:userdel 选项 用户<br>选项:-f 强制删除<br> -r 删除家目录
用户组的操作
查看组
groups 用户<br>查看用户所属组
创建组
groupadd 选项 组名<br>-g 组id
示例:groupadd hello<br> groupadd -g 1888 hello1<br> tail/ect/group
修改组
groupmod 选项 组名<br>-g 组id<br>-n 组名
示例:groupmod -g 1999 hello<br> groupmod -n hello123 hello1
删除组
groupdel 组名
示例:groupdel 组名
权限的相关操作
权限表示形式
字符表示法
权限字符串结构
结构(10字符):文件类型+所有者+同组+其他
文件类型标识
文件类型:-(普通)、d(目录)、l(链接)
权限字符含义
权限字符:r(读)、w(写)、x(执行)、-(无)
数字表示法
换算规则说明
r=4、w=2、x=1、无=0,每组权限为数字和
对应关系:---=0、--x=1、-w-=2、-wx=3
对应关系:r--=4、r-x=5、rw-=6、rwx=7
修改权限(chmod)
数字修改法
格式:chmod 权限数字 文件路径
示例:chmod 666 test.txt、chmod 755 test.txt
字符修改法
分组符号:u(所有者)、g(同组)、o(其他)、a(全部)
权限符号:=(设权限)、+(加权限)、-(删权限)
给所有者加写:chmod u+w test.txt
同组设为读写:chmod g=rw test.txt
删其他执行权:chmod o-x test.txt
所有用户加写:chmod a+w test.txt(或chmod +w test.txt)
Linux系统服务与软件管理
系统服务
由系统进行管理的软件服务,可通过systemctl命令实现全生命周期管理,适用于firewalld、sshd等各类服务。
核心命令格式:systemctl 操作 服务名
常用操作说明:
start :启动指定服务
stop :停止指定服务
restart :重启指定服务
reload :重加载服务配置(不中断服务运行)
enable :启用服务开机自启功能
disable :禁用服务开机自启功能
status :查看服务当前运行状态(含进程、启动情况等)
常用系统服务:
firewalld :系统防火墙服务,管控网络访问权限
sshd :远程登录服务,支持SSH协议连接服务器
二、软件管理
软件安装方式:
源码包
安装步骤相对繁琐,需手动完成配置、编译等流程,但可根据实际需求灵活定制软件功能与安装路径,适合对软件有特殊要求的场景。
在线安装
安装过程简单高效,包管理工具会自动处理依赖关系,配置相对固定,适合快速部署常用软件。不同Linux发行版默认包管理工具不同:
CentOS、Rocky、红帽系统:默认使用yum
Ubuntu系统:默认使用apt
yum包管理工具:
yum基于远程软件仓库工作,可实现软件的搜索、下载、安装、卸载等一站式操作。<br>为提升下载速度建议优先配置国内镜像源。
备份系统默认源文件:mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
下载阿里云源文件:curl -o /etc/yum.repos.d/CentOS-Base.repo <a href="http://mirrors.aliyun.com/repo/Centos-7.repo">http://mirrors.aliyun.com/repo/Centos-7.repo</a>
列举所有软件:yum list
搜索目标软件:yum search 软件名(示例:yum search vim)
安装指定软件:yum install 软件名(示例:yum install -y nginx,-y表示自动确认)
卸载已装软件:yum remove 软件名(示例:yum remove -y vim)
升级所有软件:yum upgrade
更新指定软件:yum update 软件名(示例:yum update vim)
清理软件缓存:yum clean all
创建新缓存:yum makecache(提升后续操作速度)
综合案例:安装Apache服务器并部署网站:
卸载旧版httpd(若系统中已存在)
执行命令:yum remove -y httpd(-y参数跳过确认步骤,直接卸载)
安装httpd服务
执行命令:yum install -y httpd
启动httpd服务并验证运行状态
启动服务:systemctl start httpd
查看状态:systemctl status httpd(状态显示“active (running)”即为启动正常)
本地测试httpd服务可用性
执行命令:curl localhost,若返回Apache默认页面内容,说明服务正常提供服务
关闭系统防火墙(便于外部访问,生产环境建议配置端口规则而非关闭)
临时停止防火墙:systemctl stop firewalld
禁用防火墙开机自启:systemctl disable firewalld
外部浏览器初步访问测试
在本地浏览器地址栏输入:<a href="http://虚拟机的IP地址,此时可看到Apache默认欢迎页面">http://虚拟机的IP地址,此时可看到Apache默认欢迎页面</a>
准备自定义网站页面代码
通过AI生成所需的HTML代码(如个人主页、产品展示页等),复制代码备用
上传自定义页面至Apache根目录
进入Apache默认根目录:cd /var/www/html
创建并编辑首页文件:vim index.html
粘贴模式(避免代码格式错乱):输入:set paste并回车
进入编辑模式:按i键,粘贴准备好的HTML代码
保存并退出:按Esc键,输入:wq后回车
重启httpd服务使配置生效
执行命令:systemctl restart httpd
验证自定义网站效果
刷新浏览器页面(<a href="http://虚拟机的IP地址),即可看到自定义的网站内容,完成部署">http://虚拟机的IP地址),即可看到自定义的网站内容,完成部署</a>
shell编程
Shell入门
Shell是什么
Shell是一种命令解释器,能将Linux命令翻译成内核可执行的指令,是用户与系统交互的桥梁。
Shell也是一种编程语言,具备变量、分支、循环等完整语法,可编写脚本实现批量操作。
Shell能做什么
核心作用:将零散的Linux指令整合为脚本,实现自动化运行,适用于自动化运维场景(如软件部署、数据备份等)。
Shell解释器
常见类型
1. /bin/bash:系统默认解释器,功能完善,使用最广泛。
2. /bin/sh:早期版本,功能相对简单,部分系统中是bash的软链接。
3. 其他:perl、python、c等(非传统Shell,可作为脚本解释器)。
相关操作命令
1. 显示当前使用的解释器:echo $SHELL
2. 查看系统支持的所有解释器:cat /etc/shells
3. 切换默认解释器:chsh -s 解释器路径(示例:chsh -s /bin/sh,需重新登录生效)
Shell脚本
命名规则
以.sh结尾,明确标识为Shell脚本;
文件名由字母、数字、下划线组成,使用有意义的单词(如install_httpd.sh);
禁止包含%、$、&等特殊符号,避免解析错误。
执行脚本的方式
1../脚本 (必须有执行权限)<br>2..脚本 (必须有执行权限)<br>3.完整路径/脚本 (必须有执行权限)<br>4. sh 脚本 (不需要执行权限)<br>5.bash 脚本 (不需要执行权限)<br>6.source 脚本 (不需要执行权限)
第一个Shell脚本(Hello World)
1.创建脚本文件<br> cd /otp<br> vim hello.sh<br>2.首行添加<br> #!/bin/bash<br> 指定脚本解释器<br>3.添加代码<br> #输出一行文字<br> echo "hello world"<br>4.添加执行权限<br> chmod u+x hello.sh<br>5.运行<br> ./hello.sh
实操案例:自动化部署网站
前期准备:创建网页文件
在/opt目录创建网页文件,粘贴自定义HTML代码<br>cd /opt<br>vim index.html
编写自动化部署脚本
创建脚本install_httpd.sh,整合完整部署流程:<br>vim install_httpd.sh<br>脚本代码如下:<br>#!/bin/bash<br>自动化部署Apache网站脚本<br>1. 卸载旧版httpd,避免冲突<br>yum remove -y httpd<br>2. 安装httpd服务<br>yum install -y httpd<br>3. 启动httpd服务<br>systemctl start httpd<br>4. 关闭防火墙(便于外部访问,生产环境配置端口)<br>systemctl stop firewalld<br>5. 复制网页到Apache根目录<br>cp index.html /var/www/html/index.html<br>6. 重启httpd,使配置生效<br>systemctl restart httpd<br>7.运行<br>chmod u+x install_hattp.sh<br>./install_hattp.sh
shell变量
变量是什么
变量是程序中内存空间,可以存在不同的数据
变量的命名规则
由字母、数字、下划线和$组成<br>不能由数字开头<br>不能是命令或关键字<br>要由有意义的单词组成,如:goods_price<br>
自定义变量
开发者自己定义的变量,用于完成特定业务
定义变量<br>
变量名=值
示例:<br>name="张三”<br>age=20<br>
使用变量
S{变量]<br>echo ${name)<br>减少变量使用的歧义<br>
示例:<br>echo $name<br>echo ${name}
输出:张三_20_宜昌<br>echo $name_$age_$address 存在问题,改为:<br>echo ${name}_${age}_${address]<br>
子主题
环境变量
自定义变量属于局部变量,只能在当前的Shell进程中使用,环境变量属于全局变<br>量,所有Shell进程都可以访问<br>
系统再带的环境变量<br>$SHELL 当前SHELL解释器<br>$PATH程序路径<br>$LANG语言<br>$RANDOM 随机数<br>
定义环境变量
export 变量=值
使用环境变量
和普通变量相同$变量名或${变量名}
案例:普通变量和环境变量的区别<br>在命令行,定义普通变量和环境变量<br>a=100<br>export b=200<br>创建脚本 vim test1.sh<br>#/bin/bash<br>echo "a=$a b=$b"<br>添加执行权限<br>chmod u+x test1.sh<br>./test1.sh<br>
位置变量
使用脚本时,可以向脚本传入参数,位置变量可以获取传入的参数
用法
$n n是数字,$1代表第1参数<br>$@代表所有参数<br>$#代表参数的数量<br>$0代表文件名
案例
vim test2.sh
特殊变量
$?
上一个命令的执行结果<br>0成功>0失败<br>
$$
当前Shel进程的边程号
$!
上一个后台进程的进程号
特殊符号
"双引号"
弱引用,在字符串中输出变量的值<br><br>"a=$a”---> a=100<br>
"单引号"
强引用,字符串会原样输出<br><br>'a=Sa'---> a=$a<br>
'反引号‘
可以执行命令,将命令的结果赋值给变量<br>a='ls -l wc -l'
$()
和反引号作用相同,不容易出现混淆<br><br>a=$(ls - l |wc -l)
$(())
变量进行运算<br>a=1 b=2 c=$((a+b))
只读变量
定义后不能修改的变量
readonly 变量=值
readonly pi=3.14<br>pi=3.15
变量输入
read 选项 变量名<br>选项:-p“提示文字
示例:<br>read -p"请输入账号"usemame<br>read -p"请输入密码"password<br>echo $username $password
案例:完成脚本,在脚本中输入两个变量的值,交换两个变量<br>read -p“输入第一个变量的值:"num1<br>read -p"输入第二个变量的值:"num2<br>echo"交换前:$num1 $num2"<br>tmp=$num1<br>num1=$num2<br>num2=$tmp<br>echo"交换后:$num1 $num2"
shell的运算符
运算符表达式
((表达式1,表达式2))<br>可以包含多个表达式,从左向右执行,引用变量不加$<br>
如:((a=1,b=2,c=a+b))
[表达式 ]<br>包含一个表达式,引用变量要加$<br>
expr 表达式<br>包含一个表达式,引用变量要加$,运算符两边要加空格<br>
算术运算符
执行数学运算的符号,有:+、-、*、/、%、**、++、--<br>
基本的算术运算<br>read -p"请输入第一个数:" num1<br>read -p"请输入第二个数:" num2<br>echo“$num1 +$num2=$((num1+num2))<br>echo "$num1 -$num2=$((num1-num2))"<br>echo "$num1* $num2 =$((num1*num2)<br>echo“$num1/$num2=$((num1/num2))<br>echo "$num1 % $num2=$((num1%num2))<br>echo “$num1 ** $num2 = $((num1**num2))<br>
自增自减运算
属于一元运算符<br>变量++<br>变量--<br>
变量++ 后缀<br>++变量 前缀
没有和其他运算一起执行,前缀和后缀没有区别
有其他运算一起执行,前缀是先执行自增或自减,再执行其<br>他运算,后缀是先执行其他运算,再执行自增或自减<br>
优先级
11+9-8*4/3%5**2=?<br>++-->**>*/%>+-<br>
赋值运算符
将表达式的值保存到变量中
变量=表达式 ,从右到左运算,计算右边表达式的值,存入左边的变量<br>
符合赋值运算符,结合算术运算符和赋值运算,有:<br>+=、-=、*=、/=、%=<br>a+=5 相当于 a=a+5<br>
关系运算符
用于比较两个数值的大小,结果是真(1)或假(0)
-eq 相等,相当于==,[$a-eg 10]<br>-ne 不相等,相当于!=,[$a -ne 10]<br>-gt大于 ,相当于><br>-lt 小于,相当于<<br>-ge 大于等于,相当于>=<br>-le 小于等于,相当于<=
字符串的比较
<br>相等 =[$name ="张三"]<br>不相等!=[$name!="张三"]<br>为空 -z[-z $name]<br>不为空 -n[-n $name]<br>
逻辑运算符
与 -a[条件1-a条件2] 两个条件必须同时成立,结果为真,否则为假
或 -0[条件1-0 条件2]两个条件有一个成立,结果为真,否则为假
非 -n[-n 条件]条件取反,真变假,假变真
文件测试运算符
-e 判断文件是否存在[-e $file]<br>-f 判断是否是普通文件[-f $file]<br>-d 判断是否是目录<br>-1 判断是否是链接<br>-b 判断是否是块文件<br>x 判断是否有执行权限<br>-w 判断是否有写权限<br>-r 判断是否有读权限<br>
分支语句
按条件进行判断,执行不同的语句
基本if语句
条件成立会执行if后的语句,不成立就不执行
if[条件]<br>then<br> 语句<br>fi
案例:输入人的年龄,判断是否成年人<br>read -p"请输入你的年龄”age<br>if[ $age -ge 18 ]<br>then<br> echo"你是成年人"<br>fi<br>
if-else语句
条件成立会执行i后的语句,不成立会执行else后的语句
if[条件]<br>then<br> 语句<br>else<br> 语句<br>fi
案例:输入人的年龄,判断是否成年人<br>read -p"请输入你的年龄”age<br>if[ $age -ge 18]<br>then<br> echo"你是成年人"<br>else<br> echo"你是未成年人"<br>fi
案例:输入一个数,判断是奇数还是偶数<br>read -p"请输入一个数”num<br>if[ $[$num%2] -eg 0 ]<br>hhen<br> echo"Snum是偶数"<br>else<br> echo“Snum是奇数”<br>fi
案例:输入年份,判断是否是闰年(年份能被400整除 或者 年份能被4<br>整除并且不能被100整除)<br>read-p"请输入年份:"year<br>if[ s[$year%400]-8q0-0 $[$year%4]-e9 0 -a $[$year%100]-ne 0 ]<br>men<br> echo"syear是闰年"<br>else<br> echo"Syear不是闰年”<br>fi
案例:招公务员,条件是籍贯是宜昌,年龄小于等于40岁<br>read -p"请输入籍贳" addr<br>read -p"请输入年龄" age<br>if [ -z $addr]<br>then<br> echo“籍贯不能为空"<br> exit<br>if[ -z $age ]<br>then<br> echo"年龄不能为空"<br> exit<br>if[ $addr ="宜昌"-a $age -le 40 ]<br>then<br> echo"你可以报名"<br>else<br> echo"你没有报名资格"<br>fi
多重if语句
可以判断多个条件,依次判断条件,有一个成立就执行后面的语句,执行后结束
if[条件1]<br>then<br> 语句<br>elif[条件2]<br>then<br> 语句<br>else<br> 语句<br>fi
案例:输入你的成绩,判断出优良中差<br>read -p"请输入你的成绩:"score<br>if[ $score -ge 90 ]<br>then<br> echo"你的成绩是优秀"<br>elif[ $score -ge 80 ]<br>then<br> echo"你的成绩是良好"<br>elif[ $score -ge 60 ]<br>then<br> echo"你的成绩是中等”<br>else<br> echo"你的成绩是较差”
案例:输入两个数,输出两个数的大小关系<br>read -p"请输入第一个数:"num1<br>read -p"请输入第二个数:"num2<br>if [ $num1 -gt $num2 ]<br>then<br> echo"Snum1大于Snum2'<br>elif [ Snum1 -lt $num2 ]<br>then<br> echo"Snum1小于Snum2'<br>else<br> echo"snum1等于$num2'<br>fi<br>
案例:输入一个文件路径,判断其是普通文件还是目录还是<br>其他类型的文件,如果是普通文件,则判断是否有写权限,<br>有的话就往文件写入一段文字<br>read -p"请输入一个文件路径"file<br>if[ -e sfile ]<br>then<br> echo"sfile文件存在"<br>else<br> echo"sfile不存在”<br> exit<br>fi<br>if[ -f sfle ]<br>then<br> echo"sfile是普通文件”<br> if [ -w $fle ]<br> then<br> echo "hello" >> Sfile<br> cat $file<br> fi<br>elif [ -d $file ]<br>then<br> echo"sfile是目录”<br>else<br> echo"sfle是其他类型文件"<br>fi<br>
案例:输入一个用户名,判断该用户是否存在,如果不存在则<br>创建该用户,并为其设置密码<br>read -p"请输入用户名:"usemame<br>id Susemame &> idew'null<br>if[s? -eq 0]<br>then<br> echo"$usemame已经存在"<br>else<br> echo"创建Susername"<br> useradd suserame<br> echo "123"passwd $usemame --stdin<br>fi
case语句
判断表达式的值,如果值能够匹配上,就执行该值后面的语句
case 变量表达式 in<br>值1)<br>语句1<br>;;<br>值2)<br>语句2<br>;;<br>*)<br>缺省语句<br>esac<br>
案例:向脚本传入三个参数:数字1数字2 运算符<br>判断运算符执行算术运算<br>case $3 in<br>”+“)<br>echo "s1+ $2 = $(($1+$2))"<br>;;<br>"-")<br>echo"s1-$2= $(($1-52))"<br>;;<br>"*")<br>echo "s1*$2 = $(($1*$2))"<br>""<br>"/")<br>echo"s11$2 = $(($11$2))"<br>""<br>"%")<br>echo 's1 %6 $2 = $(($1%52))"<br>""<br>"**")<br>echo"s1**$2 =$(($1**$2))"<br>;;<br>"*")<br>echo"运算符错误"<br>;;<br>esac
循环语句
for循环
固定次数循环
循环三个要素:变量初始化,循环条件,变量更新
for((变量=值;循环条件,变量更新))<br>do<br> 语句<br>done
案例:循环10次<br>for((i=1;i<=10;i++))<br>do<br> echo "i=$i"<br>done<br>
遍历式循环
可以用于依次访问多个数据(数组,序列..)
for 变量 in $数组 或 序列<br>do<br> 语句<br>done
<br>案例:循环10次<br>for i in {1..10}<br>do<br> echo "i=$i"<br>done<br><br>案例:遍历任意多个数<br>fori in 44 33 88 66 99<br>do<br> echo "i=$i"<br>done<br><br>案例:脚本传入多个参数,将多个参数值求和<br>sum=0<br>for i in $@<br>do<br> ((sum+=i))<br>done<br> echo"参数的和是: $sum"<br><br>案例:遍历/opt目录所有文件名<br>files=$(ls /opt)<br>for f in $files<br>do<br> echo"文件有:$f"<br>done<br><br>
while循环
先判断循环条件,如果成立就执行循环,不成立就结束循环
while[条件] -->while((条件))<br>do<br> 语句 <br>done<br>
案例:循环输出1~10<br>i=1<br>while [ $i -le 10 ]<br>do<br> echo "i= $i"<br> ((i+))<br>done<br>
案例:假设一张纸是1毫米,问对折多少次后能达到珠峰高度8848米<br>i=1<br>count=0<br>while [ $i -le 8848000 1<br>do<br> ((i*=2))<br> ((count++))<br>done<br>echo"对折$count次”<br>
until循环
先判断循环条件,条件成立就结束循环,否则就执行循环
unti[条件]<br>do<br> 语句<br>done
案例:输出1~10<br>i=1<br>until [ $i -gt 10 ]<br>do<br> echo "i= $i"<br> ((i++))<br>done
案例:打印20个斐波拉契数列:112358132134 55<br>n1=1<br>n2=1<br>echo -n "$n1 $n2 "<br>count=0<br>until [ $count -ge 9 ]<br>do<br> ((n1=n1+n2))<br> ((n2=n1+n2))<br> echo -n "$n1 $n2 "<br> ((count++))<br>done<br><br>
循环控制
在循环过程中,通过条件判断来决定是否结束循环,或跳过本次循环
break
结束循环
案例:上班365天,到100天中大奖,跟老板提出辞职<br>for((i=1;i<=365;i++))<br>do<br>if[ $i -eg 100 ]<br>then<br> echo"哇!我中了大奖!小王,以后我不去了!"<br>break<br> echo"我上了$i天班”<br>done
continue
<br>跳过本次循环,执行下一次
案例:上班365天,到100天骑车摔了,跟老板请假一天<br>for((i=1:i<=365:i++))<br>do<br> if[$i -eg 100]<br> then<br> echo“哇!前面有个坑!王老板,我摔了,今天能不能<br>请个假?"<br> continue<br> fi<br> echo"我上了$i天班”<br>done
案例:开发抽奖游戏,产生1~100的随机数,给5次机会输入数,数<br>字比随机数大或小要进行提示,如果相等就提示中奖并结束循环<br>rand=$((SRANDOM%100+1))<br>for((i=1;i<=5:i++))<br>do<br>read -p"请输入一个数:" num<br>if [ $num -gt $rand <br>then<br> echo"你猜大了"<br>elif [ $num -lt $rand ]<br>then<br> echo“你猜小了"<br>else<br> echo“恭喜你,中奖了!"<br> break<br>fi<br>done<br>
嵌套循环
在循环内部可以完整嵌套另一个循环,外部循环每执行一次,<br>内部循环会执行一轮
for<br> for<br>while<br> while
案例:打印矩形(内部循环输出多个*,外部循环<br>控制打印行数)<br># 外层循环控制行数<br>for((i=1:i<=4:i++))<br>do<br> # 内层循环控制*数<br> for((j=1;j<=5;j++))<br> do<br> echo -n "* "<br> done<br> # 输出换行<br> echo ""<br>done<br>改进:将行数和列数改为参数控制 $1 $2<br>
案例:打印正三角型<br>*<br>* *<br>* * *<br>* * * *<br>for((i=1;i<=4;i++))<br>do<br>for((j=1;j<=i;j++))<br>do<br>echo -n "*"<br>done<br>echo"<br>done
案例:等腰三角形<br> * 1 3空(4-行) 1*(2*行-1)<br> * * * 2 2空 3*<br> * * * * * 3 1空 5*<br>* * * * * * * 4 0空 7*<br><br>for((i=1;i<=4;i++))<br>do<br> for((j=1;j<=$((4-i));j++))<br> do<br> echo -n " "<br>for((k=1;k<=$((2*i-1));k++))<br>do<br> echo -n "*"<br> done<br> echo<br>done<br>
数组
可以同时保存多个数据,方便运算
定义数组
数组名=(值1 值2 值3 )
如:names=("张三" "李四" "万五")
访问数组
数组元素通过下标来访问的,下标从0开始
修改数组元素<br>
数组名[下标]=值
如:names[0]="刘备"
访问数组元素
${数组名[下标]}
如:echo ${names[0]} ${names[1]} ${names[2]}
访问所有元素
${数组名[@]}
如:echo ${names[@]}
访问数组长度
${#数组名[@]}
如:echo ${#names[@]}
截取数组
${数组名[@]:开始下标:长度}
如:<br>echo "前三位是:${names[@]:0:3}"<br>echo "后三位是:${names[@]:3:3}"
遍历数组
常见for循环
案例:<br>names=("张三" "李四" "王五" "赵六")<br>#获得数组的长度<br>len=${#names[@]}<br>for((i=0;i<len;i++))<br>do<br> echo "第$((i+1))人是:${names[$i]}<br>done
for-in循环
案例:<br>nums=(77 88 99 102 802 622)<br>for n in ${nums[@]}<br>do<br> echo "num=${n}"<br>done
相关案例
1)输入5个同学的成绩,计算总分和平均分<br>scores=()<br>len=5<br>sum=0<br>for((i=0;i<len;i++))<br>do<br> read -p "请输入第$((i+1))个同学成绩:" scores[$i]<br> sum=$[$sum+${scores[$i]}]<br>done<br>echo "总成绩是:$sum,平均分是:$((sum/len))"
2)输入8个人的姓名,输入要查找的姓名,查找该人是否存在<br>names=()<br>len=8<br>for((i=0;i<len;i++))<br>do<br> read -p "请输入第$((i+1))个人的姓名:" names[$i]<br>done<br>read -p "请输入你要找的姓名:" name<br>pos=-1<br>for((i=0;i<len;i++))<br>do<br> echo "$name ${names[$i]}"<br> if [ $name = ${names[$i]} ]<br> then<br> pos=$i<br> break<br> fi<br>done<br>if [ $pos -eq -1 ]<br>then<br> echo "没有找到这个人"<br>else<br> echo "此人是第$((pos+1))个人"<br>fi
3)输入5个数字,进行冒泡排序<br>nums=()<br>len=5<br>for((i=0;i<len;i++))<br>do<br> read -p "请输入第$((i+1))个数:" nums[$i]<br>done<br># 外层循环控制比较轮数<br>for((i=0;i<$[$len-1];i++))<br>do<br> # 内层循环控制两两比较<br> for((j=0;j<$[$len-1-$i];j++))<br> do<br> # 前一个数比后一个数大,就交换<br> if [ ${nums[$j]} -gt ${nums[$[$j+1]]} ]<br> then<br> temp=${nums[$j]}<br> nums[$j]=${nums[$[$j+1]]}<br> nums[$[$j+1]]=$temp<br> fi<br> done<br>done<br># 输出排序后结果<br>for n in ${nums[@]}<br>do<br> echo $n<br>done
文件三剑客
1)grep 文件内容的过滤<br>2)sed 按行查找并编辑文件内容<br>3)awk 按列处理文件,支持流程控制
GREP命令
对文件内容进行过滤,支持正则表达式
语法
grep 选项 "内容" 文件路径
grep "root" /etc/passwd
选项<br>-i 表示忽略过滤信息的大小写<br>-o 表示只显示匹配到内容<br>-n 表示过滤信息显示输出行号<br>-c 表示统计过滤信息的次数<br>-v 表示对过滤信息进行取反显示<br>-e 表示多个条件过滤文件<br>-E 等价于egrep命令,识别扩展正则表达式<br>-m n 表示匹配前n次后停止匹配<br>-B n 表示过滤的信息和过滤信息前n行信息一起过滤输出<br>-A n 表示过滤的信息和过滤信息后n行信息一起过滤输出<br>-C n 表示过滤的信息和过滤信息前后n行信息一起过滤输出
案例:<br>1)忽略大小写,查找root<br>grep -i "Root" /etc/passwd<br>
2)只显示匹配的内容<br>grep -o "root" /etc/passwd
3)显示行号<br>grep -o -n "root" /etc/passwd
4)统计root出现的行数<br>grep -c "root" /etc/password
正则表达式
一些特殊文字符号,能够组合更灵活匹配的匹配字符串
元字符
. 任意一个字符<br>[ ] 匹配范围内的一个字符<br>[0-9] 数字<br>[a-z] 小写字母<br>[A-Z] 大写字母<br>[abc] abc中任意一个<br>[^abc] 不是abc的任意字符<br>[a-zA-Z0-9] 任意的字母或数字
案例<br>1)找passwd文件中所有的数字<br>grep "[0-9]" /etc/passwd
位置匹配
^ 匹配开头<br>$ 匹配结尾
案例
1)查找root开头的文字<br>grep "^root" /etc/passwd
2)查找login结尾的文字<br>grep "login$" /etc/passwd
3)匹配完整的hello world文字<br>grep "^hello world$" test
4)匹配hello开头的world结尾的文字<br>grep "^hello.*world$" test
次数匹配
* 匹配任意长度<br>以下符号属于扩展正则表达式<br>+ 匹配一次以上<br>? 匹配0次或1次<br>{n} 匹配n次<br>{n,m} 匹配n到m次数<br>{n,} 匹配至少n次<br>{,n} 匹配最多n次
案例
1)匹配网址 www开头 .com结尾 中间有任意多文字<br>grep "^www\.[a-zA-Z0-9]*\.com$" test.txt
2)匹配正整数<br>grep -E "^\+?[0-9]+$" test.txt
3)匹配4位数字<br>grep -E "^[0-9]{4}$" test.txt
4)匹配4到6位数字<br>grep -E "^[0-9]{4,6}$" test.txt
5)匹配3位以上数字<br>grep -E "^[0-9]{3,}$" test.txt
6)匹配手机号 11位数字 第1位是1 第二位是3~9<br>grep -E "^1[3-9][0-9]{9}$" test.txt
分组
将一系列字符作为整体进行匹配<br>匹配两个good<br>good{2} ---> goodd<br>(good){2} ----> goodgood
案例
1)匹配连续的两个hello<br>grep -E "(hello){2}" test.txt
2)查找一个hello或world<br>egrep -e "hello" -e "world" test.txt<br>egrep "(hello|world)" test.txt
3)查找连续的两个三位字母和三位数字 abc454gaw454<br>egrep "^([a-zA-Z]{3}[0-9]{3}){2}$" test.txt
SED命令
流编辑器,按行对文件内容进行处理(增删改查)
用法 : sed 选项 "操作" 文件路径
选项<br>-n 关闭sed默认的输出<br>-r 识别扩展正则表达式<br>-i 可以修改原始文件
操作<br>p 打印<br>c 替换<br>s 查找+替换<br>d 删除<br>i 插入<br>a 追加<br>w 写入文件<br>r 读取文件
案例
按行查找
1)输出文件内容<br>sed -n "p" test.txt
2)输出文件的第5行<br>sed -n "5p" test.txt
3)输出文件的5到10行<br>sed -n "5,10p" test.txt
4)输出5到最后一行<br>sed -n "5,\$p" test.txt<br>sed -n '5,$p' test.txt
5)打印第6到后面3行<br>sed -n '6,+3p' test.txt
6)打印奇数行(设置步长 开始行数~步长)<br>sed -n '1~2p" test.txt
正则表达式
1)查找以hello开头的行sed -n 'ahello/p' test.txt<br>
2)打印第二行到以hello开头的行sed -n '2,/^hello/p' test.txt
3)从hello开头的行打印到world结尾行sed -n'/^helo/p‘test.text
替换
替换整行
行号或正则表达式c替换的内容
案例
1)把第三行改为<br>替换整行<br>sed "3c" test.txt <br>默认sed不改原始文件,必须加-i<br>sed -i"3c" test.txt <br>2)修改原始文件同时对文件进行备份-i后缀名<br>sed -i.bak "5c=================" test.txt
查找和替换
s/搜索的内容/替换的内容/g g全局替换,默认只替换第一个<br>s#搜索的内容替的内容#g
案例
1)将文件中的hello替换为nice <br>sed -i "s/hello/nice/g" test.txt
2)修改网络配置文件<br>cp letc/sysconfig/network-scripts/ifcfg-ens33 /opt/ip.txt <br>sed -i-r's/^IPADDR=([0-9K1,3}1.{3}[0-9] <br>{1,3}$/IPADDR=192.168.101.188/g' ip.txt
删除
1)删除第二行<br>sed"3d" test.txt <br>2)删除3到5行<br>sed '3,5d' test.txt <br>3)删除hello开头的行<br>sed-i'Ahello/d' test.txt
插入
1)在第行的前面插入6666666666666 <br>sed '3i6666666666666666' test.txt
2)在第5行后面插入******************************sed'5a******************************test.txt
3)在nice开头的行后面插入%%%%%%%%%%%% <br>sed '/#nicela%%%%%%%%%%%%%%%%%%' test.txt
AWK命令
是一种脚本语言,支持按列对文件进行统计
用法:awk 选项 '脚本代码' 文件路径
选项
-F 用于设置分隔符,默认是空格<br>-v 用于定义变量<br>选项 -f 用于指定脚本文件
内容变量
FS 分隔符<br>内置变量 NF 列数<br>NR 行数
案例
1)基本用法<br>awk -F: '{print 1,1,3}' /etc/passwd<br>列引用方式: n \text{如}:n如:1 第一列 0 \text{整行}0整行NF NF是列数 $NF 代表最后一列
子主题
子主题
子主题
子主题
子主题
子主题
0 条评论
下一页