Shell脚本自动化部署实战(一)

说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!

目录

一丶shell介绍

二丶shell脚本规范

三丶shell语法

1.变量的使用

2.参数传递

3.重定向

4.程序结构

5.总结


一丶shell介绍

在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它类似于DOS下的command.com和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序

基本上shell分两大类:

1.图形界面shell(Graphical User Interface shell 即 GUI shell)

例如:应用最为广泛的 Windows Explorer (微软的windows系列操作系统),还有也包括广为人知的 Linux shell,其中linux shell 包括 X window manager (BlackBox和FluxBox),以及功能更强大的CDE、GNOME、KDE、 XFCE。

2.命令行式shell(Command Line Interface shell ,即CLI shell)

例如:

bash / sh / ksh / csh(Unix/linux 系统)

(MS-DOS系统)

cmd.exe/ 命令提示字符(Windows NT 系统)

Windows PowerShell(支持 .NET Framework 技术的 Windows NT 系统)

传统意义上的shell指的是命令行式的shell,以后如果不特别注明,shell是指命令行式的shell。

文字操作系统与外部最主要的接口就叫做shell。shell是操作系统最外面的一层。shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。

shell提供了你与操作系统之间通讯的方式。这种通讯可以以交互方式(从键盘输入,并且可以立即得到响应),或者以shell script(非交互)方式执行。shell script是放在文件中的一串shell和操作系统命令,它们可以被重复使用。本质上,shell script是命令行命令简单的组合到一个文件里面。

Shell基本上是一个命令解释器,类似于DOS下的command。它接收用户命令(如ls等),然后调用相应的应用程序。较为通用的shell有标准的Bourne shell (sh)和C shell (csh)。

交互式shell和非交互式shell

交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell也终止了。

shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了

shell是一段应用程序,是用户和操作系统交互的一个桥梁,shell通常就是shell脚本

shell弱类型语言,在定义变量不需要指定变量的类型

二丶shell脚本规范

1.shell脚本是以.sh结尾的文件

2..sh文件的第一行内容为#!/bin/bash---->表示使用shell进行编程

3.shell中的注释:#

三丶shell语法

1.变量的使用

1.变量名=变量值

Shell脚本自动化部署实战(一)_第1张图片

  • 等于号两边没有空格

Shell脚本自动化部署实战(一)_第2张图片

  • 输出变量

Shell脚本自动化部署实战(一)_第3张图片

2.变量命名规范

  • 不能以数字开头,由字母、数字、下划线组成

Shell脚本自动化部署实战(一)_第4张图片

3.变量的释放

  • unset 变量名

Shell脚本自动化部署实战(一)_第5张图片

4.特殊的变量,带有空格的变量定义

  • 变量值用双引号""括起来

Shell脚本自动化部署实战(一)_第6张图片

  • 变量值用单引号''括起来

Shell脚本自动化部署实战(一)_第7张图片

  • 双引号和单引号的区别
  • 双引号:如果变量值中存在$变量名的话,那么输出结果将会是变量名对应的变量值
  • 单引号:如果变量值中存在$变量名,那么将原样输出

Shell脚本自动化部署实战(一)_第8张图片

  • 双引号:如果想原样输出内容,可以在$变量名前面加转义字符\

Shell脚本自动化部署实战(一)_第9张图片

  • 反单引号``,存放的是命令

Shell脚本自动化部署实战(一)_第10张图片

5.练习

练习1使用shell脚本,输出当前所在的目录

  • 首先博主先在桌面上创建一个data的文件夹,在文件夹中再创建2个文件夹分别是1和2,把本博客所有shell脚本文件全部在1这个目录下进行编写

Shell脚本自动化部署实战(一)_第11张图片

  • 使用vi命令创建script_01.sh文件,在文件中进行如下编写(不会vim的就只能自己去补充一下命令了,博主都会)

Shell脚本自动化部署实战(一)_第12张图片

  • 执行script_01.sh脚本时,提示权限不足,那么要么更改文件权限要么切换到root用户再执行,如果两个都不想的话,就可以通过sh命令来执行

Shell脚本自动化部署实战(一)_第13张图片

  • 修改脚本权限增加x执行权限

Shell脚本自动化部署实战(一)_第14张图片

练习2:计算/etc目录下有多少个文件,用shell脚本实现

  • shell脚本命令中有一个wc -l的命令是获取文件的数目,所以编写脚本时需要使用管道|将ls -l查询到的文件通过wc -l命令进行统计

Shell脚本自动化部署实战(一)_第15张图片

  • 执行脚本,成功输出etc下的文件数目

Shell脚本自动化部署实战(一)_第16张图片

练习3:实现统计任何指定目录下的文件个数

  • 需要执行目录而实现统计该该目录下的文件个数,那么则需要使用read命令(等待输入,有点类似python中的input),如下所示输入read a回车后,则出现以下等待输入

Shell脚本自动化部署实战(一)_第17张图片

  • read除了可以执行输入一个变量还可以指定多个变量,变量之间用空格隔开

Shell脚本自动化部署实战(一)_第18张图片

  • 同样的释放变量时,unset也可以指定一次性释放多个变量

Shell脚本自动化部署实战(一)_第19张图片

  • 当使用read命令输入变量值时,变量值多于变量名,那么就会将多出的变量值一起赋给最后一个变量

Shell脚本自动化部署实战(一)_第20张图片

  • 复制script_02.sh脚本,命名为script_03.sh,进行如下修改,需要注意的是表示变量时需要在前面加$

Shell脚本自动化部署实战(一)_第21张图片

  • 运行脚本,输入目录统计文件数量成功

Shell脚本自动化部署实战(一)_第22张图片

  • 通过上面的read命令获取用户输入,但是并不友好,因为没有提示用户输入什么,所以可以添加提示信息:read -p "提示的内容" 变量名

Shell脚本自动化部署实战(一)_第23张图片

  • 再次执行脚本,就显得很友好,用户体验不错

Shell脚本自动化部署实战(一)_第24张图片

2.参数传递

1.向.sh文件中传递数据

  • 复制一份script_03.sh命令为script_04.sh,要实现sh script_04.sh /etc将要统计的目录以这种方式进行传递(命令 文件名 参数)

Shell脚本自动化部署实战(一)_第25张图片

  • 执行sh script_04.sh /etc命令传递要统计的目录/etc,成功统计数目

Shell脚本自动化部署实战(一)_第26张图片

2.格式

文件中接收参数的方式

$1:表示第一个参数

$2:表示第二个参数

$3:第三个参数

$n:表示第n个参数

$0:代表文件名

$@:显示全部参数

$#:显示参数的个数

示例1:

  • 使用$1来接收传递的第一个参数

Shell脚本自动化部署实战(一)_第27张图片

  • 运行脚本,打印出传递的第一个参数

Shell脚本自动化部署实战(一)_第28张图片

示例2:

  • 使用$2来接收传递的第二个参数

Shell脚本自动化部署实战(一)_第29张图片

  • 当传递一个参数时,那么这个参数会给$1,传递两个参数时,则第二个参数会给$2

Shell脚本自动化部署实战(一)_第30张图片

  • 根据以上两种示例可以得出$几表示接收第几个传递的参数,现在在脚本中使用$4则表示的只接收第四个参数

Shell脚本自动化部署实战(一)_第31张图片

  • 运行脚本,根据传递的第几个参数,对应$几

Shell脚本自动化部署实战(一)_第32张图片

示例3:

  • 使用$0来打印出文件名

Shell脚本自动化部署实战(一)_第33张图片

  • 运行脚本成功打印出当前脚本文件的名字

Shell脚本自动化部署实战(一)_第34张图片

示例4:

  • 使用$@显示命令传递的全部参数

Shell脚本自动化部署实战(一)_第35张图片

  • 运行脚本,显示出所有的传递的参数

Shell脚本自动化部署实战(一)_第36张图片

示例5:

  • 使用$#显示传递参数的个数

Shell脚本自动化部署实战(一)_第37张图片

  • 运行脚本,成功显示出传递参数的个数

Shell脚本自动化部署实战(一)_第38张图片

3.重定向

把命令的内容输出到文件中

1.正确的命令(数字1表示)

  • 覆盖(将当前目录下的查询到的文件重定向到a.txt中)

Shell脚本自动化部署实战(一)_第39张图片

  • 查询tmp目录下的文件并重定向到a.txt中,结果发现之前a.txt文件中内容被覆盖了

Shell脚本自动化部署实战(一)_第40张图片

  • 追加(对重定向文件中的内容进行保留,也就是在存在内容的情况下进行内容的追加,使用>>)

Shell脚本自动化部署实战(一)_第41张图片

2.错误的命令(数字2表示)

  • 覆盖(如在输入命令时,输入错误的命令那么就需要使用2来重定向到文件中)

Shell脚本自动化部署实战(一)_第42张图片

  • 追加

Shell脚本自动化部署实战(一)_第43张图片

4.程序结构

1.分支结构

if...elif...else分支

a)格式

if [ 条件 ]
then
 语句
else
 语句
fi

if [ 条件 ];then
语句
else
语句
fi

b)注意

1.条件两边要有空格

2.多个条件间要有空格

3.if后面要有空格

4.条件中如果存在变量,那么变量的两边要有双引号,如:name="cdtaogang"---->echo $name,  N="cdtaogang"

示例1:

  • 判断 /root目录是否为空(字符串的比较:==判断是否相等,!=判断是否不相等)

Shell脚本自动化部署实战(一)_第44张图片

  • 执行脚本后,输出结果

Shell脚本自动化部署实战(一)_第45张图片

  • 将then和if判断语句写在一行也是可以的,但是必须加;

Shell脚本自动化部署实战(一)_第46张图片

  • 运行脚本成功

Shell脚本自动化部署实战(一)_第47张图片

示例2:

  • 通过用户输入任意目录判断是否为空

Shell脚本自动化部署实战(一)_第48张图片

  • 运行脚本,输入目标目录,成输出结果

Shell脚本自动化部署实战(一)_第49张图片

示例3:逻辑运算符

  • 判断用户输入的用户名和密码是否为admin 123456,如果是则提示登录成功,否则提示失败(且:-a,或者: -o,非: !)

Shell脚本自动化部署实战(一)_第50张图片

  • 运行脚本进行测试

Shell脚本自动化部署实战(一)_第51张图片

示例4:数字间比较--->比较运算符

知识点:-eq:判断是否相等,-ne:判断是否不相等,-gt:判断是否大于,-ge:判断是否大于等于,-lt:判断是否小于,-le:判断是否小于等于

数字变量操作:((i++))  ((i+=1))  i=$[$i+1]  let i=i+1  i=$(($i+1))

  • 输入数字,判断是否大于0,如果大于0则将该数字-1并输出,否则+1输出

Shell脚本自动化部署实战(一)_第52张图片

  • 运行脚本进行测试

Shell脚本自动化部署实战(一)_第53张图片

示例5:

知识点:测试文件的状态test 参数 变量名

参数:-e表示文件是否存在,-f表示文件是否存在且为文件,-d表示文件名是否存在且为目录,-r 可读,-w 可写,-x 可执行

  • 判断用户输入的目录是否存在,如果存在则统计目录下的文件个数,否则提示用户该目录不存在

Shell脚本自动化部署实战(一)_第54张图片

  • 运行脚本进行测试

Shell脚本自动化部署实战(一)_第55张图片

if...elif...else分支

a)格式

if [ 条件 ]
then
 语句
elif [ 条件 ]
then
  语句
elif [ 条件 ]
then
  语句
....
else
  语句
fi

示例1:

  • 判断学生的成绩,范围在90-100提示优秀,80-90之间提示良好,70-80之间则提示一般,60-70之间提示及格。其他则提示不及格

Shell脚本自动化部署实战(一)_第56张图片

  • 运行脚本进行测试

Shell脚本自动化部署实战(一)_第57张图片

示例2:文件判断

涉及知识点:-r filename 文件是否存在且可读,-w filename 文件是否存在且可写, -x filename文件是否存在且可执行,-f filename 文件是否存在且是普通文件,-d filename 文件是否存在且是一个目录,-e filename   文件是否存在,-n str1  字符串长度是否不等于0,-z str2   字符串长度是否等于0

  • 判断用户输入的内容是否为空,为空则提示,不为空则判断是否为目录,不为目录则判断是否为文件,否则提示错误信息

Shell脚本自动化部署实战(一)_第58张图片

  • 运行脚本进行测试

Shell脚本自动化部署实战(一)_第59张图片

case分支

a)格式

case $变量名 in
"值")
  语句;;
"值")
  语句;;
"值")
  语句;;
.....
*)
  语句;;
esac

b)注意

1.case这一行最后必须为in

2. ;;---->结束语句

3.*---->默认

4.esac--->case语句的结束

5.值可以是字符串也可以是数字

6.“值”还可以是区间范围,范围[0-9]

示例1:

  • 输入一个字母,判断该用户选择哪款产品,A:笔记本 B:电饭煲 C:小台灯

Shell脚本自动化部署实战(一)_第60张图片

  • 运行脚本进行测试

Shell脚本自动化部署实战(一)_第61张图片

示例2:

  • 请输入对客服的满意度,【0-3】不满意,【4-6】满意,【7-9】非常满意

Shell脚本自动化部署实战(一)_第62张图片

  • 运行脚本进行测试

Shell脚本自动化部署实战(一)_第63张图片

2.循环结构

a)for循环

b)格式

for 变量名 in 列表
do
  语句
done

示例1:

  • 输出1-10之间的数

Shell脚本自动化部署实战(一)_第64张图片

  • 运行脚本进行测试

Shell脚本自动化部署实战(一)_第65张图片

示例2:改进版

  • seq start size max(start:开始点,size:间隔,max:结束点,注意:如果size的值为1,则可以省略)

Shell脚本自动化部署实战(一)_第66张图片

  • 运行脚本进行测试

Shell脚本自动化部署实战(一)_第67张图片

示例3:

  • 输出1到10之间的奇数,只需要将步长间隔改为2即可

Shell脚本自动化部署实战(一)_第68张图片

  • 运行脚本进行测试

Shell脚本自动化部署实战(一)_第69张图片

5.总结

Shell脚本自动化部署实战(一)_第70张图片

你可能感兴趣的:(环境搭建)