1.什么是shell脚本?
shell脚本(script)用我自己理解来表达的话就是:一个写入了多个shell命令然后通过搭配一些逻辑语法、判断式、循环以及正则表达式来实现运行一个文件完成多个我们想要完成的事情的可执行文件。
书上的完整概念则是:利用shell功能所写的一个程序(program)。整个程序使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里边,搭配正则表达式、管道命令与数据流重定向功能,以达到我们所想要处理的目的。
2.shell脚本的作用
(1)便于机器自动化管理
(2)跟踪与管理系统的重要操作
(3)简单入侵检测功能
通过脚本分析系统登录日志,来完成简单的入侵检测
(4)连续命令单一化
可以将多个命令做成一个脚本,来完成复杂的命令设置工作
(5)简易的数据处理
(6)跨平台支持与学习历程较短
3.执行脚本前需要了解的相关知识
(1)脚本内容运行的规则
① 从上到下,从左到右依次执行
② 命令执行中会忽略命令之间的空格
③ 空白行及【TAB键】输入的空白格也一并忽略
④ 读取到一个Enter符号(cr),就尝试开始执行该命令
⑤ 如果命令太长,可以使用转义符【\】+enter,移到下一行
⑥ 【#】号后边的内容为注释内容
(2)如何执行脚本?
使用命令直接执行的前提是该脚本程序具备可读、可执行的权限(rx),然后:
① 绝对/相对路径
可以通过输入一个脚本的绝对或相对路径来进行脚本的运行。
例如:/root/bin/ping.sh
或者在/root/bin文件夹下,直接输入ping.sh
② 通过置于PATH变量的文件夹下执行
将脚本文件放在PATH变量定义的文件夹下,例如~/bin下,然后同时脚本文件内要声明PATH变量的内容。
③ 通过bash命令执行
可以通过输入【sh+脚本名字】来直接执行命令
例如:sh ping.sh
4.脚本的内容
一个脚本一般建议包含如下图所示的几个模块内容:

(1)声明该程序脚本使用的shell名称
使用【#!】这个命令来定义一个shebang行,来向系统说明这个程序脚本使用的shell,并在使用时加载Bash的相关环境配置文件(~/.bashrc)。bash的定义为【#!/bin/bash】。
如果脚本一开始没有定义好这一行的话,很容易产生运行的错误。
(2)声明该程序脚本的相关信息
一个程序脚本的说明最好包含以下几个模块:
① 脚本功能说明
② 脚本的版本信息
③ 脚本的作者与联络方式
④ 脚本的版权声明方式
⑤ 脚本的History(历史版本)
⑥ 脚本内的特殊命令,使用【绝对路径】的方式来执行
⑦ 脚本运行需要的环境变量的预设置和声明
(3)主程序部分
(4)输出结果返回值部分
5.常用脚本功能的编写
(1)用户交互式读写变量内容(read 或 输入脚本参数)
在脚本中,如果我们想让用户来使用键盘来输入某个值,那么我们就可以使用【read】命令或者直接在运行脚本的命令的后边输入相应的参数。
例1:read -p “你想在屏幕上提示的内容” 你想存储内容的变量名字(read -p “input your name:” firtname)
例2:sh 脚本名 col1 col2 col3(col为参数的名字)
具体脚本参数变量的内容会在后续的内容里继续讲解。
(2)使用脚本建立随日期变化的文件
我们想要建议一个脚本,可以让用户自己输入想要的文件名,然后根据该文件名,创建三个带不同时间(两天前、一天前、现在)后缀的文件,例如:【filename_20210811】
首先这里我们要先知道【date】常用的参数
常用命令:
date:直接查看当前系统的时间

date -d(--date=) 'n days ago':可以输出n天前的时间格式

date +%Y%m%d:可以选择输出时间的格式

具体date的详细用法,可以参考:https://www.cnblogs.com/hunttown/p/5470527.html
那么我们的脚本内容可以为:


注意$(command)这个参数信息赋值变量的方法
(3)数值运算
脚本里可以使用两种方式进行变量的数值运算:
①$((计算式))---重要!
例如:total=$((${num1} * ${num2}))
total=$((10 * 10))
②使用declare定义变量类型后进行计算
例如:declare -i total=${num1} * ${num2}
③计算包含小数点的数据(使用bc命令)
例如:echo "12.5*23.46" |bc

6.不同脚本执行方式的差异
(1)bash直接执行
通过bash直接执行的脚本,其实系统是通过创建一个新的shell(子进程)来进行运行的,所以默认情况下,通过bash直接执行的脚本,脚本里边的变量是没有办法被父进程使用的,并且在脚本运行结束后,脚本中的变量也会一并被删除。
我们使用这个脚本来进行演示,可见脚本里包含了date1、date2、date3三个变量

我们运行脚本,发现这三个变量都能进行内容输出,但是我们在父进程中直接echo却发现这个变量内容为空值。

(2)source执行
source执行就代表着在父进程中直接执行,因此各项的操作都会在原本的bash里生效,所以变量的内容也会一并的继承。
我们再使用上边的脚本进行演示,会发现source执行脚本后,父进程的date1变量也有了相应的数据

我们可以用一张图来总结这两者的差异:

Comments NOTHING