目录
一、Shell脚本概述
1.1基本概述
1.1.1 shell脚本的概念
- 将要执行的命令按顺序保存到一个文本文件
- 给该文件可执行权限
- 可结合各种Shell控制语句以完成更复杂的操作
1.1.2 shell脚本应用场景
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
- ……
1.2 shell的作用
Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
1.3 Linux中常见的shell
[root@zzz ~]# cat /etc/shells //查看当前系统支持的shell
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
- bash:基于gun的框架下发展的shell
- csh:类似c语言的shell
- tcsh:整合了csh提供了更多功能
- sh:已经被bash替换
- nologin:这个shell可以让用户无法登录
bash (/bin/bash)是目前大多数Linux 版本采用的默认shell
1.4 shell脚本的构成
- 脚本申明(解释器):第一行开头“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器还有其他类型的解释器,#!/bin/python #!/bin/expect
- 注释信息:以#开头的语句表示为注释信息
- 可执行语句:比如echo命令用于输出“ ”之间的字符串
1.5 脚本执行逻辑与执行方式
1.5.1脚本执行逻辑
- 顺序执行:程序按从上到下顺序执行
- 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
- 循环执行:程序执行过程中需要重复执行多次某段语句
1.5.2执行方式
1.指定路径去执行文件(需要有执行权限)
2.指定解释器去执行(不需要权限)
3.source
1.6脚本错误
- 语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的
- 命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察
- 逻辑错误:只能使用 bash -x 进行
二、重定向与管道符
2.1重定向
2.1.1交互式硬件设备
- 标准输入:从该设备接收用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行出错信息
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
2.1.2重定向操作
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定文件读取数据 |
重定向输出 | 1> | 将标准输出结果保存到指定的文件,并且覆盖原有文件 |
>> | 将标准输出追加到指定的文件的尾部,不覆盖原有内容 | |
标准错误输出 | 2> | 将错误信息保存到指定文件,并且覆盖原有文件 |
2>> | 将错误信息追加到指定文件的尾部,不覆盖原有内容 | |
混合输出 | &>和2>&1 | 将标准输出,标准错误保存到同—文件中 |
多行重定向
2.2管道符
管道符 “|”
将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用
三、变量
保存将来会变化的数据,即使数据变化,直接调用变量即可,各种 Shell 环境中都使用到了“变量”的概念。Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell 程序能够提供更加灵活的功能,适应性更强。
3.1常见shell变量类型
- 自定义变量:由用户自己定义,修改和使用
- 环境变量:由系统维护,用于设置工作环境
- 只读变量:只可以读取不可以更改
- 位置变量:通过命令行给脚本传递参数
- 预定义变量:Bash中内置的一类变量,不能修改
3.2命名要求
-
区分大小写
-
不能使程序中的保留字和内置变量:如:if, for,hostname
-
只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反
-
不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
-
大驼峰:StudentFirstName
-
小驼峰:studentFirstName
-
下划线::student_name
3.3自定义变量
定义新变量
引用变量
$变量名 或 ${变量名}
强引用和弱引用
- "$name " 弱引用,其中的变量引用会被替换为变量值
- '$name ’ 强引用,其中的变量引用不会被替换为变量值,而保持原字符串
$( ) 和 ` `引用命令执行的结果
追加变量值
变量名+=追加值
3.4 read -p
从键盘输入的内容变成变量
3.5 变量作用范围
- 默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再作用。
- 可以通过内部命令export将指定的变量到处为全局变量,使用户定义的变量在说有子shell环境中可以继续使用
格式:
- 格式1:export 变量名
- 格式2:export 变量名=变量值
永久设置变量
3.6 整数运算
格式: expr 变量1 运算符 变量2 [运算符 变量3]
运算符:加法 + ,减法 - ,乘法 \ * ,除法 / ,取余 (取模)%
expr只能进行整数的运算,并且变量和运算符需要空格相隔
let
i++ 和 ++i
预定义变量
符号 | 注释 |
---|---|
$* | 表示所有位置参数的内容看成一个整体返回 |
$@ | 表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 |
$? | 表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常 |
$# | 表示命令行中位置参数的个数 |
$0 | 表示当前执行的脚本或程序的名称 |