目录
一、前言
1、程序编程风格
2、编程语言
3、编程的三种处理逻辑
二、shell脚本
1、shell脚本基础
1.1 什么是shell
1.1.1 shell的概念
1.1.2 linux中常见的shell类型及信息
1.1.3 shell脚本的功能
1.2 shell脚本及构成
1.3 shell脚本执行方式
1.4 脚本错误调试
1.4.1 命令错误
1.4.2 语法错误
1.4.3 逻辑错误
1.4.4 检测脚本错误
2、重定向与管道符
2.1 重定向
2.2 多行重定向
2.3 管道符
3、自定义变量
3.1 命名的要求
3.2 变量追加值
3.3 read -p
4、变量作用范围
5、整数的运算
5.1 expr命令
5.2 其他运算方法
5.3 随机数生成器变量
6、环境变量
6.1 环境变量的概念
6.2 环境变量的配置文件
7、只读变量
8、位置变量
9、预定义(状态)变量
三、编写简单的shell脚本
1、提取系统信息
2、 查看内存资源是否充足
面向过程编程语言是一种以过程为中心的编程范式
面向对象编程语言是一种以对象为中心的编程范式
接下来将详细介绍shell脚本语言
if
语句、switch
语句等for
循环和while
循环Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当 了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执 行的操作传递给内核执行,并输出执行结果。
常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符等方面会存在一些区别。
通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类
[root@localhost ~]#cat /etc/shells #查看Linux系统中的shell类型及信息
nologin:nologin
是一种特殊的shell,它用于禁止用户登录。当用户的登录shell设置为/usr/sbin/nologin
时,用户将无法通过登录界面或远程登录(如SSH)进行登录shell脚本就是将命令按顺序一一列出,最后自动执行
执行需要权限,也可以直接使用路径
脚本其实不复杂,通用脚本环境改变后依然可以使用的脚本
shell脚本内容的基本构成:
①声明解释器:脚本的第一行通常是#!/bin/sh或#!/bin/bash,用于指定脚本使用的解释器。这告诉操作系统要使用哪个Shell来执行脚本
②注释:可以在脚本中添加注释,以便其他人理解脚本的目的和功能。注释以#开头,可以单行或多行
③执行语句:脚本可以调用系统命令、外部程序或其他脚本来执行特定的任务。命令可以直接在脚本中使用,也可以存储在变量中后再执行
示例:
①打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 text.sh,扩展名为 sh(sh代表shell)
② 输入一些简单的代码,格式一般为下图所示:第一行必须声明指定的shell脚本解释器,下面正常输入执行语句即可
方式一:指定路径(相对路径或绝对路径)去执行文件(需要有执行权限)
方式二:指定shell解释器去执行(不需要权限)
方式三:source和 . 执行
三种方式对当前bash环境的影响:
①编辑脚本来测试几种执行方式对进程的影响
②使用bash解释器执行脚本,查看当前进程的变化
③使用source或 . 执行脚本,查看当前进程的变化
注:
使用前两种方式(指定路径和指定shell解释器)执行脚本实际上是开启bash子进程去执行,不影响当前bash环境。
而使用方式三:source和 . 执行脚本是使用当前的bash去运行,会影响当前的bash环境,不推荐使用
Shell脚本中某条命令执行失败导致整个脚本无法继续执行的情况。这种错误通常是由于执行的命令不存在、无法访问、或者命令的参数不正确等原因导致的
注:
当前命令出错无法执行,但不会影响接下来的命令继续执行
当Shell脚本中存在语法错误时,Shell解释器无法理解脚本的含义,会提示语法错误信息
当Shell脚本的逻辑不正确时,可能会导致脚本无法达到预期的结果。例如,脚本中的条件语句或循环可能会出现逻辑错误
bash -n 脚本名称 #检查语法错误、命令错误
bash -x 脚本名称 #检查逻辑错误、命令错误,实际上该命令是将脚本的所有语句执行一遍
set -e
是一种Shell脚本的选项,也称为"exit on error"模式。启用该选项后,当Shell脚本中任何一条命令执行失败时,整个脚本都会立即停止执行,即使后续命令可能不会导致错误。这种模式可以帮助及早发现错误,并防止错误导致更严重的问题
shell脚本内容前输入set -e即一旦出错立即停止
set -u
是一种Shell脚本的选项,也称为"uninitialized variables"模式。启用该选项后,如果Shell脚本中使用了未定义的变量,会立即停止执行并显示错误信息。这种模式可以帮助及早发现变量使用错误,并防止错误导致更严重的问题
shell脚本内容前输入set -u ,即内容中的变量不存在不让执行
重定向是一种Shell命令的操作,用于将命令的输入输出从标准位置(通常是终端或控制台)转移到其他位置。在Shell脚本中,可以使用重定向来控制命令的输入、输出和错误输出的位置,以便更好地管理和处理命令的执行结果
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
交互式硬件设备
标准输入:从该设备接收用户输入的数据
标准输出:通过该设备向用户输出数据
标准错误:通过该设备报告执行出错信息
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | 1> | 将输出结果保存到指定的文件(覆盖原有内容) |
>> | 将输出结果追加到指定的文件尾部 | |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
2>> | 标准错误输出结果追加到指定的文件尾部 | |
混合输出 | &>无论对错都可以重定向 | 将标准输出、标准错误的内容保存到同一个文件中 |
拓展:
以下哪个选项不能把成功和错误一起显示到/data/all.log文件中
A ls /data /xxx 1> /data/all.log 2>&1
B ls /data /xxx 2> /data/all.log 1>&2
C ls /data /xxx &> /data/all.log
D ls /data /xxx >& /data/all.logE ls /data /xxx 2>&1 1> /data/all.log
答:E选项不能把成功和错误一起显示到/data/all.log文件中
多行重定向是指将多行文本输出到文件或命令的操作
在Shell脚本中,可以使用重定向符号<<
来实现多行重定向
|
是一种Shell命令操作符,用于将一个命令的输出作为另一个命令的输入。在Shell脚本中,管道符可以用于将多个命令组合起来,以便更好地处理和管理命令的执行结果如:
echo "321" | passwd --stdin dh #通过管道符,免交互修改dh用户的密码
ifconfig ens33 | grep netmask | tr -s " " | cut -d " " -f3 #通过管道符,得到本机的IP地址
myVariable
和myvariable
是不同的变量if
、for
、while
等my_variable
定义变量: name='value' 变量名=变量值
引用变量: $name 或 ${name}
调用变量: echo $name 或 echo ${name}
取消变量: unset name
双引号" " 如 "$name" 弱引用,其中的变量引用会被替换为变量值
单引号' ' 如 '$name' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串
反撇号 ` ` 或 $( ) 调用命令执行的结果
大括号{ } 定义变量名的范围
变量追加值:是指将新的值添加到已存在的变量值的末尾。这通常用于连接字符串或在数组中添加元素
变量名+=追加的内容
read -p
是一个用于读取用户输入的命令。它通常与echo
一起使用,以提示用户提供输入
read -p
命令会显示一个提示消息,并等待用户输入。一旦用户输入完成并按下回车键,输入的值将被存储到指定的变量中
案例一:
案例二:
默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用
可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所子shell环境中可以继续使用
格式1:export 变量名 声明已定义过的变量为全局变量
格式2:export 变量名=变量值 在定义变量时声明指定的变量为全局变量
expr
是一个用于数学计算和字符串操作的命令行工具,常用于Shell脚本中
expr只能进行整数的运算
expr 变量1 运算符 变量2 [运算符 变量3]……
运算符 | 说明 |
---|---|
+ | 加法 |
- | 减法 |
\* | 乘法 |
/ | 除法 |
% | 取余 (取模) |
方式一:
let 变量名=算术表达式
方式二:
((变量名 = 算术表达式))
方式三:
变量名=$[算术表达式]
$RANDOM
是一个特殊的环境变量,用于生成一个随机整数
每次访问$RANDOM
时,它会返回一个0到32767(2^15-1)之间的随机整数。这个值是通过使用伪随机数生成器来生成的,其种子是由系统时间设置的,因此每次脚本执行时,$RANDOM
的值都会不同
拓展:
echo -e "\E[1;31mhello\E[0m" #指定颜色
echo -e "\E[1;$[RANDOM%7+31]mhello\E[0m" #随机颜色
环境变量是一种特殊类型的变量,用于存储系统和用户级别的配置信息。这些变量对于操作系统和应用程序的正常运行非常重要
注:
环境变量具有以下特点:
[root@localhost ~]#env #查看系统所有的环境变量
常用的环境变量 | 说明 |
---|---|
$USER | 表示当前登录用户的用户名 |
$HOME | 指定当前用户的主目录路径 |
$LANG | 设置默认的语言环境 |
$PWD | 表示当前所在工作目录 |
$PATH | 定义了系统查找可执行文件的路径 |
SHELL |
指定当前用户所使用的shell程序 |
/etc/profile 或 ~/.bash_profile 可用来长期变更或设置环境变量
/etc/profile #如果修改此文件会作用于所有用户
~/.bash_profile #用户独立的配置文件,修改这个文件只作用于当前用户
只读变量是一种特殊类型的变量,其值不能被修改或重写。一旦将变量声明为只读,就无法再对其进行赋值操作
使用只读变量有以下几个优点:
可使用readonly
命令来将变量声明为只读
readonly 变量名 #将该变量声明为只读
注:使用unset 变量名 也无法取消只读,必须通过reboot重启后才能修改变量
位置变量(Positional Variables)是一组特定的变量,用于存储命令行参数(Command Line Arguments)。当我们在命令行上运行一个脚本或执行一个程序时,可以通过位置变量来访问传递给该脚本或程序的参数
在Bash脚本中,位置变量被表示为$1
、$2
、$3
等。其中,$1
表示第一个参数,$2
表示第二个参数,以此类推。 $0
表示当前脚本的名称
存在一些预定义变量(也称为状态变量),它们提供了有关系统和正在发生的操作的信息。这些变量不需要事先声明,而是由操作系统自动提供
预定义变量 | 说明 |
---|---|
$* | 表示所有位置参数的内容看成一个整体返回,即返回所有 |
$@ | 表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回,即返回所有 |
$? | 表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0 值均表示执行出现异常 |
$# | 表示命令行中位置参数的总个数 |
$0 | 表示当前执行的脚本或程序的名称 当前脚本的名字 |
$$ | 当前bash的进程id |
$! | 后台任务最后一个id |
注:
当使用“$0”预定义变量时,如果执行的是软链接文件,则输出的是当前执行的软链接文件名
#!/bin/bash
name=`hostname`
ip=`ifconfig ens33 | grep netmask | tr -s " " | cut -d " " -f3`
cpu=`lscpu | grep 型号名称 | tr -s " " | cut -d" " -f2-8`
kernel=`uname -r`
os=`cat /etc/redhat-release`
disk=`lsblk | grep disk | awk '{print $4}'`
mem=`free -h | grep Mem | awk '{print $2}'`
echo -e "\E[1;35m----------------system info--------------------\E[0m"
echo "主机名: $name"
echo "IP地址: $ip"
echo "CPU型号: $cpu"
echo "内核版本:$kernel"
echo "系统类型:$os"
echo "磁盘大小:$disk"
echo "内存大小:$mem"
echo -e "\E[1;35m---------------- end --------------------\E[0m"
#!/bin/bash
FreeCC=$(free -m | grep "Mem: " |tr -s " "|cut -d " " -f7)
[ $FreeCC -lt 1200 ] && echo "${FreeCC}MB"
mem_size=$(free -m | grep "Mem: " |tr -s " "|cut -d " " -f4)
[ $mem_size -ge 10000 ] && echo "由于服务器系统内存资源不足,请尽快处理故障!"