目录
前言
条件测试操作
1、文件测试
2、整数值比较
3、字符串比较
4、逻辑测试
if条件语句
1:单分支if语句
2、双分支if语句
3、多分支if语句
case分支语句
1、检查用户输出的字符类型
2、编写系统服务脚本
脚本文件 http-server.sh
使用说明
1. 快速启动
2. 其他操作
扩展:chkconfig 命令
chkconfig 命令详解
一、定义与功能
二、基本语法
三、运行级别(Runlevel)说明
四、核心功能详解
五、常见操作示例
前言
经过老师的教导,我宛若醍醐灌顶,清楚了走向胜利的“那张卡牌”。(没错,我还是一个牌佬)其实很多道理... ...很多人心里都清楚。能否选择去改变,这是需要很大的勇气与耐力。这些就懒得继续聊了,就像我“老大”(以前的老师)告诉我的一样:“你凭什么将自己的思想灌输于经历各异的他人?”
所以就这样吧,今天我们要对于Shell编程进行更详细的讲解。在之前的帖子中,我们初步的讲解了Shell编程的基本规范与相关各类变量。(如果你是第一次看到这些,对先前的知识并不了解,那么就来这里进行学习吧------→"闭关修行")
条件测试操作
今天,我们又双叒来对于Shell的定义与作用进行讲解。可想而知,Shell对于Linux的重要性!首先 Shell 作为用户与操作系统内核交互的命令行解释器,负责解析用户输入的命令并调用系统功能。它既是命令语言,也是脚本编程语言,支持自动化任务管理和复杂逻辑控制。常见的Shell类型如下:
类型 意义 Bash(Bourne Again Shell) Linux 默认 Shell,兼容 sh
并扩展了功能sh(Bourne Shell) Unix 早期标准 Shell zsh/csh 支持更高级的交互特性(如命令补全)
并且Shell编程作为Linux系统管理的组成部分,我们可以通过它强大的脚本处理能力为自动化任务提供极大的便利。在进行脚本编写时,条件语句更是不可或缺的逻辑结构(可以实现智能化和高效化)。
如果要使Shell脚本具备一定的“智能“,首先就是如何区分不同的情况以确定执行操作。我们可以通过命令(echo $?)返回的状态值来进行判断是否执行成功。但返回值为0时,则为成功;反之则为失败或异常。
接下来...我们将使用专门的测试命令——test命令,其可以对于特定条件进行测试,并根据返回值来判断条件是否成立(返回值为0则成立)。格式如下:
- test 条件表达式
- [ 条件表达式 ]
这两种作用完全相同,但后者更为常用。但需要注意的是:方括号为英文字符;且条件表达式之间需要至少一个空格进行分隔。
1、文件测试
根据指定的路径名称,判断对应的是文件还是目录;也可判定文件的相应权限(r、w、x)。选项如下:
-d:测试是否为目录(Directory);
-e:测试目录或文件是否存在(Exist);
-f:测试是否为文件(File);
-r、-w、-x:测试当前用户是否有当前权限。
示例如下:
[root@localhost ~]#[ -e /media/ ]
[root@localhost ~]#echo $? //查看前一命令的返回值
1 //由于我并未创建yum源,所以条件不成立。
2、整数值比较
根据指定的两个整数值,判定彼此之间的关系。选项如下:
-eq:等于(Equal);
-ne:不等于(Not Equal);
-gt:大于(Greater Than);
-lt:小于(Lesser Than);
-le:小于等于(Lesser or Equal);
-ge:大于等于(Greater or Equal)。
示例如下:
例一:
[root@localhost ~]#UserNum=`who |wc -l` //查看当前已登陆用户并列出行数
[root@localhost ~]#[ $UserNum -le 2] && echo "Too less." //测试结果(小于等于)
Too less例二:
[root@localhost ~]#Free=$(free -m |grep "Mem: " | awk '{print $7}')
[root@localhost ~]#[ $Free -lt 1024 ] && echo ${$Free}MB
278MB
3、字符串比较
用于检查用户输入、系统环境等是否满足条件;也可判断用户指定的参数是否符合要求。选项如下:
=:两个字符串彼此之间相同;
!=:两个字符串彼此之间不同; //“ !”表示取反
-z:检查字符串是否为空(Zero),对于未定义或赋予空值的变量视为空串。
示例如下:
例一:
[root@localhost ~]#echo $LANG //查看当前的语言环境
zh_CN.UTF-8
[root@localhost ~]#[ $LANG !="en.US" ] && echo "Not en.US" //字符串测试结果(不等于)
Not en.US
例二:
[root@localhost ~]#read -p "是否覆盖现有文件(y/n)?" ACK
是否覆盖现有文件(y/n)?yes
[root@localhost ~]#[ $ACK = "yes" ] &&echo “覆盖” //校验结果
覆盖
4、逻辑测试
判定两个或多个之间的依赖关系。选项如下:
&&:逻辑“与”,表示而且,只有当前后两个条件都成立时,返回值才为0(成立)。//使用test命令时,可改为“-a”。
||:逻辑“或”,表示或者,只有前后两个条件之间成立一个,返回值才为0(成立)。//使用test命令时,可改为“-o”。
!:逻辑“否”,表示不,只有前后两个条件都不成立,返回值才为0(成立)。
示例如下:
[root@localhost ~]#uname -r //查看内核版本信息
... ... //省略信息
[root@localhost ~]#Mnum=$(uname -r |awk -F. '{print $1}') //取主版本号
[root@localhost ~]#Snum=$(uname -r |awk -F. '{print $2}') //取次版本号
[root@localhost ~]#[ $Mnum -ge 3 ] && [ $Snum -gt 4 ] && echo “符合要求” //由于不符合,所以不会输出信息
if条件语句
在上面的讲解中,其实实际使用“&&”与“||”逻辑测试便可以满足日常简单的判断并执行了。然而当需要执行的命令较多时,这种方式就会显得复杂,而“if条件语句”便是专门解决此类情况。
1:单分支if语句
结构:
if 条件测试操作then命令序列
fi
逻辑:
if 条件测试操作——条件成立 then ——命令序列——fi 结束判断⌊____条件不成立___________________⌋
2、双分支if语句
结构:
if 条件测试操作then命令序列else命令序列
fi
逻辑:
if 条件测试操作——条件成立 then ——命令序列——fi 结束判断⌊____条件不成立 else___命令序列________⌋
3、多分支if语句
结构:
if 条件测试操作 1then命令序列 1elif 条件测试操作 2then命令序列 2else命令序列 3
fi
逻辑:
if 条件测试操作 1———————条件成立 then ——————————命令序列———————————fi 结束判断⌊____elif 条件测试操作2___条件成立 then___命令序列 2_____________⌋⌊___条件不成立 else____命令序列 n____________⌋
case分支语句
case语句可以使脚本程序的结构更加清晰、层次分明。主要适用于某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。结构如下:
case 变量值 in模式 1)命令序列 1;;模式 2)命令序列 2;; ... ...*)默认命令序列
esac
逻辑:
case 变量值|_模式 1____________成立__________命令序列 1________;;_________esac结束分支|______不成立___模式 2__________成立_______命令序列 2______;;_______||___不成立______*)____成立____默认命令序列___;;___|PS:1、case 行尾必须为单词“in”,每一模式必须以右括号“)”结束;2、双分号“;;”表示命令序列的结束;3、模式字符串中,可以用方括号表示一个连续的范围,如“[0-9]”; 还可以用竖杠符号“|”表示或,如“A|B”。4、最后的“*)”表示默认模式,其中的“ * ”相当于通配符。
案例:
1、检查用户输出的字符类型
[root@localhost ~]#vim keys-type.sh
#!/bin/bash //指定SHELL
read -p "请输入一个字符,并按下 ENTER 建确认:" KEY
case "$KEY" in[a-z]|[A-Z]) //匹配任意字母echo "您输入的是 字母。";;[0-9]) //匹配任意数字echo "您输入的是 数字。"*) //默认模式,匹配任意字符echo "您输入的是 空格、功能键或其他控制字符。"、
esac
[root@localhost ~]#chmod +x keys-type.sh //给予脚本可执行的权限
[root@localhost ~]#./keys-type.sh //运行脚本
请输入一个字符,并按下 ENTER 建确认:9 //输入字符
您输入的是 数字。
2、编写系统服务脚本
脚本文件 http-server.sh
#!/bin/bash# 简易 HTTP 服务控制脚本# 功能:start|stop|restart|status# 依赖:Python3(内置 http.server)# 配置项(按需修改)PORT=8000 # 服务端口WEB_ROOT="./www" # 网站根目录PID_FILE=".httpd.pid" # PID 文件路径LOG_FILE="httpd.log" # 日志文件路径# 定义操作函数start_server() {# 检查是否已运行if [ -f "$PID_FILE" ]; thenecho "服务已在运行中 (PID: $(cat $PID_FILE))"return 1fi# 创建网站目录mkdir -p "$WEB_ROOT"echo "启动 HTTP 服务:端口=$PORT, 根目录=$WEB_ROOT"# 启动 Python HTTP 服务器(后台运行)nohup python3 -m http.server "$PORT" --directory "$WEB_ROOT" > "$LOG_FILE" 2>&1 &echo $! > "$PID_FILE" # 记录 PIDecho "服务已启动 | PID: $(cat $PID_FILE) | 日志: $LOG_FILE" }stop_server() {if [ ! -f "$PID_FILE" ]; thenecho "服务未运行"return 1filocal pid=$(cat "$PID_FILE")echo "停止 HTTP 服务 (PID: $pid)..."kill -9 "$pid" && rm -f "$PID_FILE" echo "服务已停止"}# Case 分支处理命令case "$1" instart)start_server;;stop)stop_server;;restart)stop_serversleep 1start_server;;status)if [ -f "$PID_FILE" ]; thenecho "状态: 运行中 (PID: $(cat $PID_FILE))"elseecho "状态: 未运行"fi;;*)echo "用法: $0 {start|stop|restart|status}"exit 1esac
使用说明
1. 快速启动
# 赋予执行权限 chmod +x http-server.sh
# 启动服务(默认端口 8000,根目录 ./www) ./http-server.sh start
# 浏览器访问 curl http://localhost:8000
2. 其他操作
# 停止服务 ./http-server.sh stop
# 重启服务 ./http-server.sh restart
# 查看状态 ./http-server.sh status
扩展:chkconfig 命令
chkconfig 命令详解
一、定义与功能
chkconfig
是 Linux 系统中用于管理 SysV init 服务的工具,通过控制 /etc/rc[0-6].d
目录下的符号链接,实现服务在不同运行级别下的自启动配置。其主要功能包括:
- 查看服务在各运行级别的启动状态
- 启用/禁用服务的自启动
- 添加或删除服务的管理配置
二、基本语法
chkconfig [选项] [服务名] [on/off/reset]
常用选项:
--list
或-l
:列出所有服务的启动状态--add
或-a
:将服务添加到管理列表--del
或-d
:从管理列表中删除服务--level <运行级别>
:指定操作的运行级别(如3,5
)
三、运行级别(Runlevel)说明
级别 | 含义 |
---|---|
0 | 关机 |
1 | 单用户模式(维护模式) |
2 | 多用户无网络模式 |
3 | 多用户命令行模式(带网络) |
4 | 保留未使用 |
5 | 图形界面模式 |
6 | 重启系统 |
注:默认操作级别通常为 3 或 5。 |
四、核心功能详解
-
管理服务启停
- 启用服务:指定运行级别下自启动
chkconfig --level 3,5 httpd on # 在级别3、5启用httpd
- 禁用服务:关闭自启动
chkconfig httpd off # 默认关闭所有级别(2-5)的自启动:ml-citation{ref="1,7" data="citationList"}
- 启用服务:指定运行级别下自启动
-
配置运行级别
- 查看特定服务的状态:
chkconfig --list sshd # 输出sshd在各运行级别的状态
- 重置服务配置:恢复为脚本默认值
chkconfig --reset myservice # 清除自定义设置
- 查看特定服务的状态:
-
服务脚本配置
- 添加自定义服务需在
/etc/init.d/
下创建脚本,并包含以下元数据:#!/bin/bash # chkconfig: 345 99 05 # 在级别3/4/5启用,启动优先级99,停止优先级05 # description: 自定义服务描述
- 优先级范围:
0-99
,数值越小优先级越高8。
- 添加自定义服务需在
五、常见操作示例
-
查看所有服务状态
chkconfig --list # 输出所有服务的启动配置
-
启用/禁用服务
chkconfig sshd on # 在默认级别(2-5)启用sshd chkconfig nfs off # 关闭nfs的自启动
-
添加/删除服务管理
chkconfig --add myservice # 添加myservice到管理列表 chkconfig --del oldservice # 删除oldservice的管理配置