一、Shell 入门
1.1 什么是shell?
Shell其实是一个命令解释器,作用是解释执行用户输入的命令以及程序等,用户每输入一条命令,Shell给予解释执行一条。这种键盘一输入命令,就可以立即得到回应的对话方式,称为交互模式。
Shell存在于操作系统的最外层,负责与用户直接对话。处理用户的输入,并将操作系统执行结果返回给用户。在用户登陆到操作系统之后的所有操作均由Shell解释执行。Shell在操作系统中所处的位置如下
1.2 什么是shell 脚本
简言之,如果shell命令通过写入到一个程序文件并执行的时候,此程序我们就称之为shell脚本。
但是在生产环境中的Shell脚本不仅仅是这么简单,而是将一些命令、变量以及流程控制语句有机结合并生成的功能完善的强大的应用程序。
举例说明:
- 清除/var/log下message日志文件简单脚本
cat /dev/null > /var/log/messages
- 生产环境中清除/var/log 下 message 的脚本
#!/bin/bash
# 清除日志脚本,版本 2
LOG_DIR=/var/log
# 脚本需要使用root用户权限来执行,因此,对当前用户进行判断,则不和要求的用户给出友好提示,并终止程序执行
ROOT_UID=0
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则成功
}
echo "Logs cleaned up fail."
exit 1 # 返回1则失败
1.3 什么时候使用shell脚本?
- Linux批量管理
- 自动化完成系统优化
- 自动化安装Linux操作系统(kickstart 和 cobbler)
- 测试工具和内容自动化
- 邮件自动发送
- 服务自动重启
- 代码上线
- 定时备份和定时启停服务
- Linux 系统监控、服务监控、端口监控、IP黑名单监控、流量监控等
- 服务的日志切割、存储备份、日志分析等等
1.4 如何学好 shell 脚本
基础变量、条件表达式、流程判断、if、for循环、while循环、case语句、循环控制
- 从简单的判断和循环开始写
- 阅读、模仿、尝试从零开始写
- 写注释,将任务分解成一个个小任务,类似于打游戏闯关
- 找一本合适的教材,或者自己认真记笔记
- 多练习-思考-练习-思考,循环往复
1.5 解释型语言和编译型语言
编译型语言
指用专用的编译器,针对特定的操作平台(操作系统)将某种高级语言源代码一次性翻译成可被硬件平台直接运行的二进制机器码,这个过程叫做编译。
编译好的可执行文件(.exe),可在相对应的平台运行(移植性差,但是效率高)。
如:C\C++.....
解释型语言
用专门解释器对源程序逐行解释成特定平台的机器码并立即执行的语言,相当于把编译型语言的编译执行过程混合在一起同时完成的。
编译型语言执行效率较低,切不能脱离解释器运行。但是跨平台比较容易,只需提供相应的解释器
如:shell\python
注:Java属于特殊的。既可以说成是解释型语言,又可以说成是编译型语言
1.6 shell脚本建立和执行
解释器类型
bash是centos中的默认解释器
脚本定义
脚本开头
#!/bin/bash
父shell和子shell
- 父shell中的环境变量,在子shell中可以看到
- 而子shell中的变量,在父shell中看不到
shell执行方式
sh & bash # 最常用的使用方式
cat *.sh | bash # 适用于执行多个脚本
sh < test.sh # 了解一下,输入重定向
/root/test.sh # 需要执行权限
. test.sh
source test.sh
1.5 shell开发习惯
- 脚本存放在固定目录
- 开头加脚本解释器信息
- 附带作者和版权信息
- 脚本中尽量不用中文
- 脚本扩展名用.sh
- 成对的符号一次性书写完成
- 注意缩进
- 养成写注释的良好习惯
二、变量基础
2.1 定义变量
值可变的亮,称之为变量
变量名=变量值,常说的变量,一般是变量名
变量的组成:字母数字下划线,但是不能以数字开头
2.2 环境变量和普通变量
环境变量 (全局变量)
可在创建他们的shell一级派生出来的任意子shell中使用
<font color=#FF0000 >环境变量包括内置的环境变量和自定义的环境变量</font>
环境变量的定义方式
declare -x 变量名=value
export 变量名=value # 常用
环境变量有四个文件,他们的执行属于如下图所示
- 登陆shell会加载所有的环境变量
- 非登陆shell可能会加载~/.bashrc或者/etc/bashrc(上图非绿色部分),然而有些定时任务以上两个根本不会加载,所以需要手动指定,建议在定义变量时定义到/etc/bashrc
- 可以在环境变量文件中定义普通变量
普通变量
普通变量只能在当前shell 中使用
普通变量的定义方式
# 适用于一般场景,不适用于带有空格等字符
变量名=value
# 所见即所得的定义方式
变量名='value'
# 解析双引号之内的变量
变量名='value'
2.3 临时变量和永久变量
如果按照变量的生存周期来划分的话,Linux变量可以分为两类:
- 永久变量:需要修改变量配置文件,使得变量永久生效
- 临时变量:使用
export
命令或者直接在当前 shell 中赋值的变量
2.4 shell 特殊变量
参数特殊变量
特殊变量 | 作用说明 |
---|---|
$0 | 获取当前执行shell脚本文件名,如果执行脚本带路径,则包括完整路径 |
$n | 获取当前执行shell脚本的第n个参数值,若n>9,则用大括号包裹,如${10} |
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
进程特殊变量
特殊变量 | 作用说明 |
---|---|
$? | 显示最后命令的退出状态。0表示没有错误,非0表明有错误。此变量最常用 |
$$ | 显示脚本运行的当前进程ID号,此变量不常用,了解即可 |
$! | 后台运行的最后一个进程的ID号,此变量不常用,了解即可 |
$_ | 之前运行脚本的最后一个参数,此变量最不常用,了解即可 |
2.5 shell 变量字串
表达式 | 作用说明 |
---|---|
${param} |
返回变量$param内容 |
${#param} |
返回变量$param内容的字符长度,也适合特殊变量,此表达式最常用 |
${param:offset} |
在变量$param中,从位置offset之后开始提取子串到结尾 |
${param:offset:length} |
在变量$param中,从位置offset之后开始提取长度为length的子串 |
${param#word} |
在变量$param开头删除最短匹配的word子串 |
${param##word} |
在变量$param开头删除最长匹配的word子串 |
${param%word} |
在变量$param结尾删除最短匹配的word子串 |
${param%%word} |
在变量$param结尾删除最长匹配的word子串 |
${param/pattern/string} |
将变量$param中符合pattern的第一个内容用string取代 |
${param//pattern/string} |
将变量$param中符合pattern的所有内容用string取代 |
2.6 变量数值计算
算数运算符
算术运算符 | 说明(*表示常用) |
---|---|
+、- | 加法(或正号)、减法(或负号)* |
*、/、% | 乘法、除法、取余(也称取模)* |
** | 幂运算* |
++、-- | 自增、自减,默认步长为1* |
!、&&、|| | 逻辑非(取反)、逻辑与(and)、逻辑或(or)* |
<、<=、>、>= | 比较符号(小于、小于等于、大于、大于等于)* |
==、!=、= | 比较符号(等于、不等于、对于字符串“=”也表示等于)* |
<<、>> | 向左移位、向右移位 |
~、|、&、^ | 按位取反、按位异或、按位与、按位或 |
=、+=、-=、*=、/=、%= | 等号为赋值运算符,例如a+=1相当于a=a+1* |
Shell的常见运算命令
运算命令 | 说明(*表示常用) |
---|---|
(()) | 用于整数运算命令,效率很高* |
let | 用于整数运算命令,类似于(())* |
expr | 命令行计数器,一般用于整数值,也可用于字符串。 |
$[] | 用于整数运算命令 |
declare | 定义变量值和属性,-i参数可定义整型变量,做运算 |
bc | Linux下的计算器程序(可用于整数以及小数运算) |
awk | 可用于整数以及小数运算 * |
2.7 变量传参
脚本变量传参的三种方式:
- 直接赋值
[one@shell ~]$ cat 1.sh
IP=127.0.0.1
echo $IP
[one@shell ~]$ sh 1.sh
127.0.0.1
- 传参方式
[one@shell ~]$ cat 1.sh
IP=$1
echo $IP
[one@shell ~]$ sh 1.sh 127.0.0.1
127.0.0.1
- read方式
[one@shell ~]$ cat 1.sh
read -p "请输入一个参数: " IP
echo $IP
[one@shell ~]$ sh 1.sh
请输入一个参数: 127.0.0.1
127.0.0.1