shell编程
第一章
1.1 什么是shell?
Shell其实是一个命令解释器,作用是解释执行用户输入的命令以及程序等,用户每输入一条命令,Shell给予解释执行一条。这种键盘一输入命令,就可以立即得到回应的对话方式,称为交互模式。
Shell存在于操作系统的最外层,负责与用户直接对话。处理用户的输入,并将操作系统执行结果返回给用户。在用户登陆到操作系统之后的所有操作均由Shell解释执行。Shell在操作系统中所处的位置如下
image.png
1.2 什么是shell脚本?
简言之,如果shell命令通过写入到一个程序文件并执行的时候,此程序我们就称之为shell脚本。但是在生产环境中的Shell脚本不仅仅是这么简单,而是将一些命令、变量以及流程控制语句有机结合并生成的功能完善的强大的应用程序。举例说明:清除/var/log下message日志文件简单脚本
cat /dev/null > /var/log/messages
reboot
生产环境中清除/var/log下message的脚本
!/bin/bash
清除日志脚本,版本 2
LOG_DIR=/var/log
脚本需要使用root用户权限来执行,因此,对当前用户进行判断,则不和要求的用户给出友好提示,并终止程序执行
ROOT_UID=0
if [ "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则成功
}
echo "Logs cleaned up fail."
exit 1 # 返回1则失败
1.3 什么时候使用shell脚本?
Linux批量管理
自动化完成系统优化
自动化安装Linux操作系统(kickstart和cobbler)
测试工具和内容自动化
邮件自动发送
服务自动重启
代码上线
定时备份和定时启停服务
Linux系统监控、服务监控、端口监控、IP黑名单监控、流量监控(脚本+zabbix)
服务的日志切割、存储备份、日志分析等等
1.4 如何学好shell脚本?
基础变量、条件表达式、流程判断、if、for循环、while循环、case语句、循环控制
从简单的判断和循环开始写
阅读、模仿、尝试从零开始写
写注释,将任务分解成一个个小任务,类似于打游戏闯关
找一本合适的教材,或者自己认真记笔记
多练习-思考-练习-思考,循环往复
1.5 解释型语言和编译型语言
1.5.1 编译型语言:
指用专用的编译器,针对特定的操作平台(操作系统)将某种高级语言源代码一次性翻译成可被硬件平台直接运行的二进制机器码,这个过程叫做编译。
编译好的可执行文件(.exe),可在相对应的平台运行(移植性差,但是效率高)。
C\C++.....
1.5.2 解释型语言:
用专门解释器对源程序逐行解释成特定平台的机器码并立即执行的语言,相当于把编译型语言的编译执行过程混合在一起同时完成的。
编译型语言执行效率较低,切不能脱离解释器运行。但是跨平台比较容易,只需提供相应的解释器
shell\python
注:Java属于特殊的。既可以说成是解释型语言,又可以说成是编译型语言
shell是命令解释器
shell脚本是由命令组合成的一个可执行的文件
编译型语言和解释型语言
1.6 shell脚本建立和执行
1.6.1 解释器类型
bash是centos中的默认解释器
sh
1.6.2 脚本定义
脚本开头
!/bin/bash
1.6.3 父shell和子shell
脚本嵌套
父shell中的环境变量,在子shell中可以看到
而子shell中的变量,在父shell中看不到
1.6.4 shell执行方式
sh & bash,最常用的使用方式
cat *.sh | bash,适用于执行多个脚本
sh < oldboy.sh,了解一下,输入重定向
/root/oldboy.sh,需要执行权限
. oldboy.sh
source oldboy.sh
1.6.5 shell开发习惯
>脚本存放在固定目录
开头加脚本解释器信息
附带作者和版权信息
脚本中尽量不用中文
脚本扩展名用.sh
成对的符号一次性书写完成
注意缩进
养成写注释的良好习惯
总结:
脚本放在指定目录
创建脚本,后缀是.sh
在第一行顶格添加命令解释器的声明#!/bin/bash
添加作者时间和版权信息
养成良好习惯,添加注释
Centos7默认解释器是/bin/bash
退出当前shell的命令是:exit
第二章 变量基础
2.1 定义变量
值可变的量,称为变量
变量名=变量值,常说的变量,一般是变量名
字母数字下划线,不能是数字开头
2.2 环境变量和普通变量
2.2.1 环境变量(全局变量)
可在创建他们的shell以及派生出来的任意子shell中使用
环境变量包括内置的环境变量和自定义的环境变量,且通常为大写。
环境变量的定义方式:
declare -x 变量名=value
export 变量名=value
环境变量有四个文件,他们的执行顺序如下图所示:
image.png
登陆shell会加载所有的环境变量
非登陆shell可能会加载~/.bashrc或者/etc/bashrc(上图非绿色部分),然而有些定时任务以上两个根本不会加载,所以需要手动指定,建议在定义变量时定义到/etc/bashrc
可以在环境变量文件中定义普通变量
2.2.2 普通变量
>普通变量只有在当前shell下才能使用
定义方式
适用于一般场景,不适用于带有空格等字符
变量名=value
所见即所得的定义方式
变量名=’value’
解析双引号之内的变量
变量名=”value”
注意点:(举例说明)
- 变量如果后面有内容,一定要把变量括{}起来
- 希望变量内容原样输出则加单引号
- 希望获取变量中的命令执行结果用``或者$()
1、定义环境变量的方式:
export 变量名=变量值
2、定义普通变量的方式:
变量名=变量值
3、定义变量的三种方式
适用于一般场景,不适用于带有空格等字符
[export] 变量名=value
所见即所得的定义方式
[export] 变量名=’value’
解析双引号之内的变量
[export] 变量名=”value”
4、环境变量文件的加载顺序
/etc/profile ===> ~/.bash_profile ===> ~/.bashrc ===> /etc/bashrc
5、非登录式(ssh)的shell只加载后两个
2.3 临时变量和永久变量(了解)
如果按照变量的生存周期来划分的话,Linux变量可以分为两类:
永久变量:需要修改变量配置文件,使得变量永久生效
临时变量,使用export命令或者直接在当前shell中赋值的变量
用source执行脚本和用bash执行的区别是什么
答案:用source执行的脚本,变量会在父shell下生效,用. 也是
用bash执行的脚本,变量不会在父shell下生效
如何自定义环境变量
定义变量内容,不加引号、单引号、双引号、反引号结果有什么不同?该怎么用
反引号:强制命令解析
在shell编程中,如果要访问变量值,可以变量前加一个__FRUTT=apple B)显示变量的值:fruit=apple C)显示变量的值:echo $FRUTT
2.4 shell特殊变量
2.4.1 参数特殊变量
image.png
2.4.2 进程特殊变量
image.png
2.5 shell变量子串
image.png