Linux复习笔记(六)shell编程

news2025/5/17 8:51:22

 遇到的问题,都有解决方案,希望我的博客能为你提供一点帮助。

三、shell编程简明教程

一、Shell基础概念

​1. Shell的作用​

  • 是用户与Linux内核交互的桥梁,既是命令解释器,也是一种脚本语言。
  • 运行机制:用户输入命令或脚本 → Shell解析 → 调用内核服务 → 结果返回终端。

​2. 脚本编写规范​

  • 文件扩展名:.sh
  • 框架结构:
    #!/bin/bash               # 指定解析器
    # 注释用#                 # 注释
    var="Hello World"         # 变量定义
    echo $var                 # 输出

​示例1:Hello World脚本​

#!/bin/bash
echo "Hello World!"

运行方式:

chmod +x hello.sh
./hello.sh
二、变量

​1. 变量类型​

  • ​环境变量​​:系统级全局变量(如$PATH$HOME)。
  • ​自定义变量​​:用户定义,分全局(export var)和局部。
  • ​特殊符号变量​​:如$0(脚本名)、$#(参数个数)、$?(上条命令状态)。

​2. 变量操作​

  • 定义变量:VAR=value(等号无空格)。
  • 使用变量:echo $VAR 或 ${VAR}
  • 只读变量:readonly VAR

​示例2:变量作用域​

#!/bin/bash
var1="Global"             # 父Shell变量
export var1               # 导出为全局变量
(
  var2="Local"            # 子Shell变量
  echo "子Shell: var1=$var1, var2=$var2"
)
echo "父Shell: var1=$var1, var2=$var2"  # var2不存在

输出:

子Shell: var1=Global, var2=Local
父Shell: var1=Global, var2=
三、运算符

​1. 算术运算​

  • 使用$(( ))expr
    result1=$(( (2+3)*4 ))          # 输出20
    result2=`expr 2 + 3`            # expr需空格
    result3=`expr $result2 \* 4`    # 乘法需转义*

​示例3:计算1+2+...+100​

#!/bin/bash
sum=0
for ((i=1; i<=100; i++)); do
  sum=$((sum + i))
done
echo "Sum: $sum"    # 输出5050

​2. 关系与逻辑运算​​ 

  • 关系运算符:-eq(等于)、-gt(大于)。
  • 逻辑运算符:&&(与)、||(或)。
运算符功能描述示例(判断 a 和 b 的关系)
-eq等于(equal)[ "$a" -eq "$b" ] 或 [[ $a -eq $b ]]
-ne不等于(not equal)[ "$a" -ne "$b" ]
-gt大于(greater than)[ "$a" -gt "$b" ]
-ge大于等于(greater than or equal)[ "$a" -ge "$b" ]
-lt小于(less than)[ "$a" -lt "$b" ]
-le小于等于(less than or equal)[ "$a" -le "$b" ]
四、流程控制
基本语法
if [ condition ]; then
    # 条件为真时执行的代码
fi
条件表达式
  • [] 是传统的条件判断,适用于简单的条件测试。
  • [[]] 是 Bash 的扩展条件判断,支持更复杂的逻辑和字符串操作(如正则表达式)。
  • ((...)) 用于算术表达式,适合在 if 语句中进行算术比较。
if [[ $var == "value" ]]; then
    echo "变量 var 的值是 value"
fi
sum=10
if ((sum % 2 == 0)); then
    echo "sum is even"
fi
 
 比较运算符

Bash 中常用的比较运算符包括:

  • 字符串比较:==, !=

  • 数值比较:-eq, -ne, -gt, -lt, -ge, -le

  • 文件测试:-e, -f, -d, -r, -w, -x

if [ $num -gt 10 ]; then
    echo "数字大于 10"
fi
逻辑运算符

可以使用 &&|| 来组合多个条件。

if [[ $var1 == "value1" && $var2 == "value2" ]]; then
    echo "两个条件都满足"
fi

if-else 语句

if-else 语句允许在条件不满足时执行另一段代码。

if [ $var == "value" ]; then
    echo "条件为真"
else
    echo "条件为假"
fi

if-elif-else 语句

if-elif-else 语句用于处理多个条件。

if [ $var == "value1" ]; then
    echo "变量等于 value1"
elif [ $var == "value2" ]; then
    echo "变量等于 value2"
else
    echo "变量既不等于 value1 也不等于 value2"
fi

嵌套 if 语句

if 语句可以嵌套使用,以处理更复杂的逻辑。

if [ $var1 == "value1" ]; then
    if [ $var2 == "value2" ]; then
        echo "两个条件都满足"
    fi
fi

使用 test 命令

test 命令也可以用于条件判断,通常与 if 语句一起使用。

#[]是test 简写
if test $var == "value"; then
    echo "条件为真"
fi
字符串匹配

[[ ]] 支持正则表达式匹配,可以使用 =~ 运算符。

if [[ $var =~ ^[0-9]+$ ]]; then
    echo "变量只包含数字"
fi
文件测试

if 语句常用于检查文件或目录是否存在。

if [ -f /path/to/file ]; then
    echo "文件存在"
fi
空值检查

可以使用 -z 检查变量是否为空。

if [ -z $var ]; then
    echo "变量为空"
fi

使用 -n 检查变量是否非空。

if [ -n $var ]; then
    echo "变量非空"
fi
多个条件的组合

可以通过 -a-o 组合多个条件。

if [ $var1 == "value1" -a $var2 == "value2" ]; then
    echo "两个条件都满足"
fi
使用 case 语句

对于多个条件的判断,case 语句可能更简洁。

case $var in
    "value1")
        echo "变量等于 value1"
        ;;
    "value2")
        echo "变量等于 value2"
        ;;
    *)
        echo "变量既不等于 value1 也不等于 value2"
        ;;
esac


​示例4:判断分数是否及格​

#!/bin/bash
if [ $1 -ge 60 ]; then
  echo "及格"
else
  echo "不及格"
fi
# 测试及格情况
./script.sh 75  # 输出:及格

# 测试不及格情况
./script.sh 59  # 输出:不及格

​​​示例5:根据参数输出星期​

#!/bin/bash
case $1 in
  1) echo "周一";;
  2) echo "周二";;
  *) echo "Other";;
esac

运行:./script.sh 2 → 输出周二


五、正则表达式
基本语法
  • .:匹配任意单个字符,除了换行符。
  • \d:匹配任意数字,等价于 [0-9]
  • \D:匹配任意非数字字符,等价于 [^0-9]
  • \w:匹配任意字母、数字或下划线,等价于 [a-zA-Z0-9_]
  • \W:匹配任意非字母、非数字、非下划线字符,等价于 [^a-zA-Z0-9_]
  • \s:匹配任意空白字符,包括空格、制表符、换行符等。
  • \S:匹配任意非空白字符。
  • ^:匹配字符串的开始。
  • $:匹配字符串的结束。
  • *:匹配前面的子表达式零次或多次。
  • +:匹配前面的子表达式一次或多次。
  • ?:匹配前面的子表达式零次或一次。
  • {n}:匹配前面的子表达式恰好 n 次。
  • {n,}:匹配前面的子表达式至少 n 次。
  • {n,m}:匹配前面的子表达式至少 n 次,至多 m 次。
  • []:匹配方括号中的任意一个字符。
  • |:表示“或”,匹配左边或右边的表达式。
 基本元字符​
  • ^:行首;$:行尾;.*:任意字符;[0-9]:数字。
  • grep示例:
    grep "^root" /etc/passwd     # 查找以root开头的行
    grep "nologin$" /etc/passwd  # 查找以nologin结尾的行
扩展正则表达式​
  • +:1次以上;?:0或1次;|:或。
  • egrep示例:
    egrep "(root|admin)" /etc/passwd  # 匹配root或admin
grep+正则表达式用法: 
grep "pattern" file.txt

该命令会在 file.txt 中搜索包含 pattern 的行。

正则表达式匹配

grep "^start" file.txt

该命令会匹配以 start 开头的行。

grep "end$" file.txt

该命令会匹配以 end 结尾的行。

匹配任意字符

grep "a.b" file.txt

该命令会匹配包含 a 后跟任意一个字符再跟 b 的行,例如 aabacb 等。

匹配多个字符

grep "[abc]" file.txt

该命令会匹配包含 abc 的行。

匹配重复字符

grep "a*" file.txt

该命令会匹配包含零个或多个 a 的行。

grep "a\+" file.txt

该命令会匹配包含一个或多个 a 的行。

匹配特定次数

grep "a\{2\}" file.txt

该命令会匹配包含恰好两个 a 的行。

grep "a\{2,\}" file.txt

该命令会匹配包含两个或更多 a 的行。

匹配单词边界

grep "\bword\b" file.txt

该命令会匹配包含完整单词 word 的行。

忽略大小写

grep -i "pattern" file.txt

该命令会忽略大小写,匹配 pattern 的行。

反向匹配

grep -v "pattern" file.txt

该命令会匹配不包含 pattern 的行。

递归搜索

grep -r "pattern" /path/to/directory

该命令会在指定目录及其目录中递归搜索包含 pattern 的文件。

显示匹配行号

grep -n "pattern" file.txt

该命令会显示匹配行的行号。

显示匹配文件名

grep -l "pattern" /path/to/directory

该命令会显示包含匹配内容的文件名。

使用扩展正则表达式

grep -E "pattern" file.txt

该命令会使用扩展正则表达式进行匹配,支持更多元字符和操作符。

示例

grep -E "^[A-Za-z]+$" file.txt

该命令会匹配仅包含字母的行。

grep -E "[0-9]{3}-[0-9]{2}-[0-9]{4}" file.txt

该命令会匹配类似 123-45-6789 格式的社会安全号码。

六、循环结构
​1. for循环​
​示例6:遍历参数​
#!/bin/bash
for arg in "$@"; do
  echo "参数: $arg"
done

"$@"双引号包裹的特殊变量,表示所有命令行参数,且保留参数中的空格 

运行:./script.sh A B C → 输出三个参数。

​2. while循环​
​示例7:求1~n的和​
#!/bin/bash
sum=0
i=1
while [ $i -le $1 ]; do
  sum=$((sum + i))
  i=$((i + 1))
done
echo "Sum: $sum"

运行:./script.sh 100 → 输出5050。

3.数组遍历 

通过元素遍历:

arr=("apple" "banana" "cherry")
for fruit in "${arr[@]}"
do
    echo "$fruit"
done

通过索引遍历:

arr=("red" "green" "blue")
for index in "${!arr[@]}"
do
    echo "元素 $index 是 ${arr[$index]}"
done

注意要点:

  • 数组声明使用()包裹元素,元素间用空格分隔
  • ${arr[@]}获取所有数组元素
  • ${!arr[@]}获取所有数组索引
  • 双引号"可防止带空格的元素被拆分
  • 索引从0开始计数

示例输出:

apple
banana
cherry
元素 0 是 red
元素 1 是 green
元素 2 是 blue

七、输入输出

​1. echo格式化输出​

echo -e "\e[1;31m红色文字\e[0m"   # 红色文字
printf "%-10s %5d\n" "Tom" 90    # 对齐输出

​2. read交互输入​

read -p "请输入用户名: " user
read -s -t 10 -p "密码(10秒内): " pass
echo "用户: $user, 密码: $pass"

八、文件判断

​示例8:检查文件属性​

#!/bin/bash
if [ -e "$1" ]; then
  echo "文件存在"
  [ -r "$1" ] && echo "可读"
else
  echo "文件不存在"
fi

运行:./script.sh test.txt → 检查文件状态。


九、综合案例
​示例9:系统信息菜单​
#!/bin/bash
clear
echo -e "\e[1;34m系统信息菜单\e[0m"
echo "1. 查看网卡信息"
echo "2. 查看内存信息"
read -p "输入选项[1-2]: " choice
case $choice in
  1) ifconfig | head -2;;
  2) free -h | grep Mem;;
  *) echo "无效选项";;
esac

[ -r "$1" ] && echo "可读"

  • -r:文件可读测试(readable)。
  • &&:逻辑与运算符,当前面的命令成功(返回状态码 0)时才执行后面的命令。
示例10: 遍历和统计 /etc/ftp下的文件/目录数 

文件测试操作符

在Shell脚本中,通过 -d 和 -f 可以判断文件类型:

  • -d <file>​:判断是否为目录文件。
  • -f <file>​:判断是否为普通文件(如文本、二进制文件)。
#!/bin/bash
#记录文件和目录的数量
f_count=0
d_count=0
#遍历/etc/ftp/下所有文件
for file in /etc/ftp/*; do
    if [ -d "$file"]; then
        ((d_count++))
    elif [ -f "$file" ]; then
        ((f_count++))
    fi
done

#输出
echo "文件数:$f_count”
echo "目录数:$d_count"
 

chmod +x count_files.sh
./count_files.sh
# 输出示例:
# 目录文件数量: 3
# 普通文件数量: 8
示例11:读取文件并操作 users.txt

users.txt

#!/bin/bash
count=0
while IFS= read -r line;do
    ((count++))
    #读取账户(奇数行)密码(偶数行)
    if ((count%2==0));then
        u_passwd="$line"
         #判断账户是否存在
        if id "$ u_name";then
            echo "用户 $username 已存在,正在修改密码..."
            echo "$username:$password" | chpasswd
        else
            echo "用户 $username 不存在,正在创建账户和密码..."
            useradd "$u_name"
            echo "$username:$password" | chpasswd
         fi
    else
        u_name="$line"
    fi
done < users.txt
  
示例12: 判断服务类型以及对服务进行操作
#!/bin/bash
#服务数组
service=("htp","http","vsftpd")
for i in "{service[@]}"; do
    if systemctl is-active --quiet "$i";then
        echo "[OK] $i服务已运行"
    else
        echo "[修复] $i 服务未启动,正在尝试启动..."
        sudo systemctl start "$i"
        sudo systemctl enable "$i" # 可选:设置开机自启
    fi
done

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2377509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity 拖尾烟尘效果及参数展示

亮点&#xff1a;在移动特效过后 &#xff0c;粒子会顺着惯性继续向前移动一小段距离。 以unity-URP管线为例&#xff0c;下图是Particle System参数分享&#xff1a; Start Color参数&#xff1a; UnityEditor.GradientWrapperJSON:{"gradient":{"serialized…

Vue3 Echarts 3D饼图(3D环形图)实现讲解附带源码

文章目录 前言一、准备工作1. 所需工具2. 引入依赖方式一&#xff1a;CDN 快速引入方式二&#xff1a;npm 本地安装&#xff08;推荐&#xff09; 二、实现原理解析三、echarts-gl 3D插件 使用回顾grid3D 常用通用属性&#xff1a;series 常用通用属性&#xff1a;surface&…

Kafka快速安装与使用

引言 这篇文章是一篇Ubuntu(Linux)环境下的Kafka安装与使用教程&#xff0c;通过本文&#xff0c;你可以非常快速搭建一个kafka的小单元进行日常开发与调测。 安装步骤 下载与解压安装 首先我们需要下载一下Kafka&#xff0c;这里笔者采用wget指令&#xff1a; wget https:…

Java EE初阶——wait 和 notify

1. 线程饥饿 线程饥饿是指一个或多个线程因长期无法获取所需资源&#xff08;如锁&#xff0c;CPU时间等&#xff09;而持续处于等待状态&#xff0c;导致其任务无法推进的现象。 典型场景 优先级抢占&#xff1a; 在支持线程优先级的系统中&#xff0c;高优先级线程可能持续…

RPA vs. 传统浏览器自动化:效率与灵活性的终极较量

1. 引言 在数字化转型的大潮下&#xff0c;企业和开发者对浏览器自动化的需求日益增长。无论是网页数据抓取、自动化测试&#xff0c;还是用户行为模拟&#xff0c;浏览器自动化已经成为提升效率的关键工具。然而&#xff0c;面对越来越严格的反自动化检测、复杂的 Web 结构和…

docker 快速部署若依项目

1、首先创建一个自定义网络&#xff0c;作用是使连接到该网络的容器能够通过容器名称进行通信&#xff0c;无需使用复杂的IP地址配置&#xff0c;方便了容器化应用中各个服务之间的交互。 sudo docker network create ruoyi 2、创建一个文件夹&#xff0c;创建compose.yml文件…

polarctf-web-[rce1]

考点&#xff1a; (1)RCE(exec函数) (2)空格绕过 (3)执行函数(exec函数) (4)闭合(ping命令闭合) 题目来源&#xff1a;Polarctf-web-[rce1] 解题&#xff1a; 这段代码实现了一个简单的 Ping 测试工具&#xff0c;用户可以通过表单提交一个 IP 地址&#xff0c;服务器会执…

Redis+Caffeine构造多级缓存

一、背景 项目中对性能要求极高&#xff0c;因此使用多级缓存&#xff0c;最终方案决定是RedisCaffeine。其中Redis作为二级缓存&#xff0c;Caffeine作为一级本地缓存。 二、Caffeine简单介绍 Caffeine是一款基于Java 8的高性能、灵活的本地缓存库。它提供了近乎最佳的命中…

docker(四)使用篇二:docker 镜像

在上一章中&#xff0c;我们介绍了 docker 镜像仓库&#xff0c;本文就来介绍 docker 镜像。 一、什么是镜像 docker 镜像本质上是一个 read-only 只读文件&#xff0c; 这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。 我们可以把…

AXI4总线协议 ------ AXI_LITE协议

一、AXI 相关知识介绍 https://download.csdn.net/download/mvpkuku/90841873 AXI_LITE 选出部分重点&#xff0c;详细文档见上面链接。 1.AXI4 协议类型 2.握手机制 二、AXI_LITE 协议的实现 1. AXI_LITE 通道及各通道端口功能介绍 2.实现思路及框架 2.1 总体框架 2.2 …

Ubuntu24.04 安装 5080显卡驱动以及cuda

前言 之前使用Ubuntu22.04版本一直报错,然后换了24.04版本才能正常安装 一. 配置基础环境 Linux系统进行环境开发环境配置-CSDN博客 二. 安装显卡驱动 1.安装驱动 按以下步骤来&#xff1a; sudo apt update && sudo apt upgrade -y#下载最新内核并安装 sudo add…

SpringAI-RC1正式发布:移除千帆大模型!

续 Spring AI M8 版本之后&#xff08;5.1 发布&#xff09;&#xff0c;前几日 Spring AI 悄悄的发布了最新版 Spring AI 1.0.0 RC1&#xff08;5.13 发布&#xff09;&#xff0c;此版本也将是 GA&#xff08;Generally Available&#xff0c;正式版&#xff09;发布前的最后…

操作系统之进程和线程听课笔记

计算机的上电运行就是构建进程树,进程调度就是在进程树节点进程进行切换 进程间通信的好处 经典模型 生产者和消费者 进程和线程的区别 线程引入带来的问题线程的优势 由于unix70年代产生,90年代有线程,当时数据库系统操作需要线程,操作系统没有来得及重造,出现了用户态线…

COMSOL随机参数化表面流体流动模拟

基于粗糙度表面的裂隙流研究对于理解地下水的流动、污染物传输以及与之相关的地质灾害&#xff08;如滑坡&#xff09;等方面具有重要意义。本研究通过蒙特卡洛方法生成随机表面形貌&#xff0c;并利用COMSOL Multiphysics对随机参数化表面的微尺度流体流动进行模拟。 参数化…

JavaSwing中的容器之--JScrollPane

JavaSwing中的容器之–JScrollPane 在Java Swing中&#xff0c;容器是用于容纳其他组件&#xff08;如按钮、标签等&#xff09;的组件。Swing提供了多种容器&#xff0c;它们可以嵌套使用以创建复杂的用户界面。 JScrollPane是一个轻量级组件&#xff0c;提供可滚动视图。JSc…

使用 Cookie 实现认证跳转功能

使用 Cookie 实现认证跳转功能的实践与解析 在 Web 开发中&#xff0c;用户身份认证是一个基础而关键的功能点。本文将通过一个简单的前后端示例系统&#xff0c;介绍如何基于 Cookie 实现 Token 保存与自动跳转认证的功能&#xff0c;并结合 Cookie 与 Header 的区别、使用场…

LED接口设计

一个LED灯有3种控制状态&#xff0c;常亮、常灭和闪烁&#xff0c;要做到这种控制最简单的一种方法是使用任何一款处理器的普通IO去控制。 用IO控制方式有两种&#xff0c;一种是高有效&#xff0c;如下图1所示IO口为高电平时LED亮&#xff0c;IO为低电平时LED不亮。IO口出一个…

SpringBoot项目使用POI-TL动态生成Word文档

近期项目工作需要动态生成Word文档的需求&#xff0c;特意调研了动态生成Word的技术方案。主要有以下两种&#xff1a; 第一种是FreeMarker模板来进行填充&#xff1b;第二种是POI-TL技术使用Word模板来进行填充&#xff1b; 以下是关于POI-TL的官方介绍 重点关注&#xff1…

YOLOv3深度解析:多尺度特征融合与实时检测的里程碑

一、YOLOv3的诞生&#xff1a;继承与突破的起点 YOLOv3作为YOLO系列的第三代算法&#xff0c;于2018年由Joseph Redmon等人提出。它在YOLOv2的基础上&#xff0c;针对小目标检测精度低、多类别标签预测受限等问题进行了系统性改进。通过引入多尺度特征图检测、残差网络架构和独…

uniapp-商城-60-后台 新增商品(属性的选中和页面显示)

前面添加了属性&#xff0c;添加属性的子级项目。也分析了如何回显&#xff0c;但是在添加新的商品的时&#xff0c;我们也同样需要进行选择&#xff0c;还要能正常的显示在界面上。下面对页面的显示进行分析。 1、界面情况回顾 属性显示其实是个一嵌套的数据显示。 2、选中的…