目录
一、shell的基本语法
1.脚本:它是一个可以直接被执行/运行的文件;
2.shell脚本:利用shell语言编写的一个可执行文件;
3.shell终端界面窗口:提供shell技术/语言进行编辑脚本的窗口命令行—>右键选择—>【打开终端】---->不仅能执行命令,还能在里面编写shell脚本;
4.shell脚本的编写和执行可以借助vi编辑器,编写脚本,也可以借助bash解析运行脚本:/bin/bash
例:shell环境 = vi编辑器 + bash解析器
5.编写第一个shell脚本;
1>语法:vi 脚本文件名.sh
案例:新建一个脚本:file01.sh,输出"hello world!"
2>脚本文件第一行:
#!/bin/bash :通过#!来指定该脚本编写完成后,是由/bin/bash解析器进行解析执行操作;
3>shell脚本能够做的事情:
将许多命令连在一起,用户只需要执行该脚本一次,就可以把脚本中所有的命令全部被执行,后期还可以继续利用该脚本;
4>脚本的运行/执行方式:
方式一:
首先给脚本文件赋予可执行权限:chmod +x 文件名.sh
最后再执行:./脚本名字.sh
方式二:直接交给bash解析器:/bin/bash 脚本名字.sh
案例:创建一个脚本文件file02.sh,实现以下操作:
6.shell变量的使用
6.1>变量:指的是用来接受shell脚本在执行过程中会发生改变的数据;
6.2>声明(创建)变量
格式:变量名 = 值
例:
6.3>变量名的命名规则
1)首个字母必须是字母(Aa—Zz);
2)不能有空格,但是可以使用下划线’_'做连接,例:class_name=“testing2304”;
3)不能出现标点符号;
4)不能出现关键词(指的是在Linux系统中已经有特殊含义的词语,比如ls,cp,mv…);
6.4>调用变量:获取变量中储存的值
格式一:$变量名
格式二: 变量名注:大括号的作用是为了明确变量名,告诉 {变量名} 注:大括号的作用是为了明确变量名,告诉 变量名注:大括号的作用是为了明确变量名,告诉具体要调用的变量;
6.5>shell注释:
只起到解释说明的作用,不参加基本的执行,类似于备注
格式:#注释的内容
6.6>只读变量的设置:只允许读取变量中的值,不能进行修改;
格式:readonly 变量名
6.7>删除变量
格式:unset 变量名
备注:只读变量无法删除;
7.shell字符串的操作;
7.1>字符串:一般是由引号包裹起来的任意个字符;
7.2>字符串的拼接:把仁义的字符串数据,拼凑在一起;
格式:直接写在一起即可;
7.3>获取字符串的长度:统计字符串中字符的总个数;
格式:${#变量名}
#!/bin/bash
#声明两个变量
s01="test"
s02="testing_2304"
#分别输出s01和 s02的长度
echo "s01的字符串长度是:${#s01}" #4
echo "s02的字符串长度是:${#s02}" #12
7.4>字符串的截取操作;
格式:${变量名:开始位置的下标:截取字符的长度};
下标=位置-1 ;
例:从第三个位置开始截取,下标:2 ;
#!/bin/bash
#声明一个变量
s="this is testing2304'
#请大家从第四个位置开始截取,长度6个字符
echo"新的数据是:${s:3:6}"
#请大家截取第七个位置到第十三个位置上的字符
echo"结果是:${s:6:7}"
备注:在字符串中,如果有空格,标点符号,数字都算一个字符;
8.shell数组的使用
8.1>数组:等同于数学上的集合用来存储多个相同类型的数据
8.2>声明(创建)数组
格式:数组名=(值1 值2 值3 值4…)
备注:数组是不限制大小(数据个数);
数组使用()来声明
8.3>关于数组的操作:
1)获取数组中某个位置上的值:${数组[下标数]}
2)获取数组中所有的值:${数组名[@]}
8.4>获取数组的长度操作:
1)获取数组中所有值(存储值)的总个数:${#数组名[@]}
#!/bin/bash
#声明两个数组
s01=(87 90 256 892 34 12 65)
s02=("test" "test2304" "testing" "testing2304")
#分别统计s01和s02两个数组中值的总个数(长度)
echo ${#s01[@]} #7
echo ${#s02[@]} #4
2)获取数组中某个位置上的值的长度(值中字符的总个数):${#数组名[下标]}
#!/bin/bash
#声明一个数组
s02=("test" "test2304" "testing" "testing2304")
#统计s02数组中第三个位置上的值的长度
echo ${#s02[2]} #7
8.5>数组第二种创建方式:下标;
格式:数组名[下标]=值
#!/bin/bash
#创建一个数组 arr=(35 12 80 83 95)
arr[0]=35
arr[1]=12
arr[2]=80
arr[3]=83
arr[4]=95
#输出arr数组中的所有值
echo "arr数组中所有的值是:${arr[@]}"
#输出arr数组的长度(值的总个数)
echo "arr数组的长度是:${#arr[@]}"
9.shell其他的操作
9.1>’ read ’ 把终端中用户输入的内容,读取到,传递到脚本中的变量;
格式:read 变量名
#!/bin/bash
#声明一个变量 i=89 i=90
read i
read j
#输出
echo "读取到的数据是:$i"
echo "读取到的数据是:$j"
9.2>定向符’ > ’ 将操作的结果定向输入到指定的文件;
例:Linux命令 > 文件名 将Linux命令执行的结果报存到指定的文件(覆盖);
[root@bogon shello2]# touch 1.txt 2.txt
[rootabogon shello2]# echo"hello,world"> 1.txt
[root@bogon shello2]# ls al /etc > 2.txt
[root@bogon shell02]# echo"testing2304”> 2.txt
双重定向符’ >> ’ 将操作的结果定向输入到指定的文件;
例:Linux命令 >> 文件名 将Linux命令执行的结果报存到指定的文件(追加);
[root@bogon shello2]# echo"test2304">> 2.txt
9.3>echo `` 将Linux命令的执行将结果,看成是普通的字符串进行输出(了解);
[root@bogon ~]# cal
十月 2023
日 一 二 三 四 五 六
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
[root@bogon ~]# echo `cal`
十月 2023 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
二、shell运算符的使用
1.运算符:用来进行计算,判断,比较等等相关操作;
2.算术运算符
’ + ’ ’ - ’ ’ * ’ ’ / ’ 加减乘除
’ / ’ 除法 取商(不会做除尽的行为) 7/2=3
’ % ’ 除法 取余 7%2=1 6%2=0
备注:shell中如果想要进行计算的操作,需要借助于计算表达式 ( ( 计算公式 ) ) , ((计算公式)), ((计算公式)),(3+2))—>5
#!/bin/bash
#声明两个变量
X=7
y=2
#加法 7+2
echo $(( $x+$y))
#乘法
echo $((10*3))
#取商s=7/2=3
s=$(( $x/$y))
echo $s
#取余数yu=7%2=1
yu=$(( $x%$y))
echo $yu
’ = ’ 赋值符号:将等号右边的值,赋值给等号左边的变量。
判断两个数值是否相等:
’ == ’ 恒等,判相等,如果两个数字相等,会返回一个Ture(成立,真)的结果,否则会返回一 个false(不成立,假)的结果;
例:10==10判断结果: true 10==20 判断结果: false
’ != ’ 不等于,判不相等,如果两个数字不相等,会返回一个true的结果,否则返回一个false的结果
例: 10!=10 判断结果: false 10!=20 判断结果: true
3.判断条件语句/条件判断语句:if语句
格式一:if语句
思想:只关注条件成立后的操作;
if [ 判断条件 ]
then
语句块
fi
套路:如果条件成立,然后执行语句块
格式二:if…else语句
思想:不管条件成立与否,都有对应的操作;
if [ 判断条件 ]
then
语句块1(条件成立后要做的事情)
else
语句块2(条件不成立要做的事情)
fi
4.关系运算符
’ -eq ’ 判等于;
’ -ne ’ 判不等于;
’ -gt ’ 判大于右边;
’ -lt ’ 判小于右边;
’ -ge ’ 判大于等于右边;
’ -le ’ 判小于等于右边;
5.布尔运算符
主要连接多个判断表达式,操作结果只有true或false;
5.1>’ ! ’ 非运算; 思想:取反; !true=false !false=true
例:!90 -gt 75 ---> ! 90 > 75 --->true --->false
5.2>’ -a ’ 与运算符;思想:连接多个判断表达式,只要有一个判断表达式结果为false,整体与出来的结果就是false(只要有false,结果就是false)
例:78>60 -a 12<90 -a 80>=100--->true -a true -a false ---> false
5.3>’ -o ’ 或运算;思想:连接多个判断表达式,只要有一个判断表达式结果为true,整体或出来的结果就是true(只要有true,结果就是true)
#!/bin/bash
#定义一个变量
x=82
#非取反!82>=100! false ---> true
if[ ! $x -ge 100 ]
then
echo "A"
fi
#与 82>90-a82<=100false -a---> false true
if[ $x -gt 90 -a $x -le 100 ]
then
echo "B"
else
echo "C"
fi
#或82<200false -o true82==90---> true
if [ $x -eg 90 -o $x -lt 200 ]
then
echo "D"
else
echo "E"
fi
6.逻辑运算符:连接多个判断表达式,判断表达式需要用[[]]
6.1>’ && ’ 逻辑与;只要有false,结果就是false;
6.2>’ || ’ 逻辑或; 只要结果有true,结果就是true;
7.文件测试运算符
用来检测文件的各种属性;
7.1>’ -d ’ 判目录/文件夹;
’ -f ’ 判文件;
’ -r ’ 判可读;
’ -w ’ 判可写;
’ -x ’ 判可执行;
’ -s ’ 判文件内容是否为空,有内容返回true;
’ -e ’ 判文件是否存在;
8.字符串运算符
8.1>判断字符串是否相等:
’ = ’ 判相等;
’ != ’ 判不相等/不等于;
8.2>判断字符串长度是否为0:
’ -z ’ 为0返回true;
’ -n ’ 不为0返回true;
8.3>判断字符串是否为空:
[ $变量名 ] 判断该变量中有没有存在字符串,不为空返回true;
9.’ test ’ 用来修饰判断条件 —[]
格式一:if test 判断条件
then
语句块
fi
格式二:if test 判断条件
then
语句块1
else
语句块2
fi
三、shell语句的应用
1.if语句格式三:
思想:多条件的判定/判断操作;
if [ 判断条件一 ]
then
语句块1
elif [ 判断条件二 ]
then
语句块2
elif [ 判断条件三 ]
then
语句块3
elif [ 判断条件四 ]
then
语句块4
else
语句块n
fi
2.循环语句;
思想:只要循环判断条件成立,程序/语句就会一直做操作/执行;
2.1while语句
格式:
while((判断条件))
do
语句块(只要条件成立,就要一直被执行)
done
备注:当条件成立时,就要一直执行do和done之间的语句块;当条件不成立,循环语句就终止循环;
注意:1)在循环语句中,对于判断的运算符,使用的是:’ > ’ ’ < ’ ’ >= ’ ’ <= ’
2)let命令:让…操作:let “变量的计算操作”
’ ++ ’ 自增运算符 ’ +1 '; let " n++ "
’ – ’ 自减运算符 ’ -1 '; let " m-- "
2.2>for循环语句
格式:
for((定义循环变量;判断条件;变量的计算操作))
do
语句块(只要条件成立,就要一直被执行)
done
3.跳出循环的关键词
3.1>’ break ’ 强制终止循环:只要循环体(do-done)中遇到break,无条件强制终止;
3.2>’ continue ’ 跳转到循环开始的地方:
死循环:指的是判断条件永远成立,程序执行根本停不下来;
4.语句之间的结合使用
判断条件语句+循环条件;