优秀是一种习惯
- 知识点01:回顾
- 知识点02:目标
- 知识点03:VI编辑器及远程编辑工具
- 知识点04:Linux网络配置及虚拟机网络管理
- 知识点05:远程文件交互
- 知识点06:Linux软件安装:安装方式
- 知识点07:Linux软件安装:MySQL安装
- 知识点08:Linux软件安装:JDK安装
- 知识点08:文本处理:cut
- 知识点09:文本处理:wc、du
- 知识点10:文本处理:awk
- 知识点11:Shell脚本:功能及开发规则
- 知识点12:Shell脚本:变量类型与使用
- 知识点13:Shell脚本:字符串定义及处理
- 知识点14:Shell脚本:数值运算
- 知识点15:Shell脚本:判断
- 知识点16:Shell脚本:循环与控制
- 知识点17:Shell脚本:函数
- 知识点18:Shell脚本:数组
- 知识点19:Shell脚本:select
- 知识点20:Shell脚本:运行方式及嵌套运行
知识点01:回顾
-
Linux文件系统是什么样的结构?
- 树形结构
- 第一层:/
- 第二层
- etc:配置文件的目录
- bin:普通命令
- sbin:管理命令
- var:存放日志目录
- lib:依赖库的目录
- usr:用于安装软件的
- root:管理员家目录
- home:所有普通用户的家目录的父目录
- tmp:临时目录
- 第二层
-
Linux中的命令是如何使用的?
命令 [-选项] 参数
-
如何实现对Linux中文件的列举、切换、创建及删除?
-
列举:ls [alhd] 目录
-
切换:cd 目录
-
创建
- touch file1 file2……
- mkdir [-p] 目录
-
删除
- rm -rf
-
-
如何实现对Linux中文件的复制、剪切、压缩及打包?
-
复制:cp [-r] source target
-
剪切:mv source target
-
压缩
- zip,unzip
- gzip,gunzip
- bzip2,bunzip2
-
打包
-
tar -zcvf :打包并以gzip压缩
-
tar -zxvf : 解压并解包
-
-
-
Linux中的基本权限有几种?如何实现修改权限?
-
基本权限
- 可读:r 4
- 可写:w 2
- 可执行:x 1
-
修改权限
-
chmod a-r,u+x 文件或者目录
-
chmod 777 文件或者目录
-
-
-
Linux中怎么查看、关闭进程?
-
查看:ps -ef , jps
-
关闭
-
kill -9 pid:关闭后台进程
-
Ctrl +c :终止前端进程
-
-
-
Linux中怎么管理服务的启动、关闭、重启以及设置开启自启动?
systemctl start|stop|restart|status|enable|disable 服务名称
-
Linux有哪些常见符号命令及其功能?
-
|:管道,实现数据传递
ps -ef | grep ssh
-
~:当前用户的家目录
>:输出重定向命令,覆盖 >>:输出重定向命令,追加 `:执行符号 .:当前目录 ..:上一级目录 \:命令的换行符
-
知识点02:目标
- 文本编辑:vim
- 网络配置
- Linux中软件的安装 【重要】
- Linux中文件的交互:怎么将文件放到Linux上?
- 软件的安装方式
- MySQL:使用yum安装
- JDK:解压安装
- 文本处理的命令【了解】
- cut、wc、du、awk
- Shell 脚本【重点】
- 将一堆命令塞到一个文件中一起运行
知识点03:VI编辑器及远程编辑工具
- 目标:掌握Linux中vi编辑器的使用及notepad的使用
- Linux中如何实现文本编辑?
- vi/vim命令如何使用?
- notepad如何使用?
- 路径
- step1:Linux中文本编辑的两种方式
- step2:vi/vim命令的使用
- step3:远程编辑工具notepad的使用
- 实施
-
Linux中文本编辑的两种方式
- 命令:vi/vim
- 优点:方便快捷,支持各种快捷操作
- 缺点:不适合复杂大数据量的数据操作
- 应用:小的轻量级的修改
- 工具:notepad等远程文本编辑工具来实现
- 优点:功能更加强大,交互性更好
- 缺点:轻量级的修改有点繁琐
- 应用:大的变化修改
- 命令:vi/vim
-
vi/vim命令的使用
-
语法:vim 文件
-
命令模式
- 进入:vim直接进入或者在其他模式下按esc
- 功能:用于实现一些快捷的操作
- 命令
- yy:复制当前行
- Nyy:复制从当前行开始的N行
- p:粘贴剪贴板的内容
- dd:剪切
- Ndd
- G:跳转最后一行
- gg:跳转到第一行
- Ngg:跳转到第N行
- i:进入编辑模式
- A:行尾插入
- O:上一行插入
- o:下一行插入
- u:撤销上一步操作
- yy:复制当前行
-
编辑模式
- 进入:在命令模式中执行编辑的命令、
- 功能:实现数据的增删改
-
末行模式
-
进入:在命令模式下按冒号
-
功能:一般用于实现文件的保存等
-
命令
-
q:退出
-
w:保存
-
wq:保存退出
-
!:强制的
-
x:保存退出,不能写大写的X
-
替换
n,ms/你要替换谁/替换成什么/g
-
-
-
-
远程编辑工具notepad的使用
-
如果要实现复杂的文本的编辑,用远程编辑工具更加方便
-
notepad:安装插件来实现:NPP
-
安装插件
- 在线安装
-
-
- 离线安装
- step1:离线下载插件Npp
- step2:notepad中加载这个插件
- 小结
- Linux中如何实现文本编辑?
- 命令:轻量级的修改
- 工具:复杂的数据修改
- vi/vim命令如何使用?
- 命令模式:实现快捷命令
- 编辑模式:数据修改
- 末行模式:保存和退出的
- notepad如何使用?
- step1:通过插件配置远程连接
- step2:下载、编辑、保存即可
- Linux中如何实现文本编辑?
知识点04:Linux网络配置及虚拟机网络管理
-
目标:掌握Linux系统中网络配置及VM中虚拟机网络的配置
- Linux中如何修改网络信息?
- Linux中如何管理防火墙?
- 如果VM中的虚拟机连不上网或者突然连不上怎么办?
-
路径
- step1:Linux中网卡配置管理
- step2:防火墙管理
- step3:VM虚拟机常见问题
-
实施
-
Linux中网卡配置管理
-
查看网络信息
ifconfig
-
查看网络配置
more /etc/sysconfig/network-scripts/ifcfg-ens33
-
修改网络配置
vim /etc/sysconfig/network-scripts/ifcfg-ens33
-
修改网络地址获取方式为静态
#修改第4行 BOOTPROTO="static"
-
添加静态网络配置信息
#文件末尾添加以下内容 IPADDR="192.168.88.130" GATEWAY="192.168.88.2" NETMASK="255.255.255.0" DNS1="8.8.8.8" DNS2="114.114.114.114" IPV6_PRIVACY="no"
-
重启网络配置
systemctl restart network
-
-
防火墙管理
-
大数据平台中一般不开启防火墙
-
工作中:如果使用,需要让运维配置各种访问规则
-
因为大数据集群时内网集群,不对外连接,可以不开防火墙
-
关闭防火墙并设置开机禁止启动
systemctl stop firewalld.service systemctl disable firewalld.service
-
-
VM虚拟机常见问题
-
连不上外网?
-
现象:ping百度ping不通,CRT能连上
-
原因以及解决
- 检查网关与VM的配置是否一致
-
UnKnown Host:DNS异常,检查DNS即可
-
-
突然远程连接不上?
-
现象:本来好好的,突然CRT连不上
-
解决
-
先检查Linux的网卡是否正常:ifconfig
-
如果网卡正常:建议检查Windows的虚拟网卡是否为网段.1
-
如果上一步也正常,检查VM的服务是否正常启动
-
-
-
Linux网卡突然消失?
- 服务管理冲突
- network:默认管理服务
- NetworkManager:网卡管理服务
- 启动时候加载同一个配置冲突
- 解决
- 关闭NetworkManager,并禁止开机自启
- 服务管理冲突
-
-
-
小结
- Linux中如何修改网络信息?
- 修改配置文件
- 设置静态地址
- 设置地址信息:IP、NetMask、Gateway、DNS
- 修改配置文件
- Linux中如何管理防火墙?
- 大数据集群关闭防火墙
- 如果VM中的虚拟机连不上网或者突然连不上怎么办?
- 参考解决方案解决即可
- Linux中如何修改网络信息?
知识点05:远程文件交互
-
目标:掌握Linux中的远程文件交互的实现
- 怎么将本地文件上传到Linux文件系统中?
-
路径
- step1:远程文件交互场景
- step2:远程交互工具
- step3:远程文件交互命令
-
实施
-
远程文件交互场景
- 经常需要在Linux中安装软件
- 需要将下载好的软件放到Linux集群中
-
远程交互工具
- XFTP
- SecureFX
- FileZila
- ……
-
远程文件交互命令
-
通过rz来实现
-
安装lrzsz工具,使用命令上传
yum install -y lrzsz
-
-
- 上传
```
rz
```
-
小结
- 怎么将本地文件上传到Linux文件系统中?
- 方式一:远程工具连接,实现拖拽
- 方式二:通过工具命令,rz
- 怎么将本地文件上传到Linux文件系统中?
知识点06:Linux软件安装:安装方式
-
目标:了解Linux中软件安装的四种方式
- 如何在Linux中实现软件的安装?
-
路径
- step1:RPM包安装
- step2:YUM安装
- step3:编译安装
- step4:免安装
-
实施
-
RPM包安装
-
类似于Windows上.exe文件的安装,运行文件,自动安装
-
文件的格式:xxxx.rpm
-
命令
#安装 rpm -ivh 文件路径/包的名称.rpm #卸载,--nodeps,强制不考虑依赖的卸载 rpm -e [--nodeps] 包的名称 #查询 rpm -qa | grep MySQL
-
缺点:安装的时候必须先安装依赖,才能安装这个软件
- 类似于:要装MySQL,先装VC++,装.Net,才能装MySQL
-
-
YUM安装
-
类似于Java中的Maven的仓库管理方式
-
将所有软件以及对应的依赖都放在公共仓库中
-
通过yum安装软件时,自动根据依赖关系,下载依赖并且按照顺序进行自动安装
-
命令
#安装 yum install -y 包的名称 #卸载 yum remove -y 包的名称 #查询 yum list installed
-
注意
-
必须配置Yum仓库
-
配置文件
-
-
-
- 运维会配置局域网YUM源
-
编译安装
- 直接拿源码在Linux中编译后进行安装
- Java:Maven
- C/C+:GC++
- step1:预编译:./configure
- step2:编译:make
- step3:安装:make install
-
免安装
- 用的最多的方式:下载解压就相当于安装了
-
小结
- Linux中软件安装的四种方式分别是?
- RPM包
- YUM安装
- 源码编译
- 免安装
- Linux中软件安装的四种方式分别是?
知识点07:Linux软件安装:MySQL安装
-
目标:实现Linux系统中MySQL的安装部署
-
路径
- step1:配置YUM依赖
- step2:在线安装MySQL
- step3:启动测试配置
-
实施
-
配置YUM源
-
下载MySQL的yum源
wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm
-
安装yum源
rpm -ivh mysql80-community-release-el7-1.noarch.rpm
-
-
- 修改yum源
```
cd /etc/yum.repos.d/
vim mysql-community.repo
```
```shell
#修改第13行,更改为1,表示启用MySQL5.6
enabled=1
#修改第28行,更改为0,表示禁用MySQL8
enabled=0
```
-
安装MySQL
-
安装MySQL
yum -y install mysql-community-client mysql-community-server mysql-community-devel
-
- 启动MySQL服务
```
systemctl start mysqld.service
systemctl enable mysqld.service
```
- 查看状态
```
systemctl status mysqld.service
```
-
登陆测试配置
-
登录
mysql -uroot
-
重置MySQL管理员用户密码
set password = password('123456');
-
- 授权
```sql
#允许root用户从任何一台机器通过123456密码登录访问任何一个数据库中的任何 一张表,拥有所有权限
grant all privileges on *.* to 'root'@'%' identified by '123456';
delete from mysql.user where host != '%';
flush privileges;
```
- 退出重新登录
exit;
mysql -uroot -p
123456
- 使用远程终端Navicat工具连接
-
小结
- 按照步骤一步步实现即可
知识点08:Linux软件安装:JDK安装
-
目标:实现Linux中JDK的安装
-
路径
-
step1:创建安装目录
-
step2:上传解压安装
-
step3:配置环境变量
-
-
实施
-
创建安装目录
#用于存放软件的安装包 mkdir -p /export/software #用于存放安装的目录 mkdir -p /export/server #用于存放临时测试的数据 mkdir -p /export/datas
-
上传解压安装
cd /export/software/ rz tar -zxvf jdk-8u241-linux-x64.tar.gz -C /export/servers/
-
配置环境变量
-
Linux中全局环境变量的配置文件:/etc/profile
-
配置环境变量
-
-
vim /etc/profile
#在文件最后添加以下内容
#JAVA_HOME
export JAVA_HOME=/export/servers/jdk1.8.0_241
export PATH=:$PATH:$JAVA_HOME/bin
- 刷新环境变量
source /etc/profile
- 测试
java -version
jps
-
小结
- 按照步骤一步步实现即可
知识点08:文本处理:cut
-
目标:了解文本处理命令cut的使用
-
路径
- step1:cut的功能及语法
- step2:cut实现列裁剪测试
-
实施
-
cut的功能及语法
-
功能:用于实现结构化数据中列的处理,从文件中筛选列的数据
-
语法
cut [-dfc] 文件
- d:指定列的分隔符
- f:指定获取对应的列
- c:指定获取对应的字符
-
-
cut实现列裁剪测试
-
创建文件
cd /export/data/ mkdir test cd test vim stu.txt
id name age score 01 tom 18 78 02 jack 20 85 03 bill 16 90 04 mary 24 77 05 anna 21 85
-
-
-
截取文件中的第1列
cut -d " " -f 1 stu.txt
- 截取文件中的第1和第3列
cut -d " " -f 1,3 stu.txt
- 截取文件中的第1到第3列
cut -d " " -f 1-3 stu.txt
- 截取文件中的第2列以后的内容
cut -d " " -f 2- stu.txt
- 截取文件中的第4列之前的内容
cut -d " " -f -3 stu.txt
- 截取文件中的前5个字符
cut -c 1-5 stu.txt
-
小结
- cut的功能与语法是什么?
- 功能:对数据文件中列的截取
- 语法:cut [-dfc] 文件
- cut的功能与语法是什么?
知识点09:文本处理:wc、du
-
目标:了解文本处理命令wc与du命令的功能与用法
-
路径
- step1:wc的功能与用法
- step2:du的功能与用法
-
实施
-
wc的功能与用法
-
功能:统计文本中字符、单词、行的个数
-
语法
wc [-cwl] 文件
-
测试
[root@node1 test]# wc stu.txt 6 24 87 stu.txt [root@node1 test]# wc -c stu.txt 87 stu.txt [root@node1 test]# wc -w stu.txt 24 stu.txt [root@node1 test]# wc -l stu.txt 6 stu.txt [root@node1 test]#
-
-
du的功能与用法
-
功能:用于统计文件大小
-
语法
du [-sh] 目录或者文件
- h:人性化的显示单位
- s:汇总显示,不显示子文件的大小
-
测试
-
-
-
小结
- wc的功能与语法是什么?
- 功能:获取文件中的字符、单词和行数
- 语法:wc [-cwl] 文件即可
- du的功能与语法是什么?
- 功能:统计文件或者目录大小
- 语法:du [-sh] 文件
- wc的功能与语法是什么?
知识点10:文本处理:awk
- 参考课件了解即可
- Linux中最常用的两个功能非常强大的命令:sed与awk
知识点11:Shell脚本:功能及开发规则
- 目标:掌握shell脚本的功能及开发规则
- 为什么要开发Shell脚本?
- 如何开发一个Shell脚本?
- 路径
- step1:Shell脚本的功能与应用场景
- step2:Shell脚本的开发规则
- step3:Shell脚本测试
- 实施
-
Shell脚本的功能与应用场景
- 功能
- 批量化处理
- 自动化处理
- 应用
- 创建100个个目录,dir001 ~ dir100
- 每天希望Linux自动实现一些操作
- 功能
-
Shell脚本的开发规则
-
什么是shell?
- 介于用户和内核之间,将用户的命令翻译给内核听的
- 叫做解释器:Linux中有多种不同的解释器
- 默认:bash shell
-
开发规则
-
step1:必须在脚本文件的头部声明解释器类型
#!/bin/bash
-
step2:在脚本文件中写Linux命令以及其他语法
-
step3:脚本必须拥有执行权限,才可以被运行
chmod u+x 脚本文件
-
-
-
Shell脚本测试
-
开发一个脚本,打印当前路径并列举根路径下面的内容
mkdir /export/data/shell cd /export/data/shell
#!/bin/bash #print work dir pwd #list the root path ls /
-
-
- 开发一个脚本,输出昨天的日期
#!/bin/bash
#get yesterday
yesterday=`date -d '-1 day' +%Y-%m-%d`
#print yesterday
echo "${yesterday}"
- 小结
- 为什么要开发Shell脚本?
- 批量化命令处理
- 自动化处理
- 如何开发一个Shell脚本?
- step1:声明解释器的类型
- step2:写入命令即可
- step3:赋予执行权限执行即可
- 为什么要开发Shell脚本?
知识点12:Shell脚本:变量类型与使用
-
目标:掌握Shell脚本中的变量类型与使用
- Shell脚本中的变量有哪几种以及如何使用?
-
路径
- step1:系统变量
- step2:内置变量
- step3:用户变量
- step4:变量使用
-
实施
-
系统变量
- 一般都是大写的
- 查看系统变量:env
- PATH:Linux系统的全局环境变量
- PWD:当前所在的位置
- USER:当前的用户
-
内置变量
-
脚本默认提供的几个变量
-
$0:表示当前脚本的名称
-
$1 ~ $9:脚本第1个参数到第9个参数
-
$# :脚本传递参数的个数
-
$?:上一条命令执行的结果,0表示上一条命令正确执行成功
-
$*:所有参数值,所有参数是一个整体
-
$@:所有参数值,每个参数是独立的
#!/bin/bash echo $0 echo $1 echo $2 echo $9 echo $# echo $? echo $* echo $@
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3XHJT0i1-1618744469790)(Day02_20210418_Linux进阶(一).assets/image-20210418151024835.png)]
-
-
用户变量
-
定义:var=value
[root@node1 shell]# a=1 [root@node1 shell]# b=2 [root@node1 shell]# echo $a 1 [root@node1 shell]# echo $b 2 [root@node1 shell]#
-
注意
- 没有数据类型之分
- 赋值时变量名与等号还有值之间不能有空格
-
-
变量使用
-
引用:${var}
- 标准:${a}
- 简写:$a
- 有些场景下,简写会出现问题,与特殊符号放在一起用的时候
-
只读:readonly
[root@node1 shell]# re=6 [root@node1 shell]# echo $re 6 [root@node1 shell]# re=8 [root@node1 shell]# echo $re 8 [root@node1 shell]# readonly re [root@node1 shell]# echo $re 8 [root@node1 shell]# re=10 -bash: re: 只读变量 [root@node1 shell]#
-
删除:unset
[root@node1 shell]# c=9 [root@node1 shell]# echo $c 9 [root@node1 shell]# unset c [root@node1 shell]# echo $c [root@node1 shell]#
-
-
-
小结
-
Shell脚本中的变量有哪几种以及如何使用?
- 分类
- 系统变量:一般大写,PATH、PWD、USER
- 内置变量:$0,$1 ~ 9 , 9 , 9,# , ? , ? , ?,*,$@
- 用户变量:key=value
- 使用
- 引用:${变量名}
- 只读:readonly 变量名
- 删除:unset 变量名
-
知识点13:Shell脚本:字符串定义及处理
-
目标:掌握Shell中字符串的处理
- shell中的字符串如何实现定义、截取、拼接、统计长度?
-
路径
- step1:Shell中字符串的定义
- step2:Shell中字符串的处理
-
实施
-
Shell中字符串的定义
-
定义:变量名=“字符串内容”
[root@node1 shell]# str1=I [root@node1 shell]# str2=Like [root@node1 shell]# echo ${str1} I [root@node1 shell]# str3="I Like" [root@node1 shell]# echo ${str3} I Like [root@node1 shell]#
-
-
Shell中字符串的处理
-
截取:${变量名:N:M}
[root@node1 shell]# echo ${str3:3:2} ik
-
N:从哪一位开始截取的下标,下标从0开始
-
M:截取的长度
-
-
拼接:直接使用双引号拼接
[root@node1 shell]# echo "${str3} itcast" I Like itcast [root@node1 shell]# str4="${str3} itcast" [root@node1 shell]# echo ${str4} I Like itcast
-
长度:${#变量名}
[root@node1 shell]# echo ${#str1} 1 [root@node1 shell]# echo ${#str2} 4 [root@node1 shell]#
-
-
-
小结
- shell中的字符串如何实现定义、截取、拼接、统计长度?
- 定义:变量名=“内容”
- 截取:${变量名:N:M}
- 拼接:使用双引号拼接即可
- 长度:${#变量名}
- shell中的字符串如何实现定义、截取、拼接、统计长度?
知识点14:Shell脚本:数值运算
-
目标:掌握Shell中数值的运算
- 如何在shell中对两个数值变量进行计算?
-
路径
- step1:计算命令expr
- step2:计算表达式
-
实施
-
计算命令expr
[root@node1 shell]# expr $a + $b 3
- 运算符两边必须有空格
-
计算表达式
-
中括号
[root@node1 shell]# echo $[ a + b ] 3 [root@node1 shell]# echo $[ $a + $b ] 3
- 规则:中括号中间的内容与中括号之间要留有空格
-
圆括号
[root@node1 shell]# echo $((a+b)) 3 [root@node1 shell]# echo $(($a+$b)) 3 [root@node1 shell]#
- 语法:双圆括号
-
-
-
小结
- 如何在shell中对两个数值变量进行计算?
- 方式一:命令实现
- expr v1 op v2
- 方式二:表达式实现
- 中括号
- 双圆括号
- 方式一:命令实现
- 如何在shell中对两个数值变量进行计算?
知识点15:Shell脚本:判断
-
目标:掌握Shell中判断语句的使用
- Shell中如何实现条件判断?
-
路径
- step1:条件判断if
- step2:条件判断case
-
实施
-
条件判断if
-
语法
-
方式一:单条件单结果
if [ 条件 ] then 满足条件怎么处理 fi
-
方式二:单条件双结果
if [ 条件 ] then 满足条件怎么处理 else 不满足条件怎么处理 fi
-
方式三:多条件多结果
if [ 条件1 ] then 满足条件1怎么 处理 elif [ 条件2 ] then 满足条件2怎么处理 …… else 都不满足怎么处理 fi
-
-
判断条件表达式
-
文件
-
-e:用于判断这个文件是否存在
-
-f:用于判断这是否是个文件
-
-d:用于判断这是否是个目录
-
-w:用于判断是否有可写权限
-
-r:用于判断是否有可读权限
-
-
数值
-
-eq:等于
-
-ne:不等于
-
-gt:大于
-
-lt:小于
-
-ge:大于等于
-
-le:小于等于
-
-
字符串
- =:相等
- != :不相等
- -n:not null,不为空
- -z:zero,为空
-
-
测试
-
判断/etc/passwd文件是否存在
#!/bin/bash if [ -e /etc/passwd ] then echo "exists" else echo "not exists" fi
-
判断/etc/passwd是否是一个文件
-
判断一个目录是否存在,如果不存在,就创建
#!/bin/bash if [ -e $1 ] then echo "exists" else #不存在就创建 mkdir $1 fi
-
判断两个数字是否相等
-
判断两个数字大小,得到比较的结果
#!/bin/bash read -p "请输入第一个数字:" a read -p "请输入第二个数字:" b if [ $a -eq $b ] then echo "a=b" elif [ $a -gt $b ] then echo "a>b" else echo "a<b" fi
- read:用于读取用户的输入,-p表示提示语句
-
判断输入参数的个数
#!/bin/bash if [ $# -eq 2 ] then echo "bingo" else echo "参数个数不合法,请给定两个参数" #强制退出 exit 100 fi echo "这是一条测试语句"
- exit:表示终止当前程序
- 100:随便给定一个数值做标记,标记错误发生的位置
-
判断字符串是否相等
-
判断是否为空
#!/bin/bash if [ -n "$1" ] then echo "第一个参数的值:$1" else echo "没有第一个参数" fi
- 如果要判断是否为空,对于变量需要使用引号包裹
-
多条件判断:并且:&& / -a
#参数个数必须为2,而且第一个参数的值必须为itcast if [ $# -eq 2 ] && [ $1 = "itcast" ] then echo "参数个数没问题,你很优秀" else echo "参数个数不正确或者第一个参数值不正确,请重新执行" fi
#参数个数必须为2,而且第一个参数的值必须为itcast if [ $# -eq 2 -a $1 = "itcast" ] then echo "参数个数没问题,你很优秀" else echo "参数个数不正确或者第一个参数值不正确,请重新执行" fi
-
多条件判断:或者:|| / -o
#参数个数为2个,或者第一个参数的值为itcast if [ $# -eq 2 -o $1 = "itcast" ] then echo "参数个数没问题,你很优秀" else echo "参数个数不正确或者第一个参数值不正确,请重新执行" fi
#参数个数为2个,或者第一个参数的值为itcast if [ $# -eq 2 ] || [ $1 = "itcast" ] then echo "参数个数没问题,你很优秀" else echo "参数个数不正确或者第一个参数值不正确,请重新执行" fi
-
-
-
值判断case
-
语法
case value in v1) 等于v1,执行的语句 ;; v2) 等于v2,执行的语句 ;; …… *) 如果都不满足,执行的语句 ;; esac
-
判断输入
#!/bin/bash read -p "请输入y或者n:" input case $input in "y") echo "你的输入是yes" ;; "n") echo "你的输入是no" ;; *) echo "你的输入不正确" ;; esac
-
-
-
小结
-
Shell中如何实现条件判断?
-
if
-
方式一
if [ 条件 ] then fi
-
方式二
if [ 条件 ] then else fi
-
方式三
if [ 条件1 ] then elif [条件2] …… else fi
-
-
case
case 变量 in v1) 符合v1的操作 ;; v2) 符合v2的操作 ;; …… *) 都不符合的结果 ;; esac
-
-
知识点16:Shell脚本:循环与控制
-
目标:掌握Shell中循环的语法实现
- Shell中如何实现循环?
- Shell中如何控制循环?
-
路径
- step1:for循环
- step2:while循环
- step3:死循环
- step4:break与continue
-
实施
-
for循环
-
语法
-
方式一:一般用于迭代取非数值的循环
for var in 取值范围 do 每次循环要执行的命令 done
-
方式二:一般用于取数值,用于对数组迭代
for((i=0;i<=10;i++)) do 每次循环要执行的命令 done
-
-
测试
- 循环依次从tom jack lily lucys中取值
-
-
#!/bin/bash
for name in tom jack lily lucys
do
echo $name
done
- 循环取1到5的每个数值
#!/bin/bash
for i in 1 2 3 4 5
do
echo $i
done
#!/bin/bash
for((i=1;i<=5;i++))
do
echo $i
done
#!/bin/bash
for i in {1..5}
do
echo $i
done
- 循环取出目录下每个文件的名称
#!/bin/bash
for i in `ls /export/data/shell/`
do
echo "当前文件的名称为:$i"
done
-
while循环
-
语法
while [ 条件 ] do 满足条件就执行的命令 done
-
举个栗子
#!/bin/bash i=1 while [ $i -lt 5 ] do echo $i i=$((i+1)) done
#!/bin/bash i=1 sum=0 while [ $i -le $1 ] do echo "当前的i = $i,当前的sum = $sum" let sum=sum+$i let i++ done echo $sum
-
-
死循环
for((;;)) do echo "hehe" done
while true do echo "hehe" done
while : do echo "hehe" done
-
break与continue
-
break:跳出整个循环体
#!/bin/bash while true do read -p "please input yes or no :" input if [ $input = "yes" ] then echo "yes" #跳出循环 break elif [ $input = "no" ] then echo "no" #跳出循环 break else echo "u need think again" fi done
-
continue:跳出本次循环
#!/bin/bash for((i=0;i<10;i++)) do #判断当前的值是否是5,如果是5,跳过本次继续下一次循环 if [ $i -ne 5 ] then echo $i else continue fi done
-
-
小结
-
Shell中如何实现循环?
-
for
-
方式一
for var in 取值范围 do done
-
方式二
for((i=0;i<10;i++)) do done
-
-
while
while [条件] do done
-
-
Shell中如何控制循环?
- 死循环
- for((;;))
- while true
- 跳出整个循环:break
- 跳出当前循环:continue
- 死循环
-
知识点17:Shell脚本:函数
-
目标:了解Shell脚本函数的基本使用
-
路径
- step1:函数的定义
- step2:函数的调用
- step3:参数的使用
-
实施
-
函数的定义
[function] funName(){ 你需要执行的命令 [return 值] }
-
函数的调用
- 先定义函数,然后通过函数名调用即可
-
测试
#!/bin/bash #先定义函数 fun_print(){ #输出打印 echo "这是一个函数" } #调用函数 fun_print
#!/bin/bash #先定义函数 fun_sum(){ #输入两个数字,求和 read -p "input a : " a read -p "input b : " b echo "a=$a b=$b" return $((a+b)) } #调用函数 fun_sum #打印返回值=打印函数调用的结果 echo "a+b=$?"
-
参数的使用
-
$n:第n个参数
-
运行脚本时,作为脚本的输入参数
./xxx.sh $1 $2
-
调用函数时,作为函数的输入参数
funName $1 $2
-
区别:作用域不一样
- 如果出现在函数中,只在函数中有效
-
-
测试
#!/bin/bash #传递脚本参数 c=$(($1+1)) d=$(($2+2)) #先定义函数 fun_sum(){ #输入两个数字,求和 a=$1 b=$2 echo "a=$a b=$b" return $((a+b)) } #调用函数,传递函数参数 fun_sum $c $d #打印返回值=打印函数调用的结果 echo "a+b=$?"
-
-
-
小结
-
如何定义?
[function] funName(){ 函数体 return }
-
如何调用?
- 直接函数名调用
-
如何传参?
- 如果有参数,参数直接放在后面
- 函数内部通过$N来引用参数
-
知识点18:Shell脚本:数组
-
目标:了解Shell中数组的使用
-
路径
- step1:数组的定义及取值
- step2:测试
-
实施
-
数组的定义及取值
-
定义
arr_name=(v1 v2 v3…… vN)
- 不需要指定长度或者类型
-
引用:通过下标引用数组中的数据,下标从0开始
${arr_name[index]}
-
-
测试
#!/bin/bash #定义一个数组 arr1=(1 2 A C "zhangsan") #赋值 arr1[0]=3 #打印数组的指定元素 echo "${arr1[0]}" echo "${arr1[4]}" echo "${arr1[5]}"
#定义一个数组 arr1=(1 2 A C "zhangsan") #打印数组的所有元素 #echo "${arr1[*]}" #echo "${arr1[@]}" #for:直接遍历数组 for i in ${arr1[*]} do echo "当前的元素:$i" done #获取数组的长度 arrlen=${#arr1[*]} for((i=0;i<$arrlen;i++)) do echo "当前的元素:${arr1[$i]}" done
-
-
小结
- 如何定义?
- 变量名=(元素1 元素2 元素3……)
- 如何取值?
- 变量名[下标]
- 如何定义?
知识点19:Shell脚本:select
-
目标:了解Shell中select语法的使用
-
路径
- step1:select的功能与语法
- step2:测试
-
实施
-
select的功能与语法
-
功能
-
Linux默认提供的死循环,使用时,必须给定break
-
选择:将整个集合的元素列举出来,让你选择
- 选择完成以后要break
-
-
语法
select var in 集合 do done
-
-
测试
-
echo "请选择你最喜欢的操作系统:"
select var in Windows Linux Unix MacOS
do
echo "你的选择是:$var"
break
done
echo "==============根据你的职业,预测你的未来=============="
PS3="请选择你的职业:"
select var in bigdata java python other
do
case $var in
"bigdata")
echo "你要好好珍惜现在的时光!"
;;
"java")
echo "你要好好保护你的头发!"
;;
"python")
echo "要做好进局子的准备!"
;;
*)
echo "你能长命百岁!"
;;
esac
break
done
-
PS3:专门用于搭配select使用的变量,用作提示
-
小结
-
select的功能?
- 死循环,用于做选项输入循环
-
select的使用?
-
类似于for的语法
select var in 选项 do done
-
-
知识点20:Shell脚本:运行方式及嵌套运行
-
目标:掌握Shell中脚本的运行方式及嵌套运行
- 脚本如何运行?
- 如何嵌套脚本?
-
路径
- step1:脚本的两种运行方式
- step2:脚本的嵌套运行
-
实施
-
脚本的两种运行方式
-
方式一:执行文件:一般用于脚本的开发
./fortest.sh /export/data/shell/fortest.sh
- 必须申明头部
- 必须有执行权限
-
方式二:通过命令来执行文件:一般用于脚本的强制运行或者测试
-
sh、bash
[root@node1 shell]# bash runtest.sh 请输入y或者n:yes 你的输入不正确 [root@node1 shell]# sh runtest.sh 请输入y或者n:y 你的输入是yes [root@node1 shell]# sh -x testShell02.sh ++ date -d '-1 day' +%Y-%m-%d + yesterday=2021-04-17 + echo 2021-04-17 2021-04-17 [root@node1 shell]# sh testShell02.sh 2021-04-17 [root@node1 shell]#
-
-
-
脚本的嵌套运行
-
嵌套方式
-
方式一
. 调用的脚本的路径和名称
-
方式二
source 调用的脚本的路径和名称
-
-
测试
-
创建第一个脚本
vim test01.sh #!/bin/bash arr2=(1 2 A B C)
-
添加可执行权限
chmod u+x test01.sh
-
创建第二个脚本
vim test02.sh #!/bin/bash #调用test01.sh #source /export/datas/shell/test01.sh . /export/datas/shell/test01.sh #对test01中的变量进行操 for var in ${arr2[*]} do echo $var done
-
赋予执行权限
chmod u+x test02.sh
-
-
-
-
小结
-
脚本如何运行?
- 方式一:执行文件
- 声明头部
- 执行权限
- 方式二:命令运行
- sh
- bash
- 方式一:执行文件
-
如何嵌套脚本?
-
方式一
. 运行的脚本
-
方式二
source 运行的脚本
-
-