目录
面向过程编程语言是一种以过程为中心的编程范式
面向对象编程语言是一种以对象为中心的编程范式
接下来将详细介绍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脚本中,管道符可以用于将多个命令组合起来,以便更好地处理和管理命令的执行结果如:
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"