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

SHELL脚本(Linux)

声明
学习视频来自 B 站UP主泷羽sec,如涉及侵权马上删除文章。

笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。

✍🏻作者简介:致力于网络安全领域,目前作为一名学习者,很荣幸成为一名分享者,最终目标是成为一名开拓者,很有趣也十分有意义
🤵‍♂️ 个人主页: @One_Blanks
欢迎评论 💬点赞👍🏻 收藏 📂加关注+

文章目录

    • shell脚本编写基础
      • 使用的脚本解析器/bin/bash(声明)
      • shell脚本的执行
        • 第一种方法给权限
        • 第二种方法直接使用解释器
        • 第三种方法使用source命令
      • shell脚本语法
        • 变量
          • 变量声明和定义
          • 变量拼接
          • 变量的命名规则
          • 变量的查看与删除
          • 常见的变量
          • 永久变量
        • 脚本程序传递参数怎么实现
        • 如何在编程中进行数学运算
          • shell中利用expr进行运算
        • 输入与输出
        • 函数的封装
        • 条件判断语句
          • 条件符号
        • 循环语句
        • 模块化编程
    • Linux进程操作
      • 查看寻找进程
      • 终止进程
      • 暂停与恢复进程
      • 后台运行
    • shell脚本编写(病毒编写)
      • 系统内存资源占用

shell脚本编写基础

使用的脚本解析器/bin/bash(声明)

#! /bin/bash
  • #! ,由 “#” 和 “!” 两个字符组成的特殊标记。当一个可执行文件以这两个字符开头时,内核会将该行的其余部分作为解释器的路径来读取,并使用该解释器来执行这个文件的后续内容。
  • /bin/bash 是指 bash解释器的路径。
  • 所以 #!/bin/bash 整体的意思就是指定这个脚本文件应该由 Bash 解释器来执行。

#! /bin/dash

#! /bin/sh

不管使用哪种脚本解释器最后还是调用的dash

shell脚本的执行

第一种方法给权限

是否拥有执行的权限,表示脚本是否可以进行执行

  • 使用ls -liah进行详细目录查看
  • 权限修改可以使用chmod 777 www.sh 用户、用户组、其他用户都给最高权限(读、写、执行)
第二种方法直接使用解释器
  • sh www.sh

  • bash www.sh

第三种方法使用source命令
  • source www.sh

    执行和sh命令差不多,就是这个命令对颜色加深标注

shell脚本语法

变量
变量声明和定义

eg:定义一个name变量,然后用echo打印出来

name=“xiaoyu”

age=27

echo $name

echo my name is $name,and my age is $age years old

echo “my name is $name,and my age is $age years old”

echo ‘my name is $name,and my age is $age years old’

  • 一般来说加双引号和不加的效果是一样的
  • 但是加单引号就不会解析变量直接输出所有字符串
变量拼接

echo “my name is $name,and my age is $ageyears old”

这个例子中years与age之间没有空格,所以打印出来为空,因为两个连起来系统会认为变量没有被定义,所以输出为空

  • 解决办法

echo “my name is n a m e , a n d m y a g e i s " name,and my age is " name,andmyageis"age"years old”

将变量用双引号括起来,这样就会做一个区分,系统就会识别出这是一个变量

除了用"",用{}花括号也是可以的

echo “my name is KaTeX parse error: Expected '}', got 'EOF' at end of input: …and my age is {age}years old”

变量的命名规则

变量由数字、字符、下划线组成,但是不能以数字开头

变量命名对于大小写是敏感的 如: man Man 就是两个变量

变量的查看与删除

set | grep name

  • 查看变量名为name的变量

unset name

  • 删除变量名为name的变量
常见的变量

echo $HOME

echo $PATH

  • 可以将我们写好的shell脚本移动到/usr/bin/目录下,让它存在变量中然后就可以直接运行使用

    vim 33.sh

    chmod +x 33.sh

    mv 33.sh /usr/bin/

    33.sh
    在这里插入图片描述

  • 也可以将一整个目录都添加到环境变量中去使一整个目录的文件都可以直接执行

    export PATH=/root:PATH

    然后输出变量PATH查看是否添加成功

    echo $PATH
    在这里插入图片描述

  • export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

    原有默认变量,当然也可以重启终端进行恢复

    • export 是一个用于设置环境变量的关键字,使变量在当前的shell终端中生效,重启一个终端设置的环境变量就会失效
永久变量

export写的只是临时变量,把变量写到配置文件中才是永久变量

cd /

usr/bin/vi .bashrc

export PATH=/root:PATH

加入之后使用source命令使变量生效

source usr/bin/ .bashrc

脚本程序传递参数怎么实现

echo 执行的文件名是:$0

echo 第一个参数是:$1

echo 传递的参数作为一个字符显示:$*

echo 传递的参数作为每个字符串显示:$@

echo 传递到脚本的参数个数是:$#

echo 最后命令的退出状态:$?

echo 脚本运行的当前进程ID:$$

  • 可以向脚本程序传递一个或多个参数,脚本中的$1,里面的数字是可以依次递增的,比如$1,$2,$3等
  • 执行结果
执行的文件名是:w.sh
第一个参数是:
传递的参数作为一个字符显示:
传递的参数作为每个字符串显示:
传递到脚本的参数个数是:0
最后命令的退出状态:0
脚本运行的当前进程ID:718191
  • 指定一个参数再执行

sh w.sh name

执行的文件名是:w.sh
第一个参数是:name
传递的参数作为一个字符显示:name
传递的参数作为每个字符串显示:name
传递到脚本的参数个数是:1
最后命令的退出状态:0
脚本运行的当前进程ID:719286
  • 指定多个参数

sh w.sh name sdf dfas

执行的文件名是:w.sh
第一个参数是:name
传递的参数作为一个字符显示:name sdf dfas
传递的参数作为每个字符串显示:name sdf dfas
传递到脚本的参数个数是:3
最后命令的退出状态:0
脚本运行的当前进程ID:719990

参数传递一般为 n ( n 表示数字可递增 ) 。 n(n表示数字 可递增)。 n(n表示数字可递增)*就是将参数作为同一的字符串显示出来,而 @ 是将每个字符串当作独立的字符串显示这也是 @是将每个字符串当作独立的字符串显示 这也是 @是将每个字符串当作独立的字符串显示这也是*和&@的区别,KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲表示参数的个数,?是查看命令执行状态的 如果显示为0 那么命令就是正常执行的,其他数字就是出错了,$$就是查看脚本当前进程的ID

如何在编程中进行数学运算
shell中利用expr进行运算

错误:expr 5+10 会回显 5+10

正确:expr 5 + 10 就会显示15了

以上方法适用于加法减法

乘法:

错误:expr 5 * 10 会报错

正确:expr 5 * 10 就会显示50了 需要使用\进行转义

除法:

正确:expr 10 / 5 会显示2

取余:

正确:expr 10 % 4 会显示2

  • 使用$(( ))语法

    product=$((num1 * num2))
    

​ 这样就直接进行运算了,不用去管什么转义字符什么的

输入与输出
  1. 输入
  • read name 输入一个值,并赋值给name
  • 赋值给name后需要使用$进行解析如$name
  1. 输出
  • echo 对于字符进行整行输出
  • printf 类似与C语言
printf "My name is %s and I am %d years old.\n" $name $age

前面""中需要有格式化符号,后面才是变量.

函数的封装
  1. 不含参数函数定义调用
greet () {echo "Hello, World!"
}

函数调用

#!/bin/bash
greet
  1. 含参函数定义调用
add_numbers () {sum=$(($1 + $2))echo "The sum of $1 and $2 is $sum"
}

函数调用

#!/bin/bash
add_numbers 3 5
  • 当然也可以存在rutern 返回值

  • $() 与 反引号``的异同

都可以用于获取指令结果,但建议使用$(),因为它可以嵌套,而反引号不支持。

条件判断语句
  1. if 语句基本结构
    • 在 Bash 编程中,if语句用于条件判断。基本结构如下:
if [ condition ]; then# 条件为真时执行的命令commands
fi
  • 其中,[ condition ]是条件表达式部分,;用于分隔条件表达式和then关键字(也可以将;换成换行)。then后面的commands是当条件为真时要执行的命令序列。
  • fi是一个关键字,用于标识if语句块的结束
  • 例如,判断一个变量是否大于 10:
#!/bin/bash
num=15
if [ $num -gt 10 ]; thenecho "$num is greater than 10"
fi
  • 这里的$num -gt 10是条件表达式,-gt是用于比较大小的操作符,表示 “大于”。当num的值大于 10 时,就会执行echo命令。
  • 除了只在条件为真时执行命令,还可以在条件为假时执行其他命令,这就用到了if - else语句。结构如下:
if [ condition ]; thencommands1
elsecommands2
fi
  • 例如,判断一个数是偶数还是奇数:
#!/bin/bash
num=7
if [ $((num % 2)) -eq 0 ]; thenecho "$num is even"
elseecho "$num is odd"
fi
  • 这里使用$((num % 2)) -eq 0作为条件表达式,%是取余运算,-eq是 “等于” 操作符。如果num除以 2 的余数为 0,则为偶数,执行echo偶数相关的命令;否则为奇数,执行echo奇数相关的命令。
  1. if - elif - else 语句
  • 当需要判断多个条件时,可以使用if - elif - else语句。结构如下:
if [ condition1 ]; thencommands1
elif [ condition2 ]; thencommands2
……
elsecommandsn
fi
  • 例如,根据分数范围输出等级:
#!/bin/bash
score=85
if [ $score -ge 90 ]; thenecho "A"
elif [ $score -ge 80 ]; thenecho "B"
elif [ $score -ge 70 ]; thenecho "C"
elif [ $score -ge 60 ]; thenecho "D"
elseecho "F"
fi
  • 这里依次判断分数是否大于等于 90、80、70、60,根据不同的范围输出相应的等级。如果分数小于 60,则输出F
条件符号
  • 数值比较操作符

    • -lt:小于。
    • -le:小于等于。
    • -eq:等于。
    • -ne:不等于。
    • -ge:大于等于。
    • -gt:大于。
  • 字符串比较操作符

    • = 或 ==:相等(在多数 Bash 环境下,不过 “==” 可能在某些版本中不被支持)。
    • !=:不相等。
    • -z:判断字符串长度是否为 0。
    1. if - else 语句
  • 文件判断使用到的参数
    -e 文件名 如果文件存在则为真
    -f 文件名 如果文件存在且为普通文件则为真
    -d 文件名 如果文件存在且为目录则为真
    -r 文件名 如果文件存在且可读则为真
    -w 文件名 如果文件存在且可写则为真
    -x 文件名 如果文件存在且可执行则为真
    -s 文件名 如果文件存在且至少有一个字符则为真
    -c 文件名 如果文件存在且为字符型特殊文件则为真
    -b 文件名 如果文件存在且为块特殊文件则为真

  • 条件判断使用到的逻辑操作符
    ①与 的表示方法:&&、-a

​ 要求所有条件为真,则条件为真

​ ②或 的表示方法:||、-o

​ 要求任意条件为真,则条件为真

​ ③非 的表示方法:!

​ 要求条件反转为真时,条件为真

循环语句
  1. for 循环
    • 基本语法:
      • for循环用于遍历一系列的值,通常是一个列表。基本格式为:
for variable in list; docommands
done
  • 其中variable是循环变量,用于依次存储list中的每个元素;list可以是一个用空格分隔的值列表、一个数组或者是一个由命令生成的结果集;commands是在每次循环中要执行的命令。
  • 遍历列表示例:
    • 例如,遍历一个数字列表并打印每个数字:
for number in 1 2 3 4 5; doecho $number
done
  • 这里number会依次取12345,并在每次循环中通过echo命令输出。
  • 遍历数组示例:
    • 假设定义了一个数组fruits,并使用for循环遍历它:
fruits=("apple" "banana" "cherry")
for fruit in "${fruits[@]}"; doecho $fruit
done
  • 在这个例子中,${fruits[@]}表示数组fruits的所有元素,fruit会依次取数组中的每个元素并输出。
  • 使用命令生成列表示例:
    • 可以使用命令的输出作为for循环的列表。例如,通过ls命令列出当前目录下的文件,并逐个打印文件名:
for file in $(ls); doecho $file
done
  • 不过要注意,这种方式如果文件名中有空格等特殊字符可能会出现问题,更安全的做法是使用while循环和read命令结合来处理有特殊字符的文件名。
  1. while 循环
  • 基本语法:
    • while循环在条件为真时持续执行命令块。基本格式为:
while [ condition ]; docommands
done
  • 其中[ condition ]是条件表达式,commands是每次循环要执行的命令。
  • 简单计数示例:
    • 例如,从 1 开始计数,直到数字达到 5:
count=1
while [ $count -le 5 ]; doecho $countcount=$((count + 1))
done
  • 在这里,count初始值为 1,每次循环判断count是否小于等于 5,如果是则打印count的值,然后将count的值加 1。当count大于 5 时,循环结束。
  • 读取文件内容示例:
    • 假设要逐行读取一个文件的内容,可以这样做:
while read line; doecho $line
done < file.txt
  • 这个循环会不断读取file.txt文件中的一行内容存储到line变量中,然后通过echo命令输出该行内容,直到文件结束。
  1. until 循环
  • 基本语法和特点:
    • until循环与while循环相反,它在条件为假时持续执行命令块,直到条件变为真。基本格式为:
until [ condition ]; docommands
done
  • 例如,计算从 1 加到某个数,直到总和大于等于 10:
sum=0
num=1
until [ $sum -ge 10 ]; dosum=$((sum + num))num=$((num + 1))
done
echo $sum
  • 在这里,开始时sum为 0,num为 1,每次循环将num累加到sum中,并将num加 1,直到sum大于等于 10,循环结束后输出sum的值。
  1. 循环控制语句
  • break 语句:用于立即跳出循环。例如,在for循环中,如果满足某个条件就跳出循环:
for i in 1 2 3 4 5; doif [ $i -eq 3 ]; thenbreakfiecho $i
done
  • 这个循环在i等于 3 时就会跳出,所以只会输出 1 和 2。
  • continue 语句:用于跳过当前循环的剩余部分,直接进入下一次循环。例如:
for i in 1 2 3 4 5; doif [ $i -eq 3 ]; thencontinuefiecho $i
done
  • i等于 3 时,continue语句会跳过echo命令,直接进入下一次循环,所以会输出 1、2、4、5。
模块化编程

就是在本脚本中调用其他脚本的函数,以此来实现模块化编程

#!/bin/bash
source update.sh
update $n1 $n1
echo$0文件中运行update.sh的函数update
  • $0是一个特殊的变量,它代表当前脚本的文件名。当脚本被执行时,$0会被自动赋值为脚本文件的名称。(类似与Windows系统dos编程中的%0
  • source是一个命令(也可以用 “.” 来代替,如 “.” filenamesource filename效果相同)。它的主要作用是在当前脚本环境中读取并执行另一个文件中的命令。(相当于文件包含

Linux进程操作

查看寻找进程

  1. ps 命令
    • 基本语法ps [options]。例如,ps -ef是最常用的查看进程的命令组合。-e选项表示显示所有进程,-f选项用于显示完整格式的信息。
    • 详细解释:它会列出进程的 UID(用户 ID)、PID(进程 ID)、PPID(父进程 ID)、C(CPU 使用率)、STIME(进程启动时间)、TTY(终端类型)、TIME(累计 CPU 时间)和 CMD(命令行)等信息。例如,在命令行输入ps -ef后,会看到类似如下的输出:
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 11:00?        00:00:01 /sbin/init
root         2     0  0 11:00?        00:00:00 [kthreadd]
  • 其他常用选项:
    • ps -aux:显示所有包含其他用户的进程,并且以 BSD 风格输出。其中a选项表示显示所有终端下的进程,包括其他用户的进程;u选项以用户为中心组织输出;x选项表示显示没有控制终端的进程。
  1. top 命令
  • 基本语法top。直接在命令行输入top后,会进入一个实时显示系统进程状态的界面。
  • 详细解释:它会按照 CPU 使用率、内存使用率等对进程进行排序,并动态更新。在这个界面中,可以看到系统的负载情况(load average),包括 1 分钟、5 分钟和 15 分钟的平均负载。每一行代表一个进程,显示的信息和ps -ef有一些重叠,如 PID、USER、PR(优先级)、NI(Nice 值)、VIRT(虚拟内存大小)、RES(物理内存大小)等。
  • 操作方式:在top界面中,可以通过按键来进行操作。例如,按P键可以按照 CPU 使用率排序进程,按M键可以按照内存使用率排序进程,按q键可以退出top界面。
  1. pgrep 命令
  • 基本语法pgrep [options] pattern。例如,pgrep -l firefox用于查找名称中包含firefox的进程并显示其 PID 和名称。
  • 详细解释:它是通过进程名称或者其他属性来查找进程的 PID。-l选项表示在输出中同时显示进程名称。如果只需要 PID,可以不使用-l选项。

终止进程

  1. kill 命令
    • 基本语法kill [signal] PID。例如,kill -9 1234表示强制终止 PID 为 1234 的进程。
    • 详细解释signal是发送给进程的信号,默认信号是TERM(15),它会请求进程正常终止。如果进程没有响应TERM信号,可以使用-9SIGKILL)信号来强制终止进程。不过,强制终止进程可能会导致数据丢失或系统不稳定,因为进程没有机会进行清理操作。
    • 注意:在使用kill -9时要谨慎,尽量先尝试使用默认的TERM信号来终止进程。
  2. pkill 命令
    • 基本语法pkill [options] pattern。例如,pkill -9 firefox用于强制终止所有名称中包含firefox的进程。
    • 详细解释:它是通过进程名称或者其他属性来终止进程,和pgrep命令类似,但是它的功能是终止进程而不是查找 PID。-9选项同样表示强制终止。

暂停与恢复进程

  • 暂停进程:可以使用kill -STOP PID来暂停一个进程。例如,kill -STOP 5678会暂停 PID 为 5678 的进程。此时,进程会暂停执行,并且不会占用 CPU 资源,直到收到恢复信号。
  • 恢复进程:使用kill -CONT PID来恢复一个被暂停的进程。例如,kill -CONT 5678会恢复之前被暂停的 PID 为 5678 的进程,使其继续正常运行。

后台运行

  1. 在后台运行进程
    • 方法一:命令后加 & 符号。例如,./long_running_script.sh &。这样,long_running_script.sh这个脚本就会在后台运行,命令行提示符会立即返回,用户可以继续在命令行进行其他操作。
    • 方法二:使用 nohup 命令nohup command &,例如nohup python my_script.py &nohup(no hang up)命令用于在用户退出登录后,进程仍然能够继续运行。它会将进程的输出重定向到nohup.out文件中(默认情况下)。
  2. 将后台进程恢复到前台
    • 基本语法fg %n。其中n是作业号。可以通过jobs -l命令来查看后台作业的作业号和 PID。例如,如果jobs -l显示后台作业的作业号为 1,PID 为 9876,那么fg %1就可以将这个后台作业恢复到前台运行。

shell脚本编写(病毒编写)

系统内存资源占用

#!/bin/bash
TOTAL_MEM=$(grep MemTotal /proc/meminfo | awk '{print $2}')
USE_MEM=$((TOTAL_MEM * 30 / 100))
USE_MEM_MB=$((USE_MEM / 1024))
while true;domemtester $USE_MEM_MB 1wait $!
done
  • TOTAL_MEM=$(grep MemTotal /proc/meminfo | awk '{print $2}')

  • grep MemTotal /proc/meminfo/proc/meminfo是 Linux 系统下一个虚拟文件,它包含了系统当前的内存信息。grep MemTotal命令用于在/proc/meminfo文件中查找包含 “MemTotal” 字样的行,该行记录了系统的总内存量信息。

  • awk '{print $2}'awk是一种文本处理工具。在这里,它用于从grep找到的包含 “MemTotal” 的行中提取第二个字段的值,也就是系统总内存量的值(以 KB 为单位)。最终将提取到的值赋给变量TOTAL_MEM

  • USE_MEM=$((TOTAL_MEM * 30 / 100))

使用算术扩展($((...)))来计算需要占用的内存量。它将变量TOTAL_MEM(系统总内存量,以 KB 为单位)乘以 30 再除以 100,得到的结果就是要占用的内存量(同样以 KB 为单位),并将这个结果赋给变量USE_MEM

  • USE_MEM_MB=$((USE_MEM / 1024))

再次使用算术扩展,将变量USE_MEM(以 KB 为单位的要占用的内存量)除以 1024,从而将其转换为以 MB 为单位的内存量,并将结果赋给变量USE_MEM_MB

  • memtester $USE_MEM_MB 1

使用memtester工具进行内存测试。$USE_MEM_MB是前面计算并转换得到的要占用的内存量(以 MB 为单位),1在这里可能是memtester工具要求的某个参数(比如可能表示测试的次数或者其他相关参数,具体取决于memtester的版本和使用方式)。这个命令会启动memtester对指定的内存量进行测试。

  • wait $!

  • $!是一个特殊的 Bash 变量,它表示最近在后台运行的命令的进程 ID(PID)。在这里,由于memtester命令刚刚在后台运行(因为memtachers通常会在后台执行内存测试操作),所以$!获取到的就是memtester的进程 ID。

  • wait命令用于等待指定的进程完成。在这里就是等待memtester的进程完成其内存测试操作,确保每次memtester测试都能完整执行完毕后再进入下一次循环。

为单位的要占用的内存量)除以 1024,从而将其转换为以 MB 为单位的内存量,并将结果赋给变量USE_MEM_MB

  • memtester $USE_MEM_MB 1

使用memtester工具进行内存测试。$USE_MEM_MB是前面计算并转换得到的要占用的内存量(以 MB 为单位),1在这里可能是memtester工具要求的某个参数(比如可能表示测试的次数或者其他相关参数,具体取决于memtester的版本和使用方式)。这个命令会启动memtester对指定的内存量进行测试。

  • wait $!

  • $!是一个特殊的 Bash 变量,它表示最近在后台运行的命令的进程 ID(PID)。在这里,由于memtester命令刚刚在后台运行(因为memtachers通常会在后台执行内存测试操作),所以$!获取到的就是memtester的进程 ID。

  • wait命令用于等待指定的进程完成。在这里就是等待memtester的进程完成其内存测试操作,确保每次memtester测试都能完整执行完毕后再进入下一次循环。

相关文章:

SHELL脚本(Linux)

声明 学习视频来自 B 站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 ✍&#x1f3fb;作者简介&#xff1a;致…...

单元测试、集成测试、系统测试、验收测试、压力测试、性能测试、安全性测试、兼容性测试、回归测试(超详细的分类介绍及教学)

目录 1.单元测试 实现单元测试的方法&#xff1a; 注意事项&#xff1a; 2.集成测试 需注意事项&#xff1a; 实现集成测试的方法&#xff1a; 如何实现高效且可靠的集成测试&#xff1a; 3.系统测试 实现系统测试的方法: 须知注意事项&#xff1a; 4.验收测试 实现验…...

低代码集成多方API的简单实现

在现代软件开发中&#xff0c;集成多个API服务提供商已成为常见需求。然而&#xff0c;不同的API认证机制和数据格式使得集成过程变得复杂且耗时。为了应对这些挑战&#xff0c;本文将介绍一种低代码解决方案&#xff0c;通过配置化管理和简化的代码逻辑&#xff0c;帮助开发者…...

【测试框架篇】单元测试框架pytest(1):环境安装和配置

一、pytest简介 Pytest是Python的一种单元测试框架&#xff0c;与Python自带的unittest测试框架类似&#xff0c;但是比 unittest框架使用起来更简洁&#xff0c;效率更高。 二、pytest特点 Pytest是一个非常成熟的Python测试框架,主要特点有以下几点&#xff1a; 非常容易…...

Python数据分析NumPy和pandas(二十九、其他Python可视化工具)

与其他开源工具一样&#xff0c;在 Python 中创建图形有很多选项&#xff08;太多了&#xff0c;无法一一列举&#xff09;。自 2010 年以来&#xff0c;主要开发工作集中在创建用于在 Web 上发布交互式图形上。例如&#xff1a; Altair、Bokeh 和 Plotly 等工具&#xff0c;可…...

Unity中HDRP设置抗锯齿

一、以前抗锯齿的设置方式 【Edit】——>【Project Settings】——>【Quality】——>【Anti-aliasing】 二、HDRP项目中抗锯齿的设置方式 在Hierarchy中——>找到Camera对象——>在Inspector面板上——>【Camera组件】——>【Rendering】——>【Pos…...

Spring Boot实现文件上传与OSS集成:从基础到应用

目录 前言1. 文件上传的基础实现1.1 前端文件上传请求1.2 后端文件接收与保存 2. 集成第三方OSS服务2.1 准备工作2.2 编写OSS集成代码2.3 修改Controller实现文件上传至OSS 3. 文件上传的扩展&#xff1a;多文件上传与权限控制结语 前言 随着互联网应用的快速发展&#xff0c;…...

Python学习26天

集合 # 定义集合 num {1, 2, 3, 4, 5} print(f"num&#xff1a;{num}\nnum数据类型为&#xff1a;{type(num)}") # 求集合中元素个数 print(f"num中元素个数为&#xff1a;{len(num)}") # 增加集合中的元素 num.add(6) print(num) # {1,2,3,4,5,6} # 删除…...

linux startup.sh shutdown.sh (kkFileView)

linux启动脚本和关闭脚本startup.sh shutdown.sh &#xff08;kkFileView&#xff09; startup.sh DIR_HOME("/opt/openoffice.org3" "/opt/libreoffice" "/opt/libreoffice6.1" "/opt/libreoffice7.0" "/opt/libreoffice7.1&q…...

[MySQL]隐式类型转换

安全等号 <> 如果有参数为NULL&#xff0c;则除了相等比较运算符()&#xff0c;比较的结果为null。对于 nullnull&#xff0c;结果为true。 在select语句中&#xff0c;使用 时&#xff0c;结果不会包含值为 null 的记录&#xff0c;但如果使用安全等号 <> 来…...

面经总结1

文章目录 如何保证批量请求失败&#xff0c;只弹出一个toast1使用计数器&#xff1a;2使用标志变量&#xff1a; 如何减少项目里的if-else1使用多态2使用策略模式3使用字典映射4使用状态模式 babel-runtime 作用是啥如何实现 PDF 预览和下载1浏览器内置PDF阅读器2使用PDF.js库3…...

Oracle19C AWR报告分析之Instance Efficiency Percentages (Target 100%)

Oracle19C AWR报告分析之Instance Efficiency Percentages 一、分析数据二、详细分析2.1 Instance Efficiency Percentages (Target 100%)各项指标及其解释2.2 分析和总结 一、分析数据 二、详细分析 在 Oracle AWR (Automatic Workload Repository) 报告中&#xff0c;每个性能…...

数据结构--数组

一.线性和非线性 线性&#xff1a;除首尾外只有一个唯一的前驱和后继。eg&#xff1a;数组&#xff0c;链表等。 非线性&#xff1a;不是线性的就是非线性。 二.数组是什么&#xff1f; 数组是一个固定长度的存储相同数据类型的数据结构&#xff0c;数组中的元素被存储在一…...

nrm的安装及使用

nrm的安装及使用 NRM&#xff08;NPM Registry Manager&#xff09;是一个用于快速切换npm&#xff08;Node Package Manager&#xff09;源的工具。npm是Node.js的包管理工具&#xff0c;用于安装、发布、管理Node.js包。由于网络原因&#xff0c;直接使用npm官方源&#xff…...

【MatLab手记】 --从0到了解超超超详过程!!!

文章目录 MatLab笔记一、命令行窗口二、变量命名规则三、数据类型1. 数字2. 字符与字符串3. 矩阵3.1 矩阵创建3.2 矩阵的修改和删除3.3 矩阵的拼接与重构重排3.4 矩阵的运算方法3.5 矩阵的下标 4. 元胞数组&#xff08;类似数据容器&#xff09;5. 结构体 四、逻辑与流程控制五…...

从零创建vue+elementui+sass+three.js项目

初始化&#xff1a; vue init webpack projectnamecd projectnamenpm install支持sass: npm install sass --save-dev npm install sass-loader7.1.0 --save-dev npm install node-sass4.12.0 --save-devbuild/webpack.base.conf.js添加 rules: [...,{test: /\.scss$/,loade…...

Linux通过使用scp和sftp发送或拉取文件

在通过 telnet 登录到远程服务器之后&#xff0c;你无法直接使用 telnet 发送文件。telnet 是一个纯文本协议&#xff0c;不支持文件传输。要发送文件&#xff0c;你需要使用其他工具&#xff0c;如 scp 或 sftp。以下是使用这两种工具发送文件的方法&#xff1a; 使用 scp 发…...

Jtti:服务器总是自动重启怎么办?

服务器总是自动重启可能是由于多种原因引起的&#xff0c;包括硬件故障、软件问题、配置错误或环境因素。以下是一些常见原因和相应的解决方案&#xff1a; 1. 硬件问题 电源故障&#xff1a;电源供应不稳定或电源模块故障可能导致服务器重启。 解决方案&#xff1a;检查电源供…...

北京大学c++程序设计听课笔记101

基本概念 程序运行期间&#xff0c;每个函数都会占用一段连续的内存空间。而函数名就是该函数所占内存区域的起始地址&#xff08;也称“入口地址”&#xff09;。我们可以将函数的入口地址赋给一个指针变量&#xff0c;使该指针变量指向该函数。然后通过指针变量就可以调用这个…...

一键生成本地SSL证书:打造HTTPS安全环境

一键生成本地SSL证书&#xff1a;打造HTTPS安全环境 日光下的寒林没有一丝杂质&#xff0c;空气里的冰冷仿佛来自故乡遥远的北国&#xff0c;带着一些相思&#xff0c;还有细微几至不可辨认的骆驼的铃声。–《心美&#xff0c;一切皆美》 在本地开发环境中启用 HTTPS 一直是许多…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

GraphRAG优化新思路-开源的ROGRAG框架

目前的如微软开源的GraphRAG的工作流程都较为复杂&#xff0c;难以孤立地评估各个组件的贡献&#xff0c;传统的检索方法在处理复杂推理任务时可能不够有效&#xff0c;特别是在需要理解实体间关系或多跳知识的情况下。先说结论&#xff0c;看完后感觉这个框架性能上不会比Grap…...