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

20分钟 Bash 上手指南

文章目录

    • bash 概念与学习目的
    • 第一个 bash 脚本
    • bash 语法
      • 变量的使用
      • 位置参数
      • 管道符号(过滤条件)
      • 重定向符号
      • 条件测试命令
      • 条件语句
      • case 条件分支
      • Array
      • for 循环
      • 函数
      • exit 关键字
    • bash 脚本
      • 记录历史命令
      • 查询文件
      • 分发内容


bash 概念与学习目的

bash(Bourne Again Shell)是一种广泛使用的 Unix/Linux Shell(命令行界面)。它是由 Brian Fox 为 GNU 项目开发的,是 Bourne Shell(sh)的增强版本,因此得名 “Bourne Again”。

Bash 是大多数 Linux 发行版(如 Ubuntu、CentOS)和 macOS 的默认 Shell,具有如 命令历史记录、管道、重定向、变量操作以及脚本编写能力

相比于 bash , Python 或是 Ansible 脚本更易读写,一般是更好的选择,但是学习 bash 只需要了解基础知识就在可以在生产环境中有更多的选择

bash 初级学习需要少量的 Linux command (vim、cat、echo等)与权限概念基础


第一个 bash 脚本

  1. 创建一个 bash 脚本
vim bash-demo1.sh
  1. 编写第一个 bash 脚本

脚本文件中写入以下内容

#!/bin/bash
echo Hello World!

其中,第一行注解告诉 Linux 操作系统采用哪一个 bash 解释器(默认选项,可省略),第二行会回显输出 Hello World

退出插入模式 :wq (或是键盘大写后按键 ZZ)保存退出

在这里插入图片描述

  1. 为脚本添加可执行权限

执行脚本首先需要先赋予脚本执行权限

ls -l ls 命令的 long 格式查看脚本是否具有执行权限

在这里插入图片描述

可以看到 root用户、root同组用户、其他用户 都没有 x - 执行权限

# 为当前用户添加执行权限
chmod u+x bash-demo1.sh
# 为所有用户添加执行权限
chmod +x bash-demo1.sh

在这里插入图片描述

作者的当前用户为 root ,可以看到 root 权限栏出现 x 执行权限

前三个字母为 root 用户读写执行权限,中间三个字母为 root同组用户读写执行权限、最后三个字母为其他用户的读写执行权限

  1. 执行 bash 脚本
./bash-demo1.sh
# 或是在不更改脚本执行权限的情况下
bash bash-demo1.sh

在这里插入图片描述


bash 语法

变量的使用

  • 变量在路径中的使用

此处编写一个可用于文件复制的 bash shell

#!/bin/bash
cp /home/fishpie/workspace/bash-shell/tempdir01/demo1.txt /home/fishpie/workspace/bash-shell/tempdir02/
cp /home/fishpie/workspace/bash-shell/tempdir02/demo2.txt /home/fishpie/workspace/bash-shell/tempdir01/CPfile.txt

可以发现当文件路较长时可读性很差,可以使用变量来解决这个问题

#!/bin/bash
# 变量
MY_LOCATION_FROM=/home/fishpie/workspace/bash-shell/tempdir01
MY_LOCATION_TO=/home/fishpie/workspace/bash-shell/tempdir02
# 显示变量
echo $MY_LOCATION_FROM
echo $MY_LOCATION_TO
# 使用变量
cp "$MY_LOCATION_FROM/demo1.txt" "$MY_LOCATION_TO/"
cp "$MY_LOCATION_TO/demo2.txt" "$MY_LOCATION_FROM/CPfile.txt"

对于变量的使用(引用)需要使用到 $

推荐使用 "" 包裹路径,如果变量的值(比如 $MY_LOCATION_TO 或 $MY_LOCATION_FROM)包含空格,Bash 会将空格视为参数的分隔符,导致命令解析错误


  • 读取输入的变量

读取用户输入,比如常见的 yum 安装软件包过程中的 Y/n 用户输入等需要用户交互的地方

读取用户输入并设置为变量的关键字为 read ,此处编写一个读取用户名称的脚本

#!/bin/bash
# 提示用户输入名字和姓氏
echo What is your first name?
read FIRST_NAME
echo What is your last name?
read LAST_NAME# 提示用户输入性别选择
echo "Are you male? (Y/n): "
read gender_choice# 根据用户输入判断性别并显示结果
if [ "$gender_choice" = "Y" ] || [ "$gender_choice" = "y" ]; thenecho "Name: $FIRST_NAME $LAST_NAME, Gender: Male"
elif [ "$gender_choice" = "N" ] || [ "$gender_choice" = "n" ]; thenecho "Name: $FIRST_NAME $LAST_NAME, Gender: Female"
elseecho "Invalid input! Please enter Y/y for male or N/n for female."
fi

在这里插入图片描述


位置参数

在 Linux command 中,所有命令的开头(0号位置,$0)是为 shell 本身保留,是脚本名称或解释器名称

在这里插入图片描述

如果我们想将参数等信息通过 空格 传入,则可以使用位置参数 $1$2$3

#!/bin/bashecho Hello $1 $2

在这里插入图片描述


管道符号(过滤条件)

管道符号 | 用于将一个命令的输出传递给另一个命令作为输入,是 Bash(及其他 shell)中的一种进程间通信机制

管道符号 | 会将左侧命令的标准输出(stdout)作为右侧命令的标准输入(stdin) (标准流)

  • 标准输出(stdout):命令执行后显示在终端的结果
  • 标准输入(stdin):命令从外部接收的数据(比如键盘输入或管道传递的数据)

管道的本质是:避免中间结果保存到文件,直接在内存中传递数据,提高效率

管道在内存中操作,效率高,但大量数据时可能会占用较多内存

右侧的命令必须能从 stdin 接收输入。例如,ls | cp 是无效的,因为 cp 不支持从 stdin 读取数据

示例:

# 查看本机网络中的 80 端口服务
netstat -tunlp | grep ":80"# 统计系统中正在运行的进程数量
ps aux | wc -l# 找出占用 CPU 最多的前 5 个进程
ps aux | sort -k 3 -nr | head -n 5# 查看系统中所有用户的唯一用户名并排序
cat /etc/passwd | cut -d: -f1 | sort | uniq

重定向符号

重定向符号 >>> 可以将命令的标准输出(stdout)或标准错误(stderr)从默认的终端重定向到文件或其他地方

和管道符号 | 都是非常常用的符号

  • > 将命令的输出写入指定文件,如果文件已存在,则覆盖原有内容
  • >> 将命令的输出追加到指定文件末尾,如果文件已存在,则不覆盖,而是在末尾添加内容
  • < 将文件内容作为命令的输入

在这里插入图片描述

示例:

# 统计当前目录中的所有 txt 文件
ls -l | grep "txt" >> txt_files.txt# 追加日期到日志文件
date +"%Y-%m-%d" >> log.txt# 清空文件
> something.txt# 统计文件行数
wc -l < file.txt# 将筛选出的 bash 进程信息保存到 processes.txt
ps aux | grep "bash" > processes.txt
  • 进阶用法

这里再次提到标准流

  • 标准输入(stdin,文件描述符 0):命令接收的数据,默认来自键盘
  • 标准输出(stdout,文件描述符 1):命令的正常输出,默认显示在终端
  • 标准错误(stderr,文件描述符 2):命令的错误信息,默认也显示在终端

示例1:

# 重定向标准错误,将标准错误重定向到标准输出的位置
ls tempdir03/ tempdir05/ 2>&1 > output.txt

在这里插入图片描述

如果不加入 &1 参数

ls tempdir03/ tempdir05/ 2> output.txt

在这里插入图片描述

可见不会显示错误信息

示例2:

在组合重定向时,顺序很重要

ls > file.txt 2>&1  # 正确
ls 2>&1 > file.txt  # 错误:stderr 不会进入 file.txt

条件测试命令

test 或者 [ ]空格是必须的,用于条件判断,通常与 if、while 等流程控制语句搭配使用,来检查文件状态、比较数值或字符串等

[ ] 的正式名称:test 命令,其实 [ ] 就是 test 命令的符号化

[ -f /etc/passwd ]
# 等价于
test -f /etc/passwd

在这里插入图片描述

echo $? 用于查看上一个命令的退出状态,输出 0 则为真,输出1 则为 假

常见用法与分类

  • 文件测试
测试选项含义示例
-e文件是否存在[ -e /etc/passwd ]
-f是否为普通文件(非目录)[ -f /etc/passwd ]
-d是否为目录[ -d /home ]
-r是否可读[ -r file.txt ]
-w是否可写[ -w file.txt ]
-x是否可执行[ -x script.sh ]
-s文件是否非空(大小大于 0)[ -s log.txt ]
# 判断 /etc/passwd 是否为一个文件
if [ -f /etc/passwd ]; thenecho "passwd file exists and is a regular file"
fi
  • 字符串比较
测试选项含义示例
= 或 ==字符串是否相等[ “$str” = “hello” ]
!=字符串是否不相等[ “$str” != “hello” ]
-z字符串是否为空[ -z “$str” ]
-n字符串是否非空[ -n “$str” ]
# 判断字符串是否相等
name="Alice"
if [ "$name" = "Alice" ]; thenecho "Hello, Alice!"
fi

【注】:变量需要用双引号 “$name” 包裹,避免变量为空时语法错误

例如:

var=""
[ $var = "" ]  # 出错,解析为 [ = "" ]
[ "$var" = "" ]  # 正确
  • 数值比较
测试选项含义示例
-eq等于[ 5 -eq 5 ]
-ne不等于[ 5 -ne 6 ]
-gt大于[ 10 -gt 5 ]
-lt小于[ 5 -lt 10 ]
-ge大于等于[ 10 -ge 10 ]
-le小于等于[ 5 -le 6 ]
# 判断年龄是否大于 18 岁
age=20
if [ "$age" -gt 18 ]; thenecho "You are an adult."
fi
  • 逻辑运算
操作符含义示例
-a与(AND)[ -f file.txt -a -r file.txt ]
-o或(OR)[ “ a g e " − g t 18 − o " age" -gt 18 -o " age"gt18o"age” -eq 18 ]
!非(NOT)[ ! -d /tmp ]

注意空格的使用!

# 判断 file.txt 是否为普通文件,是否有写权限
if [ -f file.txt -a -w file.txt ]; thenecho "file.txt exists and is writable"
fi

可能会注意到,如果遇到了需要正则表达式,如判断一个变量是否符合某个格式

Bash 中还有一个增强版 [[ ]],功能更强大,支持**正则匹配(=~)**等,且对未定义变量更宽容

# 检查 $var 是否为数字
[[ $var =~ ^[0-9]+$ ]]
# 正则匹配(=~)

条件语句

if elif else ,注意不是 elsif

与条件测试命令搭配使用

基本语法:

if [ 条件 ]; then# 条件为真时执行的代码
elif [ 条件 ]; then# 上一个条件为假,此条件为真时执行的代码
else# 所有条件都为假时执行的代码
fi

此处编写一个根据用户输入的数字判断其范围的脚本:

#!/bin/bashecho "Please enter a number: "
read numif [ "$num" -gt 0 ]; thenecho "$num is positive."
elif [ "$num" -lt 0 ]; thenecho "$num is negative."
elseecho "$num is zero."
fi

在这里插入图片描述

  • 多条件组合

使用逻辑运算符(如 -a、-o)或 &&、|| 组合条件

# 判断 85 分是一个什么样的等级
score=85
if [ "$score" -ge 90 ]; thenecho "Grade: A"
elif [ "$score" -ge 80 ] && [ "$score" -lt 90 ]; thenecho "Grade: B"
elif [ "$score" -ge 70 ]; thenecho "Grade: C"
elseecho "Grade: D"
fi
  • 嵌套结构

if 内部嵌套另一个 if ,特别注意脚本的结构问题

# 判断 25 岁是一个什么样的年龄
age=25
if [ "$age" -gt 18 ]; thenif [ "$age" -lt 30 ]; thenecho "Young adult"elseecho "Adult"fi
elseecho "Minor"
fi
  • 正则表达式作为判断条件
# 判断 名字是否以 F 开头
name="FISHPIE"
if [[ "$name" =~ ^F ]]; thenecho "Name starts with F"
elseecho "Name does not start with F"
fi

示例脚本:

  1. 用户输入输出处理
#!/bin/bashread -p "Enter Y/N: " choice
if [ "$choice" = "Y" ] || [ "$choice" = "y" ]; thenecho "Yes"
elif [ "$choice" = "N" ] || [ "$choice" = "n" ]; thenecho "No"
elseecho "Invalid input"
fi

在这里插入图片描述

  1. 文件检查
#!/bin/bashif [ -f "data.txt" ]; thenecho "File exists"
elif [ -d "data.txt" ]; thenecho "It's a directory"
elseecho "File does not exist"
fi

case 条件分支

case 语句是一种条件分支结构,类似于 if-elif-else,但它更适合处理多分支选择,尤其是需要根据变量值匹配多个模式时

基本语法:

case 表达式 in模式1)# 匹配模式1时执行的代码;;模式2)# 匹配模式2时执行的代码;;*)# 默认情况(可选);;
esac
  • case 表达式:指定要匹配的值(通常是变量)
  • in:开始模式匹配部分
  • 模式):定义匹配的模式,后面跟 )
  • ;;:表示该分支的代码结束,类似 break
  • *****:通配符,表示默认分支(当没有模式匹配时执行)
  • esac:case 的结束标志(case 反过来)

对格式的要求相对严格

示例:

  • 用户输入匹配
#!/bin/bashecho "Enter a fruit: "
read fruitcase "$fruit" in"apple")echo "You chose an apple.";;"banana")echo "You chose a banana.";;"orange")echo "You chose an orange.";;*)echo "Unknown fruit: $fruit";;
esac

在这里插入图片描述

  • 多模式匹配与命令结合
#!/bin/bash# case 中可以直接匹配命令的输出
case $(uname) in"Linux")echo "Running on Linux";;"Darwin")echo "Running on macOS";;*)echo "Unknown system: $(uname)";;
esac# 有限可写条件中的一种
echo "Enter a day (mon/tue/wed/etc): "
read daycase "$day" in"mon"|"tue"|"wed"|"thu"|"fri")echo "Weekday";;"sat"|"sun")echo "Weekend";;*)echo "Invalid day: $day";;
esac

在这里插入图片描述


Array

数组(Array) 是一种数据结构,用于存储多个有序的值(元素),这些值可以通过索引(下标)访问,虽然不如其他编程语言那样灵活强大,但也是 bash 中不可或缺的一部分

在这里插入图片描述

  • 数组的使用
# 直接赋值
array_name=(value1 value2 value3)
# 逐个赋值
array[0]="value1"
array[1]="value2"
array[2]="value3"# 获取数组长度
echo ${#array[@]}# 切片
array=(1 2 3 4 5)
echo ${array[@]:1:3}  # 从索引 1 开始,取 3 个元素

在这里插入图片描述


for 循环

用于逐个处理一组数据(如列表、数组、文件等)。它特别适合在已知迭代次数或需要遍历集合时使用

基本语法:

  1. 传统派:
for 变量 in 列表; do# 执行的代码
done
  1. 现代派:

在 Bash 3.0+ 中可以采用 C 语言风格编写,类似 C/C++ 的 for (i=0; i<5; i++)

for (( 初始值; 条件; 步进 )); do# 执行的代码
done

示例:

  • 批量复制数组中存在的文件
#!/bin/bashfiles=("file1.txt" "file2.txt" "file3.txt")for file in "${files[@]}"; doif [ -f "$file" ]; thenecho "$file exists, copying..."cp "$file" "/tmp/"elseecho "$file does not exist"fi
done
  • 通过直接遍历命令结果来查找当前目录下的 txt 文件
#!/bin/bashfor file in *.txt; doecho "Found TXT file: $file"
done

在这里插入图片描述

  • 检查多个主机是否在线
#!/bin/bashhosts=("192.168.1.1" "google.com" "8.8.8.8")for host in "${hosts[@]}"; doping -c 2 "$host" > /dev/nullif [ $? -eq 0 ]; thenecho "$host is online"elseecho "$host is offline"fi
done

ping -c 2 发送 2 个数据包,$? 检查命令退出状态

  • 批量生成文件
#!/bin/bashfor (( i=1; i<=3; i++ )); dotouch "file$i.txt"echo "Created file$i.txt"
done#或是
for i in {1..3}; dotouch "file$i.txt"echo "Created file$i.txt"
done

【注】:遍历列表中的元素如果带有 空格 则该元素需要使用 " " 包裹**


循环之间的比较

循环类型适用场景示例
for遍历列表、数组、范围for i in 1 2 3; do
while条件不确定时while [ $x -lt 5 ]; do
until条件为假时循环until [ $x -eq 0 ]; do

函数

在 Bash 脚本中,函数(Function) 是一种将一组命令封装成可重用代码块的方法。定义一个函数后,可以通过调用它的名称来执行其中的代码,并且可以传递参数给函数以增加灵活性

解耦合,模块化,精简代码

基本语法:

  1. 使用 function 关键字
function 函数名 {# 函数体
}
  1. 精简写法
函数名() {# 函数体
}

示例:

#!/bin/bashgreet() {echo "Hello,$1! You are $2 years old,The time now is $(date +"%Y-%m-%d")"
}# 调用函数并传递参数
greet "Tom" 21

在这里插入图片描述

  • 局部变量

默认情况,函数内的变量是全局的,可以用 local 关键字定义局部变量,避免污染外部环境

#!/bin/bashmy_function() {local name="$1"  # 局部变量echo "Inside function: $name"
}name="Global"
my_function "Local"
echo "Outside function: $name"

在这里插入图片描述

  • 返回值
  1. 当 Bash 函数没有直接返回值,则可以通过 return 返回退出状态(0~255,0表示成功)
#!/bin/bashcheck_number() {if [ "$1" -gt 0 ]; thenreturn 0  # 成功elsereturn 1  # 失败fi
}check_number 5
if [ $? -gt 0 ]; thenecho "Positive number"
elseecho "Non-positive number"
fi

$? 获取上一个命令(函数)的退出状态

  1. 通过 echo 返回值
#!/bin/bashadd() {
# 在 (()) 内计算 $1 + $2 的和
# 通过 $() 将计算结果捕获为字符串
# echo 将这个结果输出echo $(($1 + $2))
}# = 是用于判断字符串是否相同
# $() 将计算结果捕获为字符串
result=$(add 3 4)
echo "Sum is: $result"

在 (()) 内部,可以直接进行数学运算(如加减乘除),无需额外的命令(如 expr)

$1 + $2 表示将函数的第一个参数 $1 和第二个参数 $2 相加


exit 关键字

只需要记住: exit 命令会立即结束当前脚本的执行,并返回一个状态码给调用它的环境

退出状态码:

  • 0:表示成功(默认值)
  • 非0:表示失败或某种错误,通常由开发者定义具体含义
#!/bin/bashecho "Script starts"
exit
echo "This won't run"

在这里插入图片描述

  • 带状态码退出
#!/bin/bash# 检查是否提供了参数
if [ $# -ne 1 ]; thenecho "Usage: $0 <filename>"exit 1
fi# 获取传入的文件名参数
filename="$1"echo "Checking file: $filename"
if [ -f "$filename" ]; thenecho "File exists"exit 0  # 成功退出
elseecho "File not found"exit 1  # 失败退出
fi

在这里插入图片描述

$# 表示参数个数,-ne 1 表示 “不等于 1"

如果参数数量不对,提示用法并退出(状态码 1)

  • exit 与 return 的区别
特征exitreturn
作用范围终止整个脚本仅退出当前函数
使用场景脚本级别退出函数级别返回
状态码返回给父进程返回给调用函数的地方

推荐文章:

Linux常用工具(LTS)_linux lts-CSDN博客

Linux手记(LTS)_linux lts-CSDN博客


bash 脚本

记录历史命令

#!/bin/bashLOG_DIR="$HOME/command_logs"
LOG_FILE="$LOG_DIR/command_history.log"if [ ! -d "$LOG_DIR" ]; thenmkdir -p "$LOG_DIR" || { echo "Error: Failed to create directory"; exit 1; }
fi# 确保历史文件存在
HISTFILE=${HISTFILE:-"$HOME/.bash_history"}# 强制写入当前会话历史
history -atimestamp=$(date "+%Y-%m-%d %H:%M:%S")# 从 $HISTFILE 获取前 50 条命令
commands=$(tail -n 50 "$HISTFILE")if [ -z "$commands" ]; thenecho "No commands found in history file $HISTFILE."exit 1
fiecho "Logging commands at $timestamp:" >> "$LOG_FILE"
echo "$commands" | while IFS= read -r cmd; doecho "[$timestamp] $cmd" >> "$LOG_FILE"
doneecho "Commands logged to $LOG_FILE"
exit 0

命令执行日志

cat ~/command_logs/command_history.log

查询文件

根据指定模式查询所有已连接服务器中包含 xx 内容或名称的文件或目录

#!/bin/bash# 检查是否提供了搜索模式
if [ $# -lt 1 ]; thenecho "Usage: $0 <pattern> [content_search]"echo "  <pattern>: File or directory name pattern (e.g., '*.txt')"echo "  [content_search]: Optional, search for this string in file contents"exit 1
fi# 获取参数
pattern="$1"          # 文件或目录名称模式
content="$2"          # 可选的内容搜索字符串# 定义已连接的服务器列表(假设通过 SSH 访问)
servers=("server1.example.com" "server2.example.com" "server3.example.com")
# 替换为实际的服务器地址或从配置文件读取# 本地搜索路径(可根据需要修改)
search_path="/home/user"# 循环遍历每个服务器
for server in "${servers[@]}"; doecho "Searching on $server..."# 如果没有指定内容搜索,则只查找文件名或目录名if [ -z "$content" ]; thenssh "$server" "find $search_path -name \"$pattern\"" 2>/dev/nullelse# 如果指定了内容搜索,则查找文件并检查内容ssh "$server" "find $search_path -name \"$pattern\" -type f -exec grep -l \"$content\" {} +" 2>/dev/nullfi
doneecho "Search completed."
exit 0

$1:文件名或目录名的模式(如 *.txt)
$2(可选):文件内容中要搜索的字符串(如 xx)

servers 数组中列出目标服务器,需替换为实际地址
假设使用 SSH 访问,需配置免密登录

使用示例:

# 查找所有 .txt 文件
./search_servers.sh "*.txt"
# 查找包含 "xx" 的 .txt 文件
./search_servers.sh "*.txt" "xx"

分发内容

分发当前文件到指定服务器目录,可选择是否替换指定服务器原有的分发文件

#!/bin/bash# 检查参数数量
if [ $# -lt 2 ]; thenecho "Usage: $0 <file> <dest_path> [replace]"echo "  <file>: File to distribute"echo "  <dest_path>: Destination directory on servers (e.g., /home/user/files)"echo "  [replace]: 'yes' to replace existing files, omit or any other value for no"exit 1
fi# 获取参数
file="$1"          # 要分发的文件
dest_path="$2"     # 目标路径
replace="$3"       # 是否替换(yes 或其他)# 检查文件是否存在
if [ ! -f "$file" ]; thenecho "Error: File '$file' does not exist."exit 1
fi# 定义目标服务器列表
servers=("server1.example.com" "server2.example.com" "server3.example.com")
# 替换为实际服务器地址# 分发文件
for server in "${servers[@]}"; doecho "Distributing to $server..."# 检查目标路径是否已有同名文件if ssh "$server" "[ -f \"$dest_path/$(basename "$file")\" ]" 2>/dev/null; thenif [ "$replace" = "yes" ]; thenecho "Replacing existing file on $server..."scp "$file" "$server:$dest_path/" 2>/dev/nullelseecho "File exists on $server, skipping (use 'yes' to replace)."fielse# 文件不存在,直接分发scp "$file" "$server:$dest_path/" 2>/dev/nullif [ $? -eq 0 ]; thenecho "Successfully distributed to $server."elseecho "Failed to distribute to $server."fifi
doneecho "Distribution completed."
exit 0

$1:要分发的文件名
$2:目标服务器上的目录路径
$3(可选):yes 表示替换现有文件,否则跳过

servers 数组中列出目标服务器,需替换为实际地址
假设使用 SSH 访问,需配置免密登录

使用示例:

# 分发文件,不替换已有文件
./distribute_file.sh myfile.txt /home/user/files
# 分发文件并替换已有文件
./distribute_file.sh myfile.txt /home/user/files yes

相关文章:

20分钟 Bash 上手指南

文章目录 bash 概念与学习目的第一个 bash 脚本bash 语法变量的使用位置参数管道符号&#xff08;过滤条件&#xff09;重定向符号条件测试命令条件语句case 条件分支Arrayfor 循环函数exit 关键字 bash 脚本记录历史命令查询文件分发内容 bash 概念与学习目的 bash&#xff0…...

地铁站内导航系统:基于蓝牙Beacon与AR技术的动态路径规划技术深度剖析

本文旨在分享一套地铁站内导航系统技术方案&#xff0c;通过蓝牙Beacon技术与AI算法的结合&#xff0c;解决传统导航定位不准确、路径规划不合理等问题&#xff0c;提升乘客出行体验&#xff0c;同时为地铁运营商提供数据支持与增值服务。 如需获取校地铁站内智能导航系统方案文…...

WordPress R+L Carrier Edition sql注入漏洞复现(CVE-2024-13481)(附脚本)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...

滴水逆向_引用_友元函数_运算符重载

作业&#xff1a; 运算符号重载实现。 struct Person { public:int x;int y; public:Person(){this->x 10;this->y 20;}Person(int x, int y){this->x x;this->y y;}//申明友元函数void Printf(const Person& p){printf("%d %d",p.x,p.y);}/…...

git中,如何查看具体单个文件的log

在 Git 中&#xff0c;可以使用多种方式查看单个文件的提交日志&#xff08;Log&#xff09;&#xff0c;以下详细介绍不同场景下的查看方法&#xff1a; 目录 一、基本命令查看文件的完整提交日志 二、查看文件提交日志并显示差异内容 三、限制显示的提交日志数量 四、按…...

如何生成traceid以及可视化展示

根据你的需求&#xff0c;以下是一些可以生成唯一 traceId 并用于分布式链路追踪的工具和项目&#xff0c;这些项目支持生成唯一的 traceId&#xff0c;并将其用于日志记录和分布式追踪&#xff1a; 1. OpenTelemetry OpenTelemetry 是一个开源的观测框架&#xff0c;支持生成…...

2024 ICPC香港站 L.Flipping Paths的一种解法

太变态了&#xff0c;场上被硬控了两个小时&#xff0c;最后20分钟思路熬出来了但是没写对~&#xff0c;糖完了。怎么说呢&#xff0c;香港站这样的轻量级赛站&#xff0c;这次强队也很少&#xff0c;导致很多题目的难度升级了&#xff0c;这道L题是一道银牌题&#xff0c;不少…...

Uniapp 开发中遇到的坑与注意事项:全面指南

文章目录 1. 引言Uniapp 简介开发中的常见问题本文的目标与结构 2. 环境配置与项目初始化环境配置问题解决方案 项目初始化注意事项解决方案 常见错误与解决方案 3. 页面与组件开发页面生命周期注意事项示例代码 组件通信与复用注意事项示例代码 样式与布局问题注意事项示例代码…...

Python - 代码片段分享 - Excel 数据实时写入方法

文章目录 前言注意事项工具 pandas1. 简介2. 安装方式3. 简单介绍几个api 实战片段 - 实时写入Excel文件结束语 要么出众&#xff0c;要么出局 前言 我们在爬虫采集过程中&#xff0c;总是将数据解析抓取后统一写入Excel表格文件&#xff0c;如果在解析数据出现问题容易出现数据…...

一文详解U盘启动UEFI/Legacy方式以及GPT/MBR关系

对于装系统的老手而说一直想研究一下装系统的原理&#xff0c;以及面对一些问题时的解决思路&#xff0c;故对以前的方法进行原理上的解释&#xff0c;主要想理解其底层原理。 引导模式 MBR分区可以同时支持UEFI和Legacy引导&#xff0c;我们可以看一下微pe制作的启动盘&#…...

Java函数式接口的巧妙应用

引言 函数式接口&#xff08;Functional Interface&#xff09;是Java 8引入的一个重要概念&#xff0c;它是Lambda表达式和方法引用的基础。通过函数式接口&#xff0c;Java实现了对函数式编程的支持&#xff0c;让代码更加简洁、灵活。本文将带你深入理解函数式接口&#xf…...

爱普生SG-8101CE可编程晶振赋能智能手机的精准心脏

在智能手机高速迭代的今天&#xff0c;高性能、低功耗与小型化已成为核心诉求。智能手机作为人们生活中不可或缺的工具&#xff0c;需要在各种复杂场景下稳定运行。爱普生SG-8101CE可编程晶振凭借其卓越性能&#xff0c;成为智能手机中不可或缺的精密时钟源&#xff0c;为通信、…...

条件渲染

当if条件为true则会被显示出来&#xff0c;若为false则不会显示出来。 在App.vue中需要引用一下。 if else一样的if为真则显示if的内容&#xff0c;若不是则显示else下的内容。 多条件判断。 if在为false时&#xff0c;根本不会渲染&#xff0c;而show则会&#xff0c;只不过d…...

sklearn中的决策树-分类树:剪枝参数

剪枝参数 在不加限制的情况下&#xff0c;一棵决策树会生长到衡量不纯度的指标最优&#xff0c;或者没有更多的特征可用为止。这样的决策树 往往会过拟合。为了让决策树有更好的泛化性&#xff0c;我们要对决策树进行剪枝。剪枝策略对决策树的影响巨大&#xff0c;正确的剪枝策…...

算法随笔_59: 子数组最小乘积的最大值

上一篇:算法随笔_58: 队列中可以看到的人数-CSDN博客 题目描述如下: 一个数组的 最小乘积 定义为这个数组中 最小值 乘以 数组的 和 。 比方说&#xff0c;数组 [3,2,5] &#xff08;最小值是 2&#xff09;的最小乘积为 2 * (325) 2 * 10 20 。 给你一个正整数数组 nums …...

线性模型 - 支持向量机延伸

为了更好的理解支持向量机模型&#xff0c;本文我们延伸学习和理解一下和支持向量机相关的一些概念&#xff0c;这些概念都是偏理论和数学的知识&#xff0c;比较抽象和复杂&#xff0c;而且需要一定的高等数学知识。大家可以先明白其所包含的意义&#xff0c;然后逐步深入理解…...

力扣3464. 正方形上的点之间的最大距离

力扣3464. 正方形上的点之间的最大距离 题目 题目解析及思路 题目要求在points集合中找出k个点&#xff0c;k个点之间的最小的曼哈顿距离的最大值 最大最小值的题一般直接想到二分 将正方形往右展开成一条线&#xff0c;此时曼哈顿距离为两点直线距离**(仅起点右边的点)** …...

AI数字人源码搭建部署指南

为实现AI数字人的智能交互功能&#xff0c;需开发包含语音识别、自然语言处理、机器学习等技术的AI算法和模型。利用TensorFlow、PyTorch等深度学习框架完成模型训练。具体步骤包括以下四个方面&#xff1a; 需求分析&#xff1a;通过市场调研、用户访谈、专家咨询等方式&…...

智能拖把控制板开发

智能拖把控制板开发全流程解析 一、硬件架构与H桥驱动设计 工程师小明选用四颗AO3400A低导通电阻MOS管构建H桥驱动拓扑&#xff0c;实测全桥导通电阻仅15mΩ&#xff0c;较传统方案降低40%损耗。通过优化PCB布局将驱动环路电感控制在15nH以内&#xff0c;配合10kHz互补PWM信号…...

【Swift 算法实战】利用 KMP 算法高效求解最短回文串

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

【数字化转型+AI:现代企业腾飞的一对翅膀】

——解析数字时代的核心竞争力 在全球化竞争与技术迭代加速的今天&#xff0c;传统企业若想突破增长瓶颈&#xff0c;必须抓住两大核心驱动力&#xff1a;‌数字化转型‌与‌人工智能&#xff08;AI&#xff09;‌。这两大技术如同企业腾飞的双翼&#xff0c;共同构建敏捷性、创…...

Zabbix——踩坑HttpRequest,header添加无效

背景 在试图尝试通过Zabbix接入DeepSeek API的时候&#xff0c;由于使用了HTTP的方式&#xff0c;所以需要使用Zabbix 自带的HttpRequest库进行请求&#xff0c;产生了下面的问题 问题 curl curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completio…...

MTK Android12 预装apk可卸载

文章目录 需求解决方法1、device/mediatek/mt6761/device.mk2、/vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_removable_vendor_list.txt3、路径&#xff1a;4、Android.mk 需求 近期&#xff0c;客户需要预装一个apk&#xff0c;同时该apk要可卸载。解…...

让网页“浪“起来:打造会呼吸的波浪背景

每次打开那些让人眼前一亮的网页时&#xff0c;你是否有注意到那些看似随波逐流的动态背景&#xff1f;今天咱们不聊高深的技术&#xff0c;就用最朴素的CSS&#xff0c;来解锁这个让页面瞬间鲜活的秘籍。无需JavaScript&#xff0c;不用复杂框架&#xff0c;准备好一杯咖啡&am…...

YOLO11的单独推理程序

YOLO11的单独推理程序,可以实例化加载一次多次推理。 YOLO11的单独推理程序,可以实例化加载一次多次推理。 YOLO11的单独推理程序,可以实例化加载一次多次推理。 YOLO11的单独推理程序,可以实例化加载一次多次推理。 YOLO11的单独推理程序,可以实例化加载一次多次推理…...

代码随想录day21

669.修剪二叉搜索树 //理解修建后重建树的概念 TreeNode* trimBST(TreeNode* root, int low, int high) {if(root nullptr) return nullptr;if(root->val < low){TreeNode* node trimBST(root->right, low, high);return node;}if(root->val > high){TreeNod…...

利用Ai对生成的测试用例进行用例评审

利用AI对生成的测试用例进行用例评审,可以从用例的完整性、有效性、一致性等多个维度展开,借助自然语言处理、机器学习等技术,提高评审效率和准确性。以下为你详细介绍具体方法: 1. 需求匹配度评审 利用自然语言处理(NLP)技术 步骤:首先将软件需求文档和生成的测试用例…...

JAVAweb-JS基本数据类型,变量,DOM,pop,push函数,事件

JavaScript,可以嵌套在静态页面中添加一些动态语言. JavaScript是开发web脚本语言,但也被用到了很多非浏览器环境中,比如node平台 JS可以嵌套在静态页面中可以给静态页面添加一些动态效果(脚本语言),不同浏览器厂商(在浏览器中都有内置解析器解析JS语法) <!DOCTYPE html&g…...

SpringBoot源码解析(十一):准备应用上下文

SpringBoot源码系列文章 SpringBoot源码解析(一)&#xff1a;SpringApplication构造方法 SpringBoot源码解析(二)&#xff1a;引导上下文DefaultBootstrapContext SpringBoot源码解析(三)&#xff1a;启动开始阶段 SpringBoot源码解析(四)&#xff1a;解析应用参数args Sp…...

Python CNN基于深度学习的轴承故障智能检测平台

一、 项目概述 本项目旨在利用深度学习技术&#xff0c;构建一个基于Python的轴承故障智能检测平台。该平台能够对轴承的振动信号进行分析&#xff0c;自动识别轴承的健康状态&#xff0c;并判断故障类型&#xff0c;从而实现轴承故障的早期预警和诊断&#xff0c;提高设备的运…...

CCNP知识笔记

路由选路原理 路由信息来源 路由信息怎么来的&#xff1f; 直连路由&#xff08;C&#xff09;&#xff1a; 通过直连接口UP产生智联路由条目&#xff08;物理层UP数据链路层UP&#xff09; 静态路由&#xff08;S&#xff09;&#xff1a; 通过网络管理员逐条写入的路由条…...

递归树求解递归方程

*递归树是迭代计算模型 *递归树的生成过程与迭代过程一致 *根据递归定义不断扩展递归树&#xff0c;直到边界条件&#xff08;其值已知&#xff09; *对递归树产生的所有项求和就是递归方程的解 例一&#xff1a; T(n) 1 n1 T(n) 2T(n/2) n n>1 对于…...

2025年【熔化焊接与热切割】找解析及熔化焊接与热切割模拟试题

在当今工业领域&#xff0c;熔化焊接与热切割技术作为重要的加工手段&#xff0c;广泛应用于各种金属结构的制造与维修中。然而&#xff0c;这些作业过程伴随着高风险&#xff0c;对从业人员的安全知识和技能提出了极高的要求。为了提升相关人员的安全意识和操作技能&#xff0…...

Linux系统:服务器常见服务默认IP端口合集

服务器的默认IP端口取决于所使用的协议和服务类型。以下是一些常见服务和协议的默认端口&#xff1a; 服务端口实例&#xff1a; HTTP服务 默认端口&#xff1a;80 说明&#xff1a;用于普通的HTTP网页访问。例如&#xff0c;访问 http://example.com 时&#xff0c;默认使用8…...

LangChain教程 - RAG - PDF摘要

系列文章索引 LangChain教程 - 系列文章 随着人工智能和大语言模型&#xff08;LLM&#xff09;的快速发展&#xff0c;越来越多的工具和平台被引入以简化我们的日常任务。LangChain是一个非常强大的框架&#xff0c;它能够帮助开发者构建与LLM&#xff08;如OpenAI、Ollama等…...

[java基础-JVM篇]3_JVM类加载机制

摘要&#xff1a;JVM通过设立不同优先级和职责的加载器保证了类加载的安全性与灵活性&#xff0c;即双亲委派机制&#xff0c;但是实际生产中更复杂的需求又需要破坏双亲委派&#xff0c;即打破JVM约定过的类加载程序 目录 类的生命周期 类加载 加载 类加载器 双亲委派机制…...

相似性搜索(2)

在本篇中&#xff0c;我们通过播客相似性搜索为例&#xff0c;进一步研究基于chroma 的相似性搜索&#xff1a; 参考&#xff1a; https://www.kaggle.com/code/switkowski/building-a-podcast-recommendation-engine/notebook 数据集来源&#xff1a; https://www.kaggle.…...

Linux 本地部署 Deepseek-R1 大模型!

DeepSeek-R1 的发布&#xff0c;掀起了一场风暴&#xff01; 开源、强大、本地可部署&#xff0c;真正私有的 AI 助手&#xff0c;不受网络、隐私等限制&#xff0c;数据安全感直接拉满&#xff01; 今天&#xff0c;手把手带你在 Linux 上本地部署 DeepSeek-R1&#xff0c;关…...

软件测试高频面试题

以下是一些软件测试高频面试题&#xff1a; 基础概念类 HTTP和HTTPS的区别&#xff1a;HTTPS使用SSL/TLS协议对传输数据加密&#xff0c;HTTP没有加密&#xff1b;HTTPS可确保数据完整性&#xff0c;防止传输中被篡改&#xff0c;HTTP不保证&#xff1b;HTTP默认用80端口&…...

光明谷推出AT指令版本的蓝牙音箱SOC 开启便捷智能音频开发新体验

前言 在蓝牙音箱市场竞争日益激烈的当下&#xff0c;开发一款性能卓越且易于上手的蓝牙音箱&#xff0c;成为众多厂商追求的目标。而光明谷科技有限公司推出的 AT 指令版本的蓝牙音箱 SOC&#xff0c;无疑为行业带来了全新的解决方案&#xff0c;以其诸多独特卖点&#xff0c;迅…...

数据安全_笔记系列01:数据分类分级与敏感数据识别详解

数据安全_笔记系列01&#xff1a;数据分类分级与敏感数据识别详解 1)、数据分类分级与敏感数据识别详解 数据分类分级是数据安全治理的核心环节&#xff0c;旨在根据数据的敏感性和重要性&#xff0c;制定差异化的保护策略。以下从 定义、法规、方法、工具、案例 等维度全面解…...

SOUI基于Zint生成UPC码

UPC 码&#xff08;Universal Product Code&#xff0c;通用产品代码&#xff09;是一种广泛使用的条形码系统&#xff0c;主要用于零售商品的标识和追踪。有两种主要格式&#xff1a;UPC-A 和 UPC-E。 UPC-A 长度12位数字。适用于大型商品 UPC-E 长度8位数字。UPC-E是UPC-A…...

MySQL 主从同步延迟:原因剖析与解决之道

在现代数据库应用中&#xff0c;MySQL 的主从同步是一种常见且重要的架构模式&#xff0c;它能提供数据备份、读写分离等诸多优势&#xff0c;有效提升系统的可用性和性能。然而&#xff0c;主从同步延迟问题却常常困扰着数据库管理员和开发者&#xff0c;严重时甚至会影响业务…...

C语言数据结构—二叉树的链式结构实现

目录 1、建立二叉树 1.1 二叉树的结构 1.2 手动建立二叉树 2、二叉树的遍历 2.1 二叉树的三种遍历方式 2.1.1 前序遍历 2.1.2 中序遍历 2.1.2 后序遍历 3、求二叉树的结点数和二叉树的高度 3.1 求二叉树结点数 3.2 求二叉树叶子结点 3.3 求二叉树第k层结点的个数 …...

sysbench压测pgsql数据库 —— 筑梦之路

这里主要使用sysbench工具对Pgsql数据库进行基准测试。 1. 创建数据库和用户名 # 创建用户和数据库CREATE USER sysbench WITH PASSWORD 123456;CREATE DATABASE sysbench owner sysbench;# 给用户授权访问 vim pg_hba.confhost sysbench sysbench 127…...

超级详细Spring AI运用Ollama大模型

大模型工具Ollama 官网:https://ollama.com/ Ollama是一个用于部署和运行各种开源大模型的工具; 它能够帮助用户快速在本地运行各种大模型&#xff0c;极大地简化了大模型在本地运行的过程。用户通过执行几条命令就能在本地运行开源大模型&#xff0c;如Lama 2等; 综上&#x…...

CF934B A Prosperous Lot

算法&#xff1a;贪心 rating : 1200 思路&#xff1a; 题目要求输出的数不能超过10^18&#xff1b; 10^18共有19位&#xff0c;那么不超过范围的前提下最多能输出几个环呢&#xff1f; 环最多为2个&#xff0c;也就是数字8&#xff0c;不超过数据范围的情况下能输出18个8…...

四步彻底卸载IDEA!!!

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 大家好&#xff0c;我们今天来学习四步彻底卸载IDEA&#xff01;&#xff01;&#xff01; 首先我要提醒各位 如果你想删除 IDEA 相关&#xf…...

基于Spring Boot的健康医院门诊在线挂号系统设与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

快速搭建SOCKS5代理服务器教程(一键多ip脚本)

文章目录 前言环境要求一、先看效果二、使用一键脚本总结 前言 华为云服务器一键搭建一拖10 或者20 ip 脚本 环境要求 操作系统&#xff1a;CentOS 7.8服务器&#xff1a;建议至少1核1G配置云服务器 可多ip 搭建一键输出 一、先看效果 二、使用一键脚本 yum install -y wge…...