一、Shell脚本概述
-
Shell脚本的概念
将要执行的命令按顺序保存到一个文本文件
给该文件可执行权限
可结合各种Shell控制语句以完成更复杂的操作
-
Shell脚本应用场景
重复性操作
交互性任务
批量事务处理
服务运行状态监控
定时任务执行
二、Shell的作用
- 命令解释器,“翻译官”
介于系统内核与用户之间,负责解释命令行
- 用户的登录Shell
登录后默认使用的Shell程序,一般为/bin/bash
不同Shell的内部指令、运行环境等会有所区别
cat /etc/shells
sh | UNIX最初使用的 shell,已经被bash所替换 |
bash | 基准于GNU的框架下发展出的Shell,是 sh 的扩展 |
csh | 语法有点类似于c语言的Shell |
tcsh | 整合了csh,提供更多的功能 |
nologin | 奇怪的shell,这个shell可以让用户无法登录主机 |
- 小知识
系统某些服务运行过程中,会去检查用户能够使用的Shell,而这些shell的查询就是借由/etc/shells这个文件
当用户登录的时候,系统就会给我一个shell让我来用,而这个登录取得的Shell就记录在/etc/passwd这个文件内
三、编写Shell脚本
- 编写脚本代码
使用vim文本编辑器
每一行一条Linux命令,按执行顺序依次编写
- 赋予可执行权限
使脚本具有可执行权限
四、重定向与管道操作
-
交互式硬件设备
标准输入:从该设备接受用户输入的数据
标准输出:通过该设备向用户输出数据
标准错误:通过该设备报告执行出错信息
类型 | 设备文件 | 文件描述编号 | 默认设备 |
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
-
重定向操作
操作符 | 用途 | |
< | 从指定的文件读取数据 | |
> | 将标准输出结果 保存 到指定的文件,并且覆盖原有内容 | |
>> | 将标准输出结果 追加 到指定的文件的尾部,不覆盖原有内容 | |
2> | 将错误信息 保存 到指定的文件,并且覆盖原有内容 | |
2>> | 将错误信息 追加 到指定的文件的尾部,不覆盖原有内容 | |
&> >& | 将标准输出、标准错误保存到同一文件中 | |
&>> | 将标准错误输出重定向到标准输出 |
五、Shell变量的作用、类型
-
变量的作用
用来存放系统和用户需要使用的特定参数(值)
变量名:使用固定的名称,由系统预设或用户定义
变量值:能根据用户设置、系统环境的变化而变化
-
变量的类型
自定义变量:由用户自己定义、修改和使用
特殊变量:环境变量、只读变量、位置变量、
六、自定义变量
- 定义一个新的变量
变量名以字母或下划线开头,区分大小写,建议全大写
变量名=变量值
- 查看变量的值
echo $变量名
- 赋值时使用引号
双引号:允许通过$符号引用其他变量值
单引号:禁止引用其他变量值,$视为普通字符
反撇号:命令替换,提取命令执行后的输出结果
- 设置变量的作用范围
export 变量名 ...
export 变量名=变量值 ...
- 整数变量的运算
expr 变量1 运算符 变量2...
- 常用运算符
加法运算:+
减法运算:-
乘法运算:\*
除法运算:/
求模(取余)运算:%
-
整数运算
echo $(expr 整数1 运算符 整数2) $(expr $变量1 运算符 $变量2) + - \* / %
echo $[整数1 运算符 整数2] $[变量1 运算符 变量2] + - * / %
echo $((整数1 运算符 整数2)) $((变量1 运算符 变量2)) + - * / %
let a=10+5
let a++ 相当于 a=$[a+1]
let a-- 相当于 a=$[a-1]
let a+=2 相当于 a=$[a+2]
-
浮点数运算
echo '4.5+2.1' | bc
awk 'BEGIN{print 4.5+2.1}'
七、特殊的Shell变量
-
环境变量
由系统提前创建,用来设置用户的工作环境
配置文件:/etc/profile、~/.bash_profile
- 常见的环境变量
PWD、PATH
USER、SHELL、HOME
-
只读变量
用于变量值不允许被改变的
readonly 变量名=变量值 #只读变量不允许被修改变量值和删除变量
-
位置变量
表示为$n,n为1~9之间的数字
-
预定义变量
$*、$@:表示命令或脚本要处理的参数。
"$*":把所有参数看成以空格分隔的一个字符串整体(单字符串)返回,代表"$1 $2 $3 $4"。
"$@":把各个参数加上双引号分隔成n份的参数列表,每个参数作为一个字符串返回,代表"$1" "$2" "$3" "$4"。
$0:表示当前执行的脚本或命令的名称。
$#:表示命令或脚本要处理的参数的个数。
$?:表示前一条命令或脚本执行后的返回状态码,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。也常被用于Shell脚本中return退出函数并返回的退出值。