一、shell scripts 的作用:
- 自动化管理的重要依据。可以自动化管理主机,对主机进行分析和处理。
- 追踪与管理系统的重要工作。在CentOS 7 系统中还是有很多的个别服务在管理他们的服务启动方面,还是使用 shell script 的机制。
- 简单入侵侦测功能。比如,我们可以通过 shell script 去分析“当该封包尝试几次还 是连线失败之后,就予以抵挡住该 IP”之类的举动。
- 连续指令单一化。简单来说,如果不考虑 program 的部分,那么 scripts 也可以想成“仅是帮我们把一大串的指令汇整在一个文件里面, 而直接执行该文件就可 以执行那一串又臭又长的指令段!
- 简单的数据处理。可以用 shell script 直 接处理数据数据的比对啊, 文字数据的处理啊等等的,撰写方便,速度又快(因为在 Linux 性能较佳)。
- 跨平台支持与学习历程较短。几乎所有的 Unix Like 上面都可以跑 shell script ,连 MS Windows 系列也有相关的 script 仿 真器可以用, 此外, shell script 的语法是相当友好的。
二、script的撰写和执行。
- script撰写中的注意事项:
- 指令的执行是从上而下、从左而右的分析与执行;
- 指令、选项与参数间的多个空白都会被忽略掉;
- 空白行也将被忽略掉,并且 [tab] 按键所推开的空白同样视为空白键;
- 如果读取到一个 Enter 符号 (CR) ,就尝试开始执行该行 (或该串) 命令;
- 至于如果一行的内容太多,则可以使用“ [Enter] ”来延伸至下一行;
- “ # ”可做为注解!任何加在 # 后面的数据将全部被视为注解文字而被忽略!
- script执行的几种方式:
- 直接指令下达: shell.sh 文件必须要具备可读与可执行 (rx) 的权限,然后:
绝对路径:使用 /home/dmtsai/shell.sh 来下达指令;
相对路径:假设工作目录在 /home/dmtsai/ ,则使用 ./shell.sh 来执行
变量“PATH”功能:将 shell.sh 放在 PATH 指定的目录内,例如: ~/bin/
2.以 bash 程序来执行:通过“ bash shell.sh ”或“ sh shell.sh ”来执行。
1、script的入门,输出‘Hello World!'
代码:
[root@localhost bin]# cat hello.sh
#!/bin/bash
#Program:
# This program shows "Hello word!" in your screen.
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e 'Hello World! \a \n'
exit 0
解释:
- 第一行 #!/bin/bash 在宣告这个 script 使用的 shell 名称。
- 程序内容的说明:整个 script 当中,除了第一行的“ #! ”是用来宣告 shell 的之外,其他的 # 都是“注解”用途。
- 主要环境变量的宣告:建议务必要将一些重要的环境变量设置好。PATH 与 LANG (如果有使用到输出相关的信息时) 是当中最重要的! 如此一来,则可 让我们这支程序在进行时,可以直接下达一些外部指令,而不必写绝对路径。
- 主要程序部分: 就将主要的程序写好即可!在这个例子当中,就是 echo 那一行
- 执行成果告知 (定义回传值):在我们这个例子当中,使用 exit 0 ,这代表离开 script 并且回传一个 0 给系统, 所以我执行完这个 script 后,若接着下达 echo $? 则可得到 0 的值。
执行:
三、简单的 shell script 练习
1、对谈式脚本:变量内容由使用者决定
以 read 指令的 用途,撰写一个 script ,他可以让使用者输入:1. first name 与 2. last name, 最后并且在屏 幕上显示:“Your full name is: ”的内容:
- 脚本代码:
[root@localhost bin]# cat showname.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Please input your first name:" firstname
read -p "Please input your last name:" lastname
echo -e "\nYour full name is: ${firstname}${lastname}"
- 执行结果
2、 随日期变化:利用 date 进行文件的创建
假设我想要创建三个空的文件 (通过 touch),文件名最开头由使用者输入决定,假设使用者输入 filename 好了,那今天的日期是 2023/08/10 , 我想要以前天、昨天、今天的日期来创建这些文件,亦即 filename_20230808, filename_20230809, filename_20230810。
- 脚本
[root@localhost bin]# vim create_3_filename.sh
#!/bin/bash
#创建三个空文件
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:~/bin
export PATH
#让使用者输入文件名称,并取得 fileuser 这个变量。
echo -e "I will use 'touch' command to create 3 files."
read -p "Please input your filename:" fileuser
#避免使用者随意按Enter键,导致只有日期没文件名,设置一个默认文件名 'filename'。
filename=${fileuser:-"filename"}
#开始利用date指令来取得所需要的文件名了。
date1=$(date --date='2 days ago' +%Y%m%d)
date2=$(date --date='1 days ago' +%Y%m%d)
date3=$(date +%Y%m%d)
file1=${filename}${date1}
file2=${filename}${date2}
file3=${filename}${date3}
#将文件名创建。
touch "${file1}"
touch "${file2}"
touch "${file3}"
- 执行结果:
3、数值运算:简单的加减乘除
那我们来玩玩看,如果我们要 使用者输入两个变量, 然后将两个变量的内容相乘,最后输出相乘的结果。
- 脚本
[root@localhost bin]# cat multiplying.sh
#!/bin/bash
PATH=/usr/local/bin:/usr/local/sbin:/us