1、 shell概述
-
脚本:也是属于文本文件/文本文档,除了读和写之外,还可以直接被执行/运行,一句话总结:一个可以直接被执行(运行)的文件/文档,被称为“脚本”
-
shell脚本:利用shell技术编写出来的一个可执行(运行)的文档
-
shell终端:是一个应用程序,提供了一个界面,用户可以在界面中实现对Linux系统的一系列操作,也被称为“shell终端界面”,“shell终端窗口”
-
shell脚本的编辑和运行环境
- 文本编辑器:vi/vim命令,实现对shell脚本的编写
- 脚本解析器:解析并执行所写的shell脚本,bash解析器:/bin/bash
备注:不同的Linux操作系统版本,都嵌入的有shell环境,我们只需要保证系统能够正常运行,就可以直接进行shell脚本的编辑和解析执行。
- shell/shell脚本到底能做什么?
将许多命令放在一起,用户只需要执行该脚本文件一次,就会把脚本中所有的命令全部执行一遍。
-
编写第一个脚本文件
-
编写:vi/vim 脚本文件的名字.sh
例:编写脚本shellfile.sh,实现输出“这是我的第一个脚本文件”
脚本的第一行,固定格式的写法:#!/bin/bash 通过**#!**指定该脚本编写完成后,是交给/bin/bash解析器进行解析和执行的操作。
-
运行脚本:
-
方式一:
给脚本赋予可执行权限:chmod +x 脚本文件名字.sh
执行/运行脚本:./脚本文件名字.sh
方式二:重点掌握
直接交给bash解析器:/bin/bash 脚本文件名字.sh
练习:
a.创建一个脚本shell01.sh,输出两句话:“Hello,World!” ,“千锋软件测试” ,运行方式采用方式一
b.创建一个脚本shell02.sh,实现以下操作: 运行方式采用方式二在home目录下创建两个文件:file1.txt file2.txt
复制file2.txt,到mnt目录下
删除系统中大家自己建立的任意一个文件夹
显示当前系统日期时间
创建两个目录 dir01 dir02
移动dir02到home目录
输出"脚本执行完毕"
-
shell变量的应用
-
变量:指的是在程序运行过程中允许发生改变的量,称为”变量“
-
变量的作用:用来接收程序在运行(执行)时,会发生改变的数据
-
变量的声明(创建)
格式:变量名=值/变量值
注意:变量名的命名规则:
名字首个字符必须是大小写字母(Aa-Zz)
名字中不能有空格,可以有下划线_
名字中不能有标点符号
名字不能是关键字/关键词
备注:关键字/关键词:指的是在当前操作中,已经有特殊含义的词语,例如cp,mv…,变量名和等号之间不能有空格
-
shell注释:注释的内容不会参与执行,只是起到了解释说明的作用(备注)
格式:#注释的内容
-
==调用==变量:获取到变量中存储的值
格式一:==$==变量名
格式二:$ {变量名} {}的作用:明确告诉$调用的是哪一个变量
-
-
变量的其他操作
- 变量调用的差异化
如果$ 后面调用的变量名和其他的字符串是直接拼在一起,那么大家要把变量名加上{},明确告诉$要调用的具体变量。
- 只读变量:变量数据只能读取,不能修改和删除
格式:readonly 变量名
- 删除变量
格式:unset 变量名
-
shell 中字符串的操作
-
字符串:一般是由双引号或单引号包裹的任意个字符
例:name=“张三” class_name=“testing2303”
-
字符串拼接:把多个字符串数据拼凑在一起
格式:直接写一起
例:echo “我的名字是:$name” ——>echo “我的名字是:张三”
echo $name $class_name ——>张三testing2303
-
获取字符串长度:统计字符串中字符的总个数
例:x=“testing” x变量存储的字符串长度是7
格式:${#变量名}
注意:在字符串中,符号和空格也算作一个字符的
-
字符串截取的操作:把字符串数据的其中一部分给截取出来
格式:${变量名:开始位置的下标:截取的字符长度/字符总个数}
下标=位置-1 例:第五个位置开始截取,下标:4;从下标为11的位置开始截取,位置:12
-
-
shell中数组的使用
-
数组:等同于数学中的集合,用来存储多个相同类型的数据集合
例:数学:集合:一般用来存储多个数据,{23,53,56,54,80}
-
声明数组
数组名=(值1 值2 值3 值4…)
-
获取数组中的数据
①获取数组中所有的数据:${数组名[@]}
②获取数组中指定位置上的值:${数组名[下标]}
下标=位置-1
-
获取数组的长度
①获取数组中数据的总个数:${#数组名[@]}
②获取数组中指定位置上数据的长度:${#数组名[下标]}
备注:相当于指定数据包含的字符总个数
-
声明数组格式二(了解)
数组名[下标]=值
-
其他操作
①read:读取终端用户的输入,传递给脚本中它所修饰的变量
格式:read 变量名
②定向符的使用
单个定向符 > 将操作的结果,定向保存至文件(覆盖)
双重定向符 >> 将操作的结果,定向保存至文件(追加)
③echo
Linux命令
(反引号``) 把Linux命令执行的结果,当做一个“字符串”数据,交给echo做输出 了解即可
-
2、shell运算符的应用
-
运算符:主要帮助使用者进行一系列的计算,判断,检测等相关操作
-
算数运算符
- +:加法
- -:减法
- *:乘法
- /:除法,取商
- %:取余,取余数
- =:赋值,把等号右边的值,赋值给等号左边的变量 x=23
借助于计算表达式:$((计算公式))
-
==:恒等,判断两个数字是否相等,相等返回true(成立,真),不相等返回false(不成立,假)
例:56==56 true
-
!=:不相等,判断两个数字是否相等,不相等返回true,相等返回false
例:23!=45 true 89!=89 false
-
if语句:判断条件语句、条件判断语句
思想:根据【判断条件】的结果,来执行不同的语句块
格式一:思想:只关注条件成立后的操作
if [ 判断条件 ]
then
语句块
fi
格式二:思想:不管条件成立与否,都有对应的操作
if [ 判断条件 ]
then
语句块1(条件成立后要做的事情)
else
语句块2(条件不成立后要做的事情)
fi
备注:如果条件成立,就执行then后面的语句块;条件不成立,就执行else后面的语句块
-
shell技术的基本操作
-
字符串拼接:多个字符串拼凑写在一起即可
-
字符串长度:统计字符的总个数 ${#变量名}
-
字符串截取:下标=位置-1 ${变量名:开始的下标:截取字符长度}
-
数组:存放多个相同类型数据的集合
数组名=(值1 值2 值3…)
获取数组所有的值:${数组名[@]}
获取指定位置的值:${数组名[下标]}
获取数组的长度:数组中元素值的总个数:${#数组名[@]}
获取指定位置上数据的长度:${#数组名[下标]}
-
read命令:读取终端中输入的数据,传递给脚本中的变量
-
定向符:操作的结果,定向保存至文件 “>”覆盖,“>>”追加
-
-
运算符
-
算数运算符:计算,一定会借助于计算表达式 $((计算公式)) /除法:取商 %取余:取余数 ==恒等 判相等 !=判不相等
-
if语句:判断条件语句:做判定操作
-
格式一:思想,只关注条件成立后的操作
if [ 判断条件 ]
then
语句块
fi
-
格式二:思想,不管条件成立与否,都有对应的操作
if [ 判断条件 ]
then 语句块1
else 语句块2
fi
-
-
- 关系运算符:实现判断的操作
-eq 等同于 == 判相等
-ne 等同于 != 判不相等
-gt 大于
-lt 小于 例:34 -lt 50 ——>34<50 true
-ge 大于等于(大于或等于)
-le 小于等于(小于或等于)
备注:脚本中的语句,都是按照【顺序】来执行的
-
布尔运算符:主要帮助连接多个判断表达式
-
布尔运算符的操作结果只有两个:true和false
! 非运算,思想:取反
-a 与运算,思想:连接多个判断表达式,如果有一个判断表达式的结果为false,整体与出来的结果就是false(只要有false,结果就是false)
-o 或运算,思想:连接多个判断表达式,如果有一个判断表达式结果为true,整体或出来的结果就是true(只要有true,结果就是true)
-
-
逻辑运算符:需要用两个中括号包裹[ [ ] ]
- && 逻辑与 只要有false,结果就是false
- || 逻辑或 只要有true,结果就是true
-
字符串运算符:实现对字符串的运算操作
-
判断字符串是否相等:
= 判相等 例:“test”=“test”—>true
!= 判不相等 例:“testing”!=“test”——>false
判断字符串长度是否为0:
-z 为0的时候返回true 例:name=“”,name变量的长度为0
-n 不为0的时候返回true
-
[$变量名] 判断字符串是否为空,不为空返回true—–>变量中存的是有字符串数据
-
-
文件测试运算符:用于检测文件的各种属性
- -d(dir)判定是否为目录
- -f 判定是否为文件
- -r 判定是否可读
- -w 判定是否可写
- -x 判定是否可执行
- -e 判定文件或目录是否存在,存在返回true
- -s 检测文件不为空返回true
-
test:用于进行检测,修饰判断条件 <——> [ ]
-
if语句格式一:
if test 判断条件
then 语句块
fi
-
if语句格式二:
if test 判断条件
then 语句块1
else 语句块2
fi
-
3、shell语句结构的使用
- if语句:判断条件语句:格式三:思想:多条件的判定操作
if [ 判断条件1 ]
then 语句块1
elif [ 判断条件2 ]
then 语句块2
elif [ 判断条件3 ]
then 语句块3
…
else 语句块n
fi
- 语句结构之间是可以互相嵌套使用,嵌套语句的执行,从外到内,层层递进式的执行操作
- 运算符
算数运算符 + - / * % == != ——>$(())
关系运算符 -eq -ne -gt -lt -ge -le
布尔运算符 true false !取反 -a与运算(只要有false,结果就是false) -o或运算(只要有true,结果就是true)
逻辑运算符 [[]] 逻辑与&& 逻辑或||
字符串运算符 = != 检测字符串长度是否为0:-z为0返回true -n不为0返回true 检测字符串不为空:[ $变量名 ]
文件测试运算符: -d -f -r -w -x -e(是否存在) -s(是否为空)
- 语句结构
判断条件语句格式三:思想:多条件判断
if test 判断条件1
then 语句块1
elif test 判断条件2
then 语句块2
else 语句块n
fi
- 循环语句
循环:反复、来回、一直、持续…进行某些操作
思想:只要判断条件成立,就会一直执行语句块,当判断条件不成立,循环就会终止
- while循环语句
格式:
while((判断条件))
do
循环体(条件成立后,一直要做的事情)
done
解析:循环语句分析的参考点:
循环语句的四要素:
①循环变量:用来接收循环过程中会发生改变的数据
②循环条件:又被称为判断条件,用来决定循环的执行过程(是否执行循环操作)
③循环体:写的是条件成立后,要一直/循环执行的语句块
④循环变量的计算:用来进行变量的计算的操作过程(通过计算的方式,改变循环变量中的数据)
例:通过循环语句,实现,分别输出1-5之间的数字
let命令:可以让表达式或变量进行计算的操作
自增运算符:++——> +1
自减运算符:- - ——> -1
let “变量名++”:每一次执行时,都会让变量进行自动加1操作
let “变量名- -”:每一次执行时,都会让变量进行自动减1操作
修饰判断条件的符号:
if语句:[ ] test
while,for语句:(()) 支持数学运算符:> < >= <= != ==
例:输出1-100之间的偶数(循环语句+判断条件语句)
练习:a.使用while语句输出1-10之间的数字
b.输出1-100之间能够被3整除的数字
-
for循环语句
for((定义循环变量;循环条件;循环变量的计算操作))
do
循环体
done
例:使用for语句输出1-10之间的数字
统计1-100之间能够被3整除的数字的总个数
练习:利用for语句
a.输出1-5的数字
b.输出1-100之间的偶数
c.输出1-100之间能够同时被3和5整除的数字
- 终止循环的操作命令:
break:在循环体中,只要遇到break,无条件强制终止
continue:在循环体中,只要遇到continue,会跳转到循环开始的地方(跳转到循环条件的位置,进行新一轮的判定;continue后面写的语句块是不会执行的)
死循环:指的是循环条件永远成立,程序执行根本停不下来
while :,冒号的作用就是代表的是true的结果
- 循环语句:思想:只要条件成立,循环体一直会被执行
while,for
四要素:循环变量,循环条件,循环体,循环变量的计算操作
break 无条件强制终止
continue 后面的语句块是不会被执行的,跳转到循环开始的地方(循环条件)