目录
一.Shell脚本概述
1.Shell脚本概念
- 将要执行的命令按顺序保存到一个文本文件
- 给该文件可执行权限
- 可结合各种Shell控制语句以完成更复杂的操作
2.Shell脚本应用场景
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
- ......
3.Shell的作用
3.1.命令解释器,“翻译官”
Shell(壳程序)是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释
器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执
行,并输出执行结果
- 介于系统内核与用户之间,负责解释命令行
3.2.用户的登录Shell
- 登录后默认使用的Shell程序,一般为/bin/bash
- 不同Shell的内部指令、运行环境等会有所区别
常见shell解释器
- /bin/sh:UNIX最初使用的 shell,已经被bash所替换
- /bin/bash:基准于GNU的框架下发展出的Shell,是 sh 的扩展
- /bin/csh:语法有点类似于c语言的Shell
- /bin/tcsh:整合了csh,提供更多的功能
- /bin/nologin:奇怪的shell,这个shell可以让用户无法登录主机
4.编程语言类型
编译型 :C C++ JAVA GO 代码文件需要先编译后,程序才能执行(强类型)
解释型 :SHELL PYTHON 代码是边解释边运行(弱类型)
5.编写Shell脚本
5.1.编写脚本代码
vim xxx.sh
- 使用vim文本编辑器
- 每行一条Linux命令,按执行顺序依次编写
5.2.Shell脚本构成
- 脚本申明(解释器):若第一行为“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行,#!/bin/bash为默认解释器。还有其它类型的解释器,比如#!/usr/bin/python、#!/usr/bin/expect
- 注释信息:以“#”开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行。
- 可执行语句:比如echo命令,用于输出" "之间的字符串
5.3.赋予可执行权限
- 使脚本具有可执行属性
chmod +x first.sh
5.4.运行脚本文件
①bash 或 sh 指定脚本文件运行,可无执行权限
- 绝对路径 或 相对路径 指定脚本文件运行,要求有执行权限
- 以上两种方式 都是在子shell环境中执行脚本
②source 或 . 指定脚本文件运行,可无执行权限
- 会在当前shell环境中执行脚本
6. 重定向与管道操作
6.1.交互式硬件设备
- 标准输入:从该设备接收用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行出错信息
类型 | 设备文件 | 文件描述编号 | 默认设备 |
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
6.2.重定向操作
类型 | 操作符 | 用途 |
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | > | 将输出结果保存到指定的文件(覆盖原有内容) |
>> | 将输出结果追加到指定的文件尾部(不覆盖原有内容) | |
重定向错误输出 | 2> | 将错误信息追加到指定的文件中(覆盖原有内容) |
2>> | 将错误信息追加到指定的文件中 (不覆盖原有内容) | |
混合输出 | &> | 将标准输出、标准错误的内容保存到同一个文件中 |
2>&1 | 将标准错误输出重定向到标准输出 |
7.管道操作符号“|”
- 将左侧的命令输出结果,作为右侧命令的处理对象
二.Shell脚本变量
1.Shell变量的作用、类型
1.1.变量的作用
用来存放系统和用户需要使用的特定参数(值)
- 变量名:使用固定的名称,由系统预设或用户定义
- 变量值:能够根据用户设置、系统环境的变化而变化
1.2.变量的类型
- 自定义变量:由用户自已定义、修改和使用
- 特殊变量:环境变量,只读变量,位置变量,预定义变量
2.自定义变量
2.1.定义一个新的变量
变量名以字母或下划线开头,区分大小写,建议全大写
变量名=变量值
提醒:=两遍没有空格
[root@localhost ~]# Product=Python
[root@localhost ~]# Version=1.1.12
[root@localhost ~]# echo $Product
Python
[root@localhost ~]# echo $Product $Version
Python 1.1.12
2.2.赋值时使用引号
- 双引号:允许通过$符号引用其他变量值
- 单引号:禁止引用其他变量值,$视为普通字符
- 反撇号:命令替换,提取命令执行后的输出结果,`…`和$(…)作用相同
2.3.从键盘输入内容为变量赋值
read [-p “提示信息”] 变量名
2.4.设置变量的作用范围
- 默认情况下自定义的变量只能在当前shell环境中有效
让自定义的变量在所有shell环境中有效的方法
①在 /etc/profile 文件中定义 export 变量名=变量值
- source /etc/profile 立即生效 或 重新登录系统自动生效
②在 /etc/bashrc 文件中定义 变量名=变量值
- 切换 shell 环境自动生效
2.5.整数变量的运算
expr 变量1 运算符 变量2 [运算符 变量3]…
浮点数运算
echo '4.5+2.1' | bc
awk 'BEGIN{print 4.5+2.1}'
常用运算符
- 加法运算:num1 + num2
- 减法运算:num1 - num2
- 乘法运算:num1 * num2
- 除法运算:num1 / num2
- 求模(取余)运算:num1 % num2
3.特殊的Shell变量
3.1.环境变量
- 由系统提前创建,用来设置用户的工作环境
- 配置文件:/etc/profile、~/.bash_profile
常见的环境变量
- PATH:指定可执行程序的搜索路径
- HOME:指定当前用户的家目录
- SHELL:指定当前Shell的路径
- PWD:指定当前工作目录
- USER:指定当前用户的用户名
3.2.只读变量
- 用于变量值不允许被修改的情况
[root@localhost ~]# name=xxxx
[root@localhost ~]# readonly name
[root@localhost ~]# echo $name
xxxx
[root@localhost ~]# name=yum
bash: name: 只读变量
[root@localhost ~]# unset name
bash: unset: name: 无法反设定: 只读 variable
3.3.位置变量
- 表示为$n,n为1~9之间的数字
./test.sh one two three four .... ten
$0 $1 $2 $3 $4 ${10}
3.4.预定义变量
$0 | 代表脚本本身 |
$# | 代表脚本后面跟的位置参数的数量 |
$? | 代表的是上一条Linux命令执行的返回状态码(0~255),0表示上一条命令执行正确,非0值则表示上一条命令执行异常 |
$* | 默认代表脚本后面跟的所有参数,加上双引号后 "$*" 会把所有参数看做一个整体 |
$@ | 默认代表脚本后面跟的所有参数,加上双引号后 "$@" 还是会把每个参数看做独立个体 |
date +"%Y%m%d" 当天日期
date -d "1 day" +"%Y%m%d" 昨天日期
date +"%Y%m01" 当月第一天
date -d "1 month" +"%Y%m01" 下个月第一天
date -d "$(date -d "1 month" +"%Y%m01") -1 day" +"%Y%m%d" 当月最后一天