跟老男孩学Linux运维:Shell编程实战2.2 什么是Shell脚本
2.2 什么是Shell脚本
理解了Shell之后,再理解Shell脚本就简单了。当命令或程序语句不在命令行下执行,而是通过一个程序文件来执行时,该程序就被称为Shell脚本。如果在Shell脚本里内置了很多条命令、语句及循环控制,然后将这些命令一次性执行完毕,这种通过文件执行脚本的方式称为非交互的方式。Shell脚本类似于DOS系统下的批处理程序(早期扩展名一般为“*.bat”)。用户可以在Shell脚本中敲入一系列的命令及命令语句组合。这些命令、变量和流程控制语句等有机地结合起来,就形成了一个功能强大的Shell脚本。
下面是在Windows下利用bat批处理程序开发的备份企业网站及数据库数据的脚本范例。
范例2-1:在Windows下利用bat批处理程序备份网站及数据库数据的脚本。
@echo off
set date=%date:~0,4%-%date:~5,2%-%date:~8,2% #<==定义时间变量。
mysqldump -uroot -poldboy -A -B > D:\bak\"%date%".sql #<==备份数据库数据。
rar.exe a -k -r -s -m1 D:\bak\"%date%".sql.rar D:\bak\"%date%".sql
#<==打包备份出来的数据库数据。
del D:\bak\*.sql #<==删除未打包的无用数据库数据。
rar.exe a -k -r -s -m1 D:\bak\"%date%"htdocs.rar D:\work\PHPnow\htdocs
#<==打包站点目录下的数据。
范例2-2:清除/var/log下messages日志文件的简单命令脚本。
把所有命令放在一个文件里,堆积起来后就形成了脚本,下面就是一个由最简单的命令堆积而成的Shell脚本。需要注意的是,必须使用root身份来运行这个脚本。
# 清除日志脚本, 版本 1。
cd /var/log
cat /dev/null>messages
echo "Logs cleaned up."
提示: /var/log/messages是Linux系统的日志文件,很重要。
范例2-2所示的脚本其实是有一些问题的,具体如下:
1)如果不是root用户,则无法执行脚本清理日志,并且会提示系统的权限报错信息。
2)没有任何流程控制语句,简单地说就是只进行顺序操作,没有成功判断和逻辑严密性。
范例2-3:写一个包含命令、变量和流程控制的语句来清除/var/log下messages日志文件的Shell脚本。
# !/bin/bash
# 清除日志脚本, 版本 2
LOG_DIR=/var/log
ROOT_UID=0 #<==$UID为0的用户,即root用户
# 脚本需要使用root用户权限来运行,因此,对当前用户进行判断,对不合要求的用户给出友好提示,并终止程序运行。
if [ "$UID" -ne "$ROOT_UID" ] #<==如果当前用户不是root,则不允许执行脚本。
then
echo "Must be root to run this script." #<==给出提示后退出。
exit 1 #<==退出脚本。
fi
# 如果切换到指定目录不成功,则给出提示,并终止程序运行。
cd $LOG_DIR || {
echo "Cannot change to necessary directory."
exit 1
}
# 经过上述两个判断后,此处的用户权限和路径应该就是对的了,只有清空成功,才打印成功提示。
cat /dev/null>messages && {
echo "Logs cleaned up."
exit 0 # 退出之前返回0表示成功,返回1表示失败。
}
echo "Logs cleaned up fail."
exit 1
初学者如果想要快速掌握Shell脚本的编写方法,最有效的思路就是采用电子游戏中过关的方式,比如,对于范例2-3的脚本可以设计成如下几关:
第一关,必须是root才能执行脚本,否则给出友好提示并终止脚本运行。
第二关,成功切换目录(cd /var/log),否则给出友好提示并终止脚本运行。
第三关,清理日志(cat /dev/null > messages),若清理成功,则给出正确提示。
第四关,通关或失败,分别给出相应的提示(echo输出)。
相关文章
- 新增功能 – 适用于在云中提取和分发视频的 AWS Elemental MediaConnect。
- re:Invent 2018 大会 AWS 发布、预览和预告 – 周一晚间直播
- 11 月 28 日,星期二:re:Invent 大会今日举行开源会议
- 新 – Amazon DynamoDB 事务
- 新增功能 – 使用 AWS Transit Gateway 简化网络架构
- 新增功能 – 用于提升可用性和性能的 AWS Global Accelerator
- Firecracker – 无服务器计算的轻量级虚拟化
- Amazon Comprehend Medical —— 针对医疗保健客户的自然语言处理
- 联网速度为 100 Gbps 的新 C5n 实例
- java bean入门
- 新 – AWS Marketplace 推出 Private Marketplace,让软件采购管理变得更轻松
- 新增功能 – AWS Transfer for SFTP – 适用于 Amazon S3 的完全托管式 SFTP 服务
- 11 月 27 日,星期二:re:Invent 大会今日举行开源会议
- 新增功能 – AWS DataSync – 数据传输自动化和加速
- 宣布推出 Firecracker 开源技术:适用于无服务器计算的安全、快速的 microVM
- AWS RoboMaker – 开发、测试、部署和管理智能机器人应用程序
- 开源机器人操作系统 (ROS) 与 AWS RoboMaker
- 欢迎来到 AWS re:Invent 2018
- 2018 年 re:Invent 大会上的 AWS 预览和预发布 – Midnight Madness
- AWS 参加 2018 年北美 KubeCon + CloudNativeCon