当前位置: 首页 > news >正文

【Shell 脚本入门】轻松上手的实战指南

🌈 个人主页:Zfox_
🔥 系列专栏:Shell脚本编程

目录

  • 一:🔥 什么是 Shell
    • 🦋 常见的 Shell 类型
  • 二:🔥 什么是 Shell 脚本
    • 🦋 Shell 脚本规则
    • 🦋 第一个 Shell 脚本
    • 🦋 Shebang
    • 🦋 脚本的常用执行方式
    • 🦋 第二个 Shell 脚本:多命令处理
    • 🦋 Shell 的优势
  • 三:🔥 Shell 中的变量
    • 🦋 系统变量
    • 🦋 自定义变量
    • 🦋 单引号 双引号区别
    • 🦋 特殊变量
    • 🦋 特殊变量实践
    • 🦋 Shell 变量面试题
    • 🦋 环境变量设置
    • 🦋 检查系统环境变量的命令
    • 🦋 撤销环境变量
    • 🦋 设置只读变量
    • 🦋 环境变量初始化与加载顺序
  • 四:🔥 Shell 子串
    • 🦋 bsah 一些基础的内置命令
    • 🦋 Shell 子串的花式用法
    • 🦋 字符串截取
    • 🦋 应用:批量修改文件名
    • 🦋 特殊 Shell 扩展变量
  • 五:🔥 共勉

一:🔥 什么是 Shell

🦞 Shell 是一块包裹着系统核心的壳,处于操作系统的最外层,与用户直接对话,把用户的输入, 解释给操作系统,然后处理操作系统的输出结果,输出到屏幕给与用户看到结果。

Shell 是用户与系统交互的主要方式之一。
在这里插入图片描述
Shell 的作用是

  • 解释执行用户输入的命令或程序等
  • 用户输入一条命令,Shell 就解释一条键盘输入命令,Linux 给与响应的方式,称之为交互式

在这里插入图片描述

我们想要获取计算机的数据,不可能每次都编写程序,编译后,再运行,再得到我们想要的,例如你想找到一个文件,可以先写一段 C语言的代码,然后调用系统函数,通过 gcc 编译后,运行程序才能找到文件。

因此有大牛开发出了 Shell 解释器,能够让我们方便的使用 Linux,例如只要敲下 ls - lh 这样的字符串,Shell 解释器就会针对这句话翻译,解释成 ls-l -h 然后执行 ,通过终端输出结果,无论是图形化或是命令行界面。

即使我们用的图形化,点点点的动作,区别也只是

  • 命令行操作,Shell 解释执行后,输出结果到黑屏命令行界面
  • 图形化操作,Shell 接受点击动作,输出图案数据

🦋 常见的 Shell 类型

  • Bash (Bourne Again Shell)
    最广泛使用的 Shell,是 GNU 项目的一部分,提供了丰富的功能和强大的脚本支持。
    默认的 Shell 为大多数 Linux 发行版和 macOS(直到 macOS Mojave)。
  • Sh (Bourne Shell)
    最早的 Unix Shell,是 Bash 的前身,功能相对简单。
  • Tcsh (C Shell)
    提供了类似于 C 语言的语法,适合熟悉 C 语言的用户。
  • Zsh (Z Shell)
    提供了许多高级功能,如自动补全、主题支持等,是 macOS Catalina 及以后版本的默认 Shell。
  • Fish (Friendly Interactive Shell)
    一个现代的 Shell,强调用户友好性和交互性,提供了智能的自动补全和语法高亮等功能。

二:🔥 什么是 Shell 脚本

🍫 当命令或者程序语句写在文件中,我们执行文件,读取其中的代码,这个程序文件就称之为 Shell 脚本

Shell 脚本里定义多条 Linux 命令以及循环控制语句,然后将这些 Linux 命令一次性执行完毕,执行脚本文件的方式称之为,非交互式方式,

  • windows 中存在 *.bat 批处理脚本
  • Linux 中常用 *.sh 脚本文件

Shell 脚本语言属于一种弱类型语言,无需声明变量类型,直接定义使用强类型语言,必须先定义变量类型,确定是数字、字符串等,之后再赋予同类型的值 centos7 系统中支持的 Shell 情况,有如下种类

# cat /etc/shells 
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
/usr/bin/tmux
/usr/bin/screen

Linux 默认 Shell

# echo $SHELL
/bin/bash

🦋 Shell 脚本规则

在 Linux 系统中,Shell 脚本或者称之为 (bash shell程序) 通常都是 vim 编辑,由 Linux 命令、bash shell 指令、逻辑控制语句和注释信息组成。

🦋 第一个 Shell 脚本

# vim test1.sh 
# cat test1.sh # 第一个 shell 脚本 这是注释
#!/bin/bashecho "hello world!"

运行 Shell 脚本

# bash test1.sh 
hello world!

🦋 Shebang

🐳 计算机程序中 Shebang 指的是出现在文本文件的第一行前两个字符 #!

  • 就是指明这个代码文件用哪个解释器去读

在 Unix 系统中,程序会分析 Shebang 后面的内容,作为解释器的指令,例如

  • #!/bin/bash 开头的文件,程序在执行的时候会调用 /bin/bash ,也就是 bash 解释器
  • 以 #!/usr/bin/python 开头的文件,代表指定python解释器去执行
  • 以 #!/usr/bin/env 解释器名称 ,是一种在不同平台上都能正确找到解释器的办法

注意事项:

  • 如果脚本未指定 Shebang ,脚本执行的时候,默认用当前 shell 去解释脚本,即 $SHELL。
  • 如果 Shebang 指定了可执行的解释器,如 /bin/bash /usr/bin/python ,脚本在执行时,文件名会作为参数传递给解释器
  • 如果 #! 指定的解释程序没有可执行权限,则会报错“bad interpreter: Permission denied”。
  • 如果 #! 指定的解释程序不是一个可执行文件,那么指定的解释程序会被忽略,转而交给当前的 SHELL 去执行这个脚本。
  • 如果 #! 指定的解释程序不存在,那么会报错 “bad interpreter: No such file or directory”。
  • #! 之后的解释程序,需要写其绝对路径 (如:#!/bin/bash),它是不会自动到 $PATH 中寻找解释器的。。
  • 如果你使用 “bash test.sh” 这样的命令来执行脚本,那么 #! 这一行将会被忽略掉,解释器当然是用命令行中显式指定的 bash。

🦋 脚本的常用执行方式

🦈 第一种:采用 bashsh + 脚本的相对路径或绝对路径(不用赋予脚本 +x 权限)

sh + 脚本的相对路径

$ sh helloworld.sh 
Helloworld

sh + 脚本的绝对路径

$ sh /home/zfox/datas/helloworld.sh 
helloworld

bash+脚本的相对路径

$ bash helloworld.sh 
Helloworld

bash + 脚本的绝对路径

$ bash /home/zfox/datas/helloworld.sh 
Helloworld

第二种:采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限 + x)

(a)首先要赋予 helloworld.sh 脚本的 + x权限

$ chmod 777 helloworld.sh

(b)执行脚本

相对路径(推荐使用)

$ ./helloworld.sh 
Helloworld

绝对路径

$ /home/zfox/datas/helloworld.sh 
Helloworld

注意:第一种执行方法,本质是 bash解析器 帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限

🦋 第二个 Shell 脚本:多命令处理

(1)需求: 在 /home/zfox/ 目录下创建一个 ljw.txt, 在 ljw.txt 文件中增加 I love ljw

(2)案例实操:

$ touch batch.sh
$ vim batch.sh

在 batch.sh 中输入如下内容

#!/bin/bashcd /home/zfox
touch ljw.txt
echo "I love ljw" >> ljw.txt

🦋 Shell 的优势

虽然有诸多脚本编程语言,但是对于 Linux 操作系统内部应用而言,Shell 是最好的工具,Linux 底层命令都支持 Shell 语句,以及结合三剑客 (grep、sed、awk) 进行高级用法。

  • 擅长系统管理脚本开发,如软件启停脚本、监控报警脚本、日志分析脚本

每个语言都有自己擅长的地方,扬长避短,达到高效运维的目的是最合适的

三:🔥 Shell 中的变量

  • 变量定义与赋值,注意变量与值之间不得有空格
name="zfox"变量名
变量类型,bash默认把所有变量都认为是字符串bash变量是弱类型,无需事先声明类型,是将声明和赋值同时进行
  • 变量替换写弓|用
# name="zfox带你学bash"# echo ${name}
zfox带你学bash# echo $name	# 可以省略花括号
zfox带你学bash
  • 变量名规则

    • 名称定义要做到见名知意,切按照规则来,切不得引用保留关键字(help检查保留字)
    • 只能包含数字、字母、下划线
    • 不能以数字开头
    • 不能用标点符号
    • 变量名严格区分大小写
  • 变量的作用域

    • 本地变量。只针对当前的 shell 进程

🦋 系统变量

1)常用系统变量

HOME、PWD、SHELL、USER等

2)案例实操

(1)查看系统变量的值

$ echo $HOME
/home/zfox

(2)显示当前 Shell 中所有变量:set

$ set
BASH=/bin/bash
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()

🦋 自定义变量

1.基本语法

(1)定义变量:变量=值

(2)撤销变量:unset 变量

(3)声明静态变量:readonly 变量,注意:不能unset

🦋 单引号 双引号区别

单引号变量,不识别特殊语法
双引号变量,能识别特殊符号
反引号,引用命令执行结果,等于 $() 用法

🌰 举例子:

# name="奥里给"
# echo ${name}
奥里给# 单引号
# name2='${name}'
# echo $name2
${name}# 双引号
# name2="${name}"
# echo $name2
奥里给

🦋 特殊变量

  • $?
    • 0 成功
    • 1-255 错误码

Shell 的特殊变量,用在如脚本,函数传递参数使用,有如下特殊的,位置参数变量

$0		获取shel1脚本文件名,以及脚本路径
$n		获取shel1脚本的第n个参数,n在1~9之间,如$1,$2,$9,大于9则需要写,${10},参数空格隔开
$#		获取执行的she11脚本后面的参数总个数
$*		获取she11脚本所有参数,不加引号等同于 $@ 作用,加上引号 "$*" 作用是 接收所有参数为单个字符串,"$1 $2.
$@		不加引号,效果同上,加引号,是接收所有参数为独立字符串,如"$1" "$2" "$3...,空格保留

🦋 特殊变量实践

#! bin/bash
# 注意单引号和双引号的区别
echo '特殊变量 $0 $1 $2 ... 的实践'
echo '结果: ' $0 $1 $2echo '############################'
echo '特殊变量$# 获取参数个数的总数'
echo '结果: ' $#echo '############################'
echo '特殊变量$* 实践'
echo '结果: ' $*echo '############################'
echo '特殊变量 $@ 实践'
echo '结果: ' $@
#! /bin/bash# $* 和 $@ 的区别
echo 'print each param from $*'
for var in "$*"
do echo "$var"
done
echo 'print each param from $@'
for var in "$@"
doecho "$var"
done
$*和$@的区别你了解吗?$*和 $@ 都表示传递给函数或脚本的所有参数当 $*和 $@ 不被双引号""包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数据,彼此之间以空格来分隔。
但是当它们被双引号""包含时,就会有区别了:"$*"会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。'yu chao 180 180 180 180""$@"仍然将每个参数都看作一份数据,彼此之间是独立的。
"chao'
"180"
"180"
"180"比如传递了 5个参数,那么对于"$*"来说,这 5 个参数会合并到一起形成一份数据,它们之间是无法分割的;而对于"$@"来说,这5 个参数是相互独立的,它们是 5 份数据。如果使用 echo 直接输出"$*""$@"做对比,是看不出区别的;但如果使用 for 循环来逐个输出数据,立即就能看出区别来。

🦋 Shell 变量面试题

问,如下输入什么内容

# cat test.sh
user1=`whoami`# sh test.sh
# echo $user1A.当前用户
B.zfox
c.空答案选c

`linux命令`
在 linux 中反引号,中的命令执行结果会被保留下来

# name=`ls`
# echo $name
test1.sh test2.sh test3.sh

解答:

  1. 每次调用 bash/sh 解释器执行脚本,都会开启一个子 shell,因此不保留当前的 shell 变量,通过 pstree 命令检查进程树
  2. 调用 source 或者 点符号,在当前 shell 环境加载脚本,因此保留变量

🦋 环境变量设置

环境变量一般指的是用 export 内置命令导出的变量,用于定义 shell 的运行环境、保证 shell 命令的正确执行。

shell 通过环境变量确定登录的用户名、PATH路径、文件系统等各种应用。

环境变量可以在命令行中临时创建,但是用户退出shell终端,变量即丢失,如要永久生效,需要修改环境变量配置文件

  • 用户个人配置文件 ~/.bash profile、 ~/.bashrc 远程登录用户特有文件
  • 全局配置文件 /etc/profile/etc/bashrc,且系统建议最好创建在 /etc/profile.d/,而非直接修改主文件,修改全局配置文件,影响所有登录系统的用户

🦋 检查系统环境变量的命令

  • set,输出所有变量,包括全局变量、局部变量
  • env,当前用户的所有环境变量,包括全局环境变量和局部环境变量
  • declare,输出所有的变量,如同 set
  • export,显示和设置环境变量值

🦋 撤销环境变量

  • unset 变量名,删除变量或函数

🦋 设置只读变量

  • readonly,只有shell结束,只读变量失效
直接readonly 显示当前系统只读变量# readonly name="超哥"
# name="chaochao"
-bash:name:只读变量

🦋 环境变量初始化与加载顺序

在这里插入图片描述

四:🔥 Shell 子串

🦋 bsah 一些基础的内置命令

echo
eval
exec
export
read
shift

echo 命令

-n 不换行输出
-e 解析字符串中的特殊符号\n 换行
\r 回车
\t 制表符 四个空格
\b 退格# echo 你真胖;echo 你还挺可爱你真胖
你还挺可爱# 不换行打印
# echo -n 你真胖;echo 你还挺可爱
你真胖你还挺可爱
# echo -n 你真胖;echo -n 你还挺可爱你真胖你还挺可爱 ## echo -e "我看你挺\n好的"
我看你挺
好的# printf
printf "你好\t我是\t吴彦祖"
你好		我是		吴彦祖

eval

执行多个命令

# eval ls;cd /tmp
del_data.sh 	hello.py 	special_var.sh 	t1.sh 
different.sh 	hello.sh 	nohup.out str1 	test.txt

exec

不创建子进程,执行后续命令, 且执行完毕后,自动 exit

#  exec date
Fri 25 Apr 2025 08:56:41 AM CSTConnection closed.Disconnected from remote host(Ubuntu-tencnt) at 08:56:41.

🦋 Shell 子串的花式用法

${变量}							返回变量值
${#变量}							返回变量长度,字符长度
${变量:start}					返回变量 offset 数值之后的字符
${变量:start:length}				提取 offset 之后的 length 限制的字符
${变量#word}						从变量开头删除最短匹配的 word 子串
${变量##word}					从变量开头,删除最长匹配的 word
${变量%word}					    从变量结尾删除最短的 word
${变量%%word}					从变量结尾开始删除最长匹配的 word
${变量/pattern/string}string 代替第一个匹配的 pattern
${变量//pattern/string)			用 string 代替所有的 pattern
# name="yuchao180'# echo $name
yuchao180
# echo ${name}
yuchao188# echo ${#name}
9# 截取子串的用法
# echo ${name:3}
hao180# echo ${name:5}
o180
#设置起点,以及元素长度
# echo ${name:2:4}
chao
  • 多种统计长度的命令
# echo $name
yuchao180# echo $name | wc -l
1
# echo $name |wc -L
9# 解释wc命令参数用法 -l 行数   -L 最长一行的长度
# cat test1.txt | wc -l
3
# cat test1.txt | wc -L
8 
  • 统计命令执行速度

字符串长度统计方式这么多,谁最快?
time 命令,统计命令执行时长
for 循环的 shell 编程知识语法

for number in {1..100}
doecho $number
done
写在一行的方法
for num in {1..100}; do echo $num; done
# 1.方法
# for n in {1..3}; do str1=`seg -s ":" 10`; echo $str1; done
1:2:3:4:5:6:7:8:9:10
1:2:3:4:5:6:7:8:9:10
1:2:3:4:5:6:7:8:9:10# 结合 time 命令 ${#变量} 计算时间是13s
# time for n in {1..10000}; do char=`seq -s "chaoge" 100`; echo ${#char} &>/dev/null; done
real  0m13.956s		实际运行的时间
user  0m6.005s		用户态执行的时间
sys   0m5.868s		内核态执行的时间# 使用 wc -L 命令计算时间
# time for n in {1..10000}; do char=`seq -s "chaoge" 100`; echo ${char} | wc-L &>/dev/null; done
real  0m49.262s		
user  0m18.843s		
sys   0m24.905s		# expr命令的 length 函数统计
# time for n in {1..10000}; do char=`seq -s "chaoge" 100`; expr length "${char}" &>/dev/null; done
real  0m28.511s		
user  0m11.960s		
sys   0m12.046s		

Shell 编程,尽量使用 linux 内置的命令,内置的操作,和内置的函数,C语言开发,效率最高,尽可能的减少管道符的操作

🦋 字符串截取

删除匹配到的子串

# name="I am chaoge"
# echo $name
I am chaoge# echo ${name:2:2}
am# echo ${name:3:5}
m cha# name2="abcABC123ABcabc"# #从开头匹配字符删除
# echo ${name2#a*c}
ABC123ABCabc# echo ${name2##a*c}# 利用%形式,从后向前匹配截取
# name2=abcABC123ABcabc# echo ${name2%a*c}
abCABC123ABC# echo ${name2%%a*c}# echo ${name2%%a*C}
abcABC123ABCabc# echo ${name2%a*C}
abcABC123ABCabc

替换字符串

# str1="Hello,man,i am your brother."
# echo $str1
Hello,man,i am your brother.# echo ${str1/man/boy}
Hello,boy,i am your brother.#多次匹配替换
# echo $str1
Hello,man,i am your brother.# echo ${str1/o/0}
HellO,man,i am your brother.# echo ${str1//o/O}
HellO,man,i am yOur brOther.

🦋 应用:批量修改文件名

创建一批文件

# touch chaochao_{1..5}_finished.jpg
# touch chaochao_{1..5}_finished.png

去掉剩下的所有 jpg 文件的 _finished 字符
编写 Shell 脚本如下:

#! /bin/bashfor file_name in `ls *fin*jpg`; do mv $file_name `echo ${file_name//_finished/}` ; done

🦋 特殊 Shell 扩展变量

如果parameter变量值为空,返回word字符串,赋值给result变量
result=${parameter:-word}如果para变量为空,则word替代变量值,且返回其值
result=${parameter:=word}如果para变量为空,word当作stderr输出,否则输出变量值
用于设置变量为空导致错误时,返回的错误信息
result=$fparameter:?word?如果para变量为空,什么都不做,否则word返回
result=${parameter:+word}

五:🔥 共勉

😋 以上就是我对 【Shell 脚本开发】入门全套教程 的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉
在这里插入图片描述

相关文章:

【Shell 脚本入门】轻松上手的实战指南

🌈 个人主页:Zfox_ 🔥 系列专栏:Shell脚本编程 目录 一:🔥 什么是 Shell 🦋 常见的 Shell 类型 二:🔥 什么是 Shell 脚本 🦋 Shell 脚本规则🦋 第…...

数据结构*栈

栈 什么是栈 这里的栈与我们之前常说的栈是不同的。之前我们说的栈是内存栈,它是JVM内存的一部分,用于存储局部变量、方法调用信息等。每个线程都有自己独立的栈空间,当线程启动时,栈就会被创建;线程结束&#xff0c…...

零基础制作Freertos智能小车(教程非常简易)持续更新中....

从现开始,将陆续推出各类简单的DIY电子设计,由简入深,将自己的制作过程全部分享出来,巩固自己知识的同时希望借此机会认识更多喜欢电子设计的小伙伴。 本次小车的主控芯片采用stm32f103c8t6,主要是便宜好用&am…...

Leetcode - 双周赛155

目录 一,3527. 找到最常见的回答二,3528. 单位转换 I三,3529. 统计水平子串和垂直子串重叠格子的数目四,3530. 有向无环图中合法拓扑排序的最大利润 一,3527. 找到最常见的回答 题目列表 本题是一道模拟题&#xff0…...

详解RabbitMQ工作模式之工作队列模式

目录 工作队列模式 概念 特点 应用场景 工作原理 注意事项 代码案例 引入依赖 常量类 编写生产者代码 编写消费者1代码 编写消费者2代码 先运行生产者,后运行消费者 先运行消费者,后运行生产者 工作队列模式 概念 在工作队列模式中&#x…...

QGIS+mcp的安装和使用

QGISmcp的安装和使用 安装qgis_mcp 下载qgis_mcp: git clone https://github.com/jjsantos01/qgis_mcp.git安装uv uv是一个由Rust语言编写的python包管理工具,旨在提供比传统工具(如 pip)更高效的依赖管理和虚拟环境操作。 p…...

Java基础361问第16问——枚举为什么导致空指针?

我们看一段代码 public enum Color {RED, BLUE, YELLOW;public static Color parse(String color) {return null;} }public static void main() {Color color Color.parse("");// 极具迷惑性,大家日常开发肯定这么写过switch (color) {case RED:break;c…...

在 C# .NET 中驾驭 JSON:使用 Newtonsoft.Json 进行解析与 POST 请求实战

JSON (JavaScript Object Notation) 已经成为现代 Web 应用和服务之间数据交换的通用语言。无论你是开发后端 API、与第三方服务集成,还是处理配置文件,都绕不开 JSON 的解析与生成。在 C# .NET 世界里,处理 JSON 有多种选择,其中…...

CentOS7——Docker部署java服务

1、安装Docker 首先要确保系统已安装 Docker,若未安装,可以参考我的另一篇文章现在CentOS7上安装Docker,文章地址如下: CentOS7系统安装Docker教程-CSDN博客 Docker当中要安装必备的软件,比如Java运行必要的JDK&#…...

Python-Part2-集合、字典与推导式

Python-Part2-集合、字典与推导式 1. set集合 ⽆序,去掉重复数据。 set1 {1,2,3,4,5,5,4,3,2,1}print(type(set1))print(set1)set2.add(66666)set2.remove(55)#不能使用下标访问set,所以修改操作一般为remove操作 add操作2.dict 字典 字典&#xff…...

《AI大模型应知应会100篇》第39篇:多模态大模型应用:文本、图像和音频的协同处理

第39篇:多模态大模型应用:文本、图像和音频的协同处理 摘要 随着人工智能技术的发展,多模态大模型(Multimodal Large Models)已经成为AI领域的热点之一。这些模型能够同时处理文本、图像、音频等多种模态数据&#xf…...

kvm学习小结

安装相关包 安装虚拟化相关包 apt install qemu-kvm qemu-system libvirt-clients libvirt-daemon-system vlan bridge-utils 安装界面相关包 apt install xinit gdmd 配置机器允许root登录 检查cpu是否支持虚拟化 egrep -o vmx|svm /proc/cpuinfo 执行命令systemctl s…...

k8s基本概念-YAML

YAML介绍 YAML是“YAML Aint a Markup Language” (YAML不是一种置标语言)的递归缩进写,早先YAML的意思其实是:“Yet Another Markup Language”(另一种置标语言) YAML是一个类似XML、JSON的标记性语言。YAML强调以数据为中心,并不是以标识语言为重点。因而YAML本身的定义…...

wps批注线条怎么取消去掉wps批注后有竖线

wps批注线条怎么取消去掉wps批注后有竖线 问题 图片 解决方案 图片 word批注线条取消的方法: 1.打开Word文档,点击需要删除的批注。 2.然后点击工具栏“审阅”选项。 3.接着点击“接受“ 4.接受对文档所做的所有修订(H)...

深度解析算法之分治(归并)

48.排序数组 题目链接 给你一个整数数组 nums,请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。 示例 1: 输入: nums [5,2,3,1] 输出&am…...

僵尸进程是什么?

僵尸进程(Zombie Process)是指在 Unix/Linux 系统中,一个子进程已经终止,但其父进程尚未对它进行善后处理(即没有读取其退出状态),导致子进程的进程表项仍然保留在系统中。由于这个进程已经结束…...

城市群出行需求的时空分形

城市群出行需求的时空分形 原文:He, Zhengbing. “Spatial-temporal fractal of urban agglomeration travel demand.” Physica A: Statistical Mechanics and its Applications 549 (2020): 124503. 1. Introduction(引言) 城市区域的重…...

LangChain入门(二)安装开发环境

1.安装conda Conda 是一个开源的软件包管理系统和环境管理系统,用于安装多个版本的软件包及其依赖关系,并在它们之间轻松切换。 Anaconda是一个开源的Python发行版本,其包含了conda、python等软件包,numpy、pandas、scipy等科学…...

如何开展有组织的AI素养教育?

一、AI素养的定义与核心内涵 AI素养是智能时代个体适应与创新能力的综合体现,其内涵随着技术发展动态扩展,包含以下核心维度: 知识体系:理解AI基本原理(如算法、数据、算力)、技术边界及发展趋势&#xff…...

InnoDB对LRU算法的优化

标准 LRU 算法的核心思想是:当缓存空间不足时,淘汰掉最近最少使用的数据块(Page)。它通常用一个链表来实现,链表头部是最近访问的 Page,链表尾部是最久未访问的 Page。 然而,在数据库系统中直接…...

云原生--核心组件-容器篇-7-Docker私有镜像仓库--Harbor

1、Harbor的定义与核心作用 定义: Harbor是由VMware开源的企业级容器镜像仓库系统,后捐赠给 CNCF (Cloud Native Computing Foundation)。它基于Docker Registry扩展了企业级功能,用于存储、分发和管理容器镜像(如Docker、OCI标准…...

TypeScript 实用类型深度解析:Partial、Pick、Record 的妙用

需求背景:在后台系统的用户管理模块中,我们常遇到这样的场景:修改用户资料时只需要传部分字段,展示用户列表时要隐藏敏感信息,快速查找用户需要ID索引等等,这些业务需求都可以通过 TypeScript 的实用类型优…...

【Pandas】pandas DataFrame rmod

Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象(如 DataFrame、Series 或标量)的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…...

如何搭建spark yarn 模式的集群集群

以下是搭建Spark YARN模式集群的一般步骤: 准备工作 - 确保集群中各节点安装了Java环境,并配置好 JAVA_HOME 环境变量。 - 各节点间能通过SSH免密登录。 - 安装并配置好Hadoop集群,YARN作为Hadoop的资源管理器,Spark YARN模式需要…...

云原生--核心组件-容器篇-6-Docker核心之-镜像仓库(公共仓库,私有仓库,第三方仓库)

1、Docker仓库的定义与核心作用 定义: Docker仓库(Docker Registry)是用于存储、分发和管理Docker镜像的集中式存储库。它类似于代码仓库,但专门用于容器镜像的版本控制和共享。它允许开发人员和IT团队高效地管理、部署和分享容器…...

mysql8.0版本部署+日志清理+rsync备份策略

mysql安装:https://blog.csdn.net/qq_39399966/article/details/120205461 系统:centos7.9 数据库版本:mysql8.0.28 1.卸载旧的mysql,保证环境纯净 rpm -qa | grep mariadb mariadb-5.... rpm -e --nodeps 软件 rpm -e --nodeps mariadb-5.…...

搭建spark yarn 模式的集群集群

一.引言 在大数据处理领域,Apache Spark 是一个强大的分布式计算框架,而 YARN(Yet Another Resource Negotiator)是 Hadoop 的资源管理系统。将 Spark 运行在 YARN 模式下,可以充分利用 YARN 强大的资源管理和调度能力…...

在uni-app中使用Painter生成小程序海报

在uni-app中使用Painter生成小程序海报 安装Painter 从GitHub下载Painter组件:https://github.com/Kujiale-Mobile/Painter 将painter文件夹复制到uni-app项目的components目录下 配置页面 在需要使用海报的页面的pages.json中配置 {"path": "pag…...

Uni-app网络请求AES加密解密实现

Uni-app 网络请求封装与 AES 加密解密实现 下面我将为你提供一个完整的 Uni-app 网络请求封装方案,包含 POST 请求的统一处理、请求参数和响应数据的 AES 加密解密。 1. 创建加密解密工具类 首先创建一个 crypto.js 文件用于处理 AES 加密解密: // u…...

uniapp实现统一添加后端请求Header方法

uniapp把请求写完了,发现需要给接口请求添加头部,每个接口去添加又很麻烦,uniapp可以统一添加,并且还能给某些接口设置不添加头部。 一般用于添加token登录验证信息。 在 main.js 文件中配置。 代码如下: // 在…...

uniapp打包apk如何实现版本更新

我们做的比较简单,在后端设置版本号,并在uniapp的config.js中定义版本号,每次跟后端的进行对比,不一致的话就更新。 一、下载apk 主要代码(下载安装包,并进行安装,一般得手动同意安装&#xf…...

【Java开发日记】OpenFeign 的 9 个坑

目录 坑一:用对Http Client 1.1 feign中http client 1.2 ribbon中的Http Client 坑二:全局超时时间 坑三:单服务设置超时时间 坑四:熔断超时时间 4.1 使用feign超时 4.2 使用ribbon超时 4.3 使用自定义Options 坑五&…...

RocketMQ 存储核心:深入解析 CommitLog 设计原理

一、引言 在分布式消息队列系统中,消息存储的可靠性和高吞吐能力是衡量系统优劣的核心指标。Apache RocketMQ 作为一款高性能、高可用的分布式消息中间件,其独特的 CommitLog 存储机制在消息持久化过程中扮演了关键角色。本文将深入剖析 CommitLog 的设…...

【C++ Qt】快速上手 显⽰类控件(Label、LCDNumber、ProcessBar、CalendarWidget)

每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论​: 本文围绕Qt中常用的显示类控件展开,重点讲解了 QLabel(文本/图片显示)、QLCDNumber(数字显示&#xff0…...

Docker和K8s面试题

1.Docker底层依托于linux怎么实现资源隔离的? 基于Namespace的视图隔离:Docker利用Linux命名空间(Namespace)来实现不同容器之间的隔离。每个容器都运行在自己的一组命名空间中、包括PID(进程)、网络、挂载…...

shell--数组、正则表达式RE

1.数组 1.1定义 什么是数组? 数组也是一种变量,常规变量只能保存一个值,数组可以保存多个值 1.2 分类 普通数组:只能用整数作为数组的索引--0 下标 有序数组(普通数组):(index)索引(为整数,从0开始) 关联数组:可以使用字符串作为数组的索引 1.3 普通数组 引用: ec…...

java 使用 POI 为 word 文档自动生成书签

poi 版本&#xff1a;4.1.0 <properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><…...

redis+lua+固定窗口实现分布式限流

用key的过期时间替代固定窗口的时间戳 -- KEYS[1]: 限流的key -- ARGV[1]: 限流窗口大小&#xff08;秒&#xff09; -- ARGV[2]: 限流阈值local key KEYS[1] local window tonumber(ARGV[1]) local limit tonumber(ARGV[2])-- 尝试获取当前计数 local current redis.call…...

什么是SQL92标准,有什么特点和影响?

一、SQL92简介 SQL92标准是1992年由美国国家标准协会&#xff08;ANSI&#xff09;和国际标准化组织&#xff08;ISO&#xff09;联合制定的数据库语言标准&#xff0c;正式名称为"SQL&#xff1a;1992"或ISO/IEC 9075:1992。他是关系型数据库管理系统&#xff08;R…...

Flink Checkpoint 与实时任务高可用保障机制实战

在实时数仓体系中,数据一致性和任务稳定性是核心保障。本文围绕 Flink Checkpoint 机制,深入讲解高可用保障的最佳实践和工程实现。 一、业务背景与痛点 在金融风控、营销实时推荐、智能监控等场景中,实时数仓的每一条数据都至关重要。常见的业务痛点包括: 断点恢复困难:…...

WebRtc08:WebRtc信令服务器实现

如何使用socket.io发送消息 发送消息 // 给本次连接发送消息 socket.emit()// 给某个房间内所有人发送消息 io.in(room).emit()// 除了自己以外&#xff0c;给某个房间的所有人发消息 socket.to(room).emit();// 除本连接外&#xff0c;给所有人发消息 socket.broadcast.emit…...

基于 SpringBoot 与 Redis 的缓存预热案例

文章目录 “缓存预热” 是什么&#xff1f;项目环境搭建创建数据访问层预热数据到 Redis 中创建缓存服务类测试缓存预热 “缓存预热” 是什么&#xff1f; 缓存预热是一种优化策略&#xff0c;在系统启动或者流量高峰来临之前&#xff0c;将一些经常访问的数据提前加载到缓存中…...

Python对比两张CAD图并标记差异的解决方案

以下是使用Python对比两张CAD图并标记差异的解决方案&#xff0c;结合图像处理和CAD结构分析&#xff1a; 一、环境准备与库选择 图像处理库&#xff1a;使用OpenCV进行图像差异检测、颜色空间转换和轮廓分析。CAD解析库&#xff1a;若为DXF格式&#xff0c;使用ezdxf解析实体…...

LINUX427 冒险位 粘滞位 chmod 权限

为什么不同用户能查看的文件夹不同 思索 是因为不同文件夹的权限不同吗&#xff1f;感觉不是 权限不就是只有rwx权限吗&#xff1f; o 对对对 和0GU有关 O 组内的其他用户应该 O是其他用户 不是组内用户 文件创建应该设置了r权限 但是root为什么看到的好像不一样 root 这些…...

10 DPSK原始对话记录

10 DPSK原始对话记录 前言 编程之余,在 Vscode 的 Cline 插件界面中和 ai (dpsk v3-0324) 聊起了天,得到了一个有意思的回答。就像ai有自我意识一样。在此记录。 实际对话内容 时间范围:2025-04-27 23:37:22 - 23:44:17 对话模式:PLAN MODE [23:37:22] 用户提问 “你…...

实现一个瀑布流布局

1、纯CSS实现 实现方式&#xff1a;借助column-count属性来创建 4 列的布局&#xff0c;并使用 column-gap 设置列间距。每个 .img-container 使用 break-inside: avoid 来防止图片被分割。 来看一下完整的代码&#xff1a; <!DOCTYPE html> <html lang"en&qu…...

Linux:进程间通信->共享内存

1. 共享内存的概念 System V共享内存&#xff0c;是一个高效的进程间通信IPC机制&#xff0c;允许多个进程共享同一块物理内存区实现快速的数据交换。如下图所示 这两个进程分别通过页表映射到这一块共享内存中 2. 共享内存的函数 shmget 功能&#xff1a; 创建新的共享内存…...

《Crawl4AI 爬虫工具部署配置全攻略》

《Crawl4AI 爬虫工具部署配置全攻略》 摘要 &#xff1a;在数据驱动的智能时代&#xff0c;高效爬虫工具是获取信息的关键。本文将为你详细解析 Crawl4AI 的安装配置全流程&#xff0c;从基础设置到进阶优化&#xff0c;再到生产环境部署&#xff0c;结合实用技巧与常见问题解…...

spring框架学习(下)

这章节讲的主要是spring在生产Bean对象时的过程 Spring实例化对象的基本流程 1、解析bean.xml 2、封装成BeanDifinition类 3、存放到BeanDIfinitionMap里 4、从BeanDIfinitionMap遍历得到bean 5、将bean存放到SingletonObjects 6、调用getBean方法得到bean 以下是简易的…...

进程与线程-----C语言经典题目(8)

一.什么是进程 定义&#xff1a; 进程指的是程序在操作系统内的一次执行过程。它不只是程序代码&#xff0c;还涵盖了程序运行时的各类资源与状态信息。包括创建、调度、消亡。 进程的状态&#xff08;ps -aux&#xff09;&#xff1a; 就绪状态&#xff1a;进程已经…...