1.Shell 是什么?

是一个命令解释器,它为用户提供一个向Linux内核发起请求以便于运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。【以bash为例】

shell脚本中执行docker load_Shell

2.Shell 脚本是如何执行的?

(1)脚本要以 #!/bin/bash开头

shell脚本中执行docker load_变量名_02

(2)可以通过sh + 脚本执行shell脚本

shell脚本中执行docker load_运维_03

(3)也可以为要执行脚本的用户添加权限,输入脚本的路径即可

shell脚本中执行docker load_变量名_04




3.Shell 的变量是如何使用的呢?

  • Linux Shell中的变量分为** 系统变量和用户自定义变量 **两种【通过set指令可以查看系统变量】
  • 通过# 注释内容指令完成单行注释
  • 通过:<<! 注释内容 !指令完成多行注释【两次的语句要另起一行】

(1)Shell 变量的命名规则:

变量名可以由字母、数字、下划线组成,但是不能以数字开头

(2)使用规范:

变量名采用大写字母,等号两侧不能留有空格

(3)变量的几个基本操作

通过变量名=变量值指令定义变量【静态变量要添加 readonly关键字】

shell脚本中执行docker load_变量名_05

echo 后的引号添不添加都可以,运行脚本输出结果如下

shell脚本中执行docker load_bash_06

通过unset 变量名指令撤销变量【静态变量不能被撤销】

shell脚本中执行docker load_变量名_07

撤销后变量就无法使用了,运行脚本输出结果如下

shell脚本中执行docker load_bash_08

通过反引号**``shell脚本中执行docker load_变量名_09**符号


4.如何避免在不同shell文件中重复设置相同的变量?

  • 可以通过设置环境变量【全局变量】所有shell脚本都可以使用
  • 设置环境变量的流程:

(1)编辑/etc/profile文件,添加环境变量【使用了export关键字】

shell脚本中执行docker load_运维_10

(2)通过source /etc/profile刷新配置信息

(3)在终端利用echo直接输出TOMCAT_HOME

shell脚本中执行docker load_运维_11

利用之前创建的var.sh文件调用并输出这个环境变量

shell脚本中执行docker load_运维_12


shell脚本中执行docker load_bash_13


5.如何给Shell脚本传递参数呢?

  • 通过位置参数变量可以完成参数的传递
  • 在脚本中利用$n代表传入的第n个参数,执行脚本时在末尾添加多个参数【用空格隔开,传递的参数可以小于脚本中应用的参数个数】

参数的语法

基本含义

$n

$1-9代表第一个到第九个参数,十个以上要写成 ${n}的形式

$*

代表全部参数,把所有参数看成一个整体

$@

代表全部参数,把所有参数区分对待

$#

代表命令行中参数的个数

shell脚本中执行docker load_Shell_14

执行脚本并传入参数,运行结果如下:

shell脚本中执行docker load_Shell_15


6.Shell中有哪些预定义变量呢?【不常用】

(1)$$返回当前进程号

(2)$!返回后台运行的最后一个进程号

(3)$?返回最后一次执行的命令的运行状态【0代表正常运行,其他代表运行出现了异常】


7.Shell中如何进行算数运算?

(1)有三种运算表达式

exper 表达式一次只能进行一次运算【比如既有加法也有乘法,那么要用两次来计算】

$((表达式))表达式为任意数学表达式【支持Shell的】

$[表达式]这个属于上式的简化版本【推荐】

(2)运算符

符号

含义

+

加法

-

减法

*

乘法(如果采用expr表达式要添加反斜杠\*

/

除法

%

取余


shell脚本中执行docker load_bash_16

运算结果如下:

shell脚本中执行docker load_变量名_17



注意:【如果采用expr表达式】

获取表达式结果要在两侧添加反引号**``**

表达式之间以及与expr之间都有留有一个空格


8.基本条件判断的语句格式?

if [ 条件 ]
then 
满足条件的处理;
fi

(1)条件两侧留有一个空格

(2)如果条件处不是一个条件表达式,那么就为true

(3)字符串比较:=

(4)两个整数比较:

符号

含义

-lt

小于

-gt

大于

-eq

等于

-ne

不等于

-le

小于等于

-ge

大于等于

(5)文件权限比较:

符号

含义

-r

有读权限

-w

有写权限

-x

有执行权限

(6)文件类型比较:

符号

含义

-f

文件存在并且是一个常规文件

-e

文件存在

-d

文件存在并且是一个目录

-b

文件存在并且是一个块设备文件

-c

文件存在并且是一个字符设备文

-p

文件存在并且是一个管道文件

-s

文件存在并且是一个套接字文件

之所以没有-l是因为我测试发现

shell脚本中执行docker load_变量名_18



(7)案例分析

shell脚本中执行docker load_Shell_19

运行结果如下:

shell脚本中执行docker load_Shell_20


9.单分支与多分支条件判断语句【注意条件左右的空格】

(1)单分支的代码格式:

if [ 条件判断式 ]
then
代码
fi

(2)多分支的代码格式:

if [ 条件判断式 ]
then
代码
elif [ 条件判断式 ]
then
代码
fi

(3)案例分析:输入考试成绩,大于60输出及格,否则输出不及格

#!/bin/bash
if [ $1 -ge 60]
then
  echo "及格";
elif [ $1 -lt 60]
then 
  echo "不及格";
fi;

shell脚本中执行docker load_运维_21


10.选择分支【case语句】

(1)基本语法

case $变量名 in
"值1" )
代码
;;
"值2" )
代码
;;
* )
default部分的代码
;;
esac

(3)案例分析:参数为1输出1,参数为2输出2,其他情况输出0

#!/bin/bash
case $1 in
"1" )
echo 1;
;;
"2" )
echo 2;
;;
* )
echo 0;
;;
esac;

shell脚本中执行docker load_linux_22


11.Shell的循环结构

(1)for循环的基本语法

# 语法一
for 变量 in 值1 值2 ...
do
程序
done
# 语法二
for(( 初始值;循环控制条件;变量变化))
do
程序
done

(2)通过参数传入结合语法一我们可以看出$*$@的区别

#!/bin/bash
for i in "$*"
do
echo num = $i;
done
for j in "$@"
do
echo num = $j;
done

输出结果如下:

shell脚本中执行docker load_运维_23

有几个需要注意的点:【通过测试案例得知】

  • 如果不为$*添加引号,那么输出的结果也是三个,因为尽管$*是一个参数整体,但是$i每次从中只取一个子参数
  • 循环代码段执行几次,取决于 in 后面参数的个数

(3)通过范围循环,我们完成1到100的和【注意:此处的判断符号使用的是数学符号】

#!/bin/bash
SUM=0;
for((i=1;i<=100;i++))
do
SUM=$[SUM+$i];
done
echo sum = $SUM;

shell脚本中执行docker load_变量名_24

(3)while循环语法格式【while与中括号、条件两侧 都有一个空格】

while [ 条件 ]
do
代码
done

注意此处的条件采用了条件判断语句的符号,而不是直接使用数学符号

利用while循环实现1-100加和

#!/bin/bash
SUM=0;
i=0;
while [ $i -le 100]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo sum = $SUM

shell脚本中执行docker load_bash_25


12.用户如何动态的输入数据呢?

(1)语法格式:read 选项 参数【参数要与前面的内容有一个空格】

通过-p选项可以给出提示信息【自己预先设置的】

通过-t选项可以设置等待输入时长(s)【超时则跳过当前输入】

(2)案例分析:从键盘输入一个数NUM,不能超过5s

#!/bin/bash
read -t 5 -p "请输入一个数" NUM;
echo "你输入的数为$NUM";

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p14nfnDe-1663549400089)(attachment:a24240ff493bd90f3141efd78c08f6c5)]


13.Shell中的函数有哪些?

  • Shell中函数分为两类:系统函数自定义函数

(1)系统函数【常用的有两个】

通过base 路径指令获取文件名;通过dirname 路径指令获取文件的路径【不包括文件名】

(2)自定义函数【基本语法如下】

# 函数的定义
function 函数名(参数列表){
    代码
}
# 函数的定义要写在调用前面
# 函数的调用
函数名 参数列表;

实现一个两个数加法函数:

shell脚本中执行docker load_linux_26


运行结果如下:

shell脚本中执行docker load_变量名_27


14.综合案例分析:

shell脚本中执行docker load_bash_28


数据库备份步骤:

shell脚本中执行docker load_linux_29


编写Shell脚本【因为我没有安装Mysql所以此处为参考代码】

shell脚本中执行docker load_变量名_30


创建定时任务

crontab -e
30 2 `* * *` /user/sbin/mysql_db_backup.sh