Linux 入门到精通,真的不用背命令!零基础小白靠「场景化学习法」,3 个月拿下运维 offer,第二十五天

三、Shell脚本编程

Shell脚本语言的运算

 算数运算

shell支持算术运算,但只支持整数,不支持小数

 Bash中的算术运算
-- + 加法运算
-- - 减法运算
-- * 乘法运算
-- / 除法运算
-- % 取模,即取余数
-- ** 乘方 
​
#乘法符号在有些场景需要转义
实现算术运算
1. let var=算术表达式
2. var=$[算术表达式]
3. var=$((算术表达式))
4. var=$(expr arg1 arg2 arg3 ...)
5. declare -i var = 数值
6. echo '算术表达式' | bc  (支持浮点数)

实例:使用bc计算小数和declare -i计算

[root@localhost ~]# echo "scale=3;20/3"|bc
6.666
[root@localhost ~]# echo "scale=3;2/3"|bc
.666
[root@localhost ~]# i=20
[root@localhost ~]# j=20
[root@localhost ~]# declare -i sum=i*j
[root@localhost ~]# echo $sum
400

内建的随机数生成器变量:

$RANDOM  取值范围:0-32767

实例:生成0-49之间的随机数

[root@localhost ~]# echo $[$[$RANDOM%50]+1]
40
[root@localhost ~]# echo $[$RANDOM%50]
44
[root@localhost ~]# echo $[$[$RANDOM%50]+1]  #生成1~50之间的随机数
[root@localhost ~]# echo $[RANDOM % 100 + 1]

实例:生成随机颜色字符串

[root@localhost ~]# echo -e "\033[1;$[RANDOM%7+31]mStudy\033[0m"
Study
[root@localhost ~]# echo -e "\033[1;$[RANDOM%7+31]mStudy\033[0m"
Study
[root@localhost ~]#
增强型赋值:
+= 
i+=10 <==> i=1+10
-=
i-=j  <==> i=i-j
*=
/=
%=
++ 
i++,++i <==> i=i+1 (自增)
--
i--,--i <==> i=i-1 (自减)

格式:

let varOPERvalue

实例:自增,自减

[root@localhost ~]# let var+=1
[root@localhost ~]# echo $var
1
[root@localhost ~]# let var++
[root@localhost ~]# echo $var
2
[root@localhost ~]# let var-=1
[root@localhost ~]# echo $var
1
[root@localhost ~]# let var--
[root@localhost ~]# echo $var
0
[root@localhost ~]#
​
[root@localhost ~]# unset i j ;i=1;let j=i++;echo "i=$i,j=$j" 
i=2,j=1
[root@localhost ~]# unset i j ;i=1;let j=++i;echo "i=$i,j=$j"
i=2,j=2
[root@localhost ~]# 
​
# i++ 与 ++i的区别:
i++ 先赋值再运算
++i 先运算再赋值
​

实例:鸡兔同笼问题

[root@localhost ~]# vim shell/chicken.sh
#!/bin/bash
HEAD=35
FOOT=94
​
RABBIT=$(((FOOT-HEAD-HEAD)/2))
CHOOK=$[35-RABBIT]
echo "兔子的数量为:"$RABBIT
echo "鸡的数量为: "$CHOOK[root@localhost ~]# chmod +x shell/chicken.sh 
[root@localhost ~]# shell/chicken.sh 
兔子的数量为::12
鸡的数量为:23
[root@localhost ~]# 
​
# 在脚本中写入变量,让用户在命令行写入需要计算的数值
[root@localhost ~]# vim shell/chicken.sh
#!/bin/bash
HEAD=$1
FOOT=$2
​
RABBIT=$(((FOOT-HEAD-HEAD)/2))
CHOOK=$[35-RABBIT]
echo "兔子的数量为:"$RABBIT
echo "鸡的数量为: "$CHOOK[root@ansible-salve1 ~]# ./chicken.sh 30 80
兔子的数量为:10
鸡的数量为: 25
[root@ansible-salve1 ~]# 

面试题:计算出所有人的年龄总和

[root@ansible-salve1 shell]# vim nianling.txt
[root@ansible-salve1 shell]# cat nianling.txt
a=20
b=18
c=22
[root@ansible-salve1 shell]# cut -d"=" -f2 nianling.txt 
20
18
22
[root@ansible-salve1 shell]# cut -d"=" -f2 nianling.txt | tr '\n' + | grep -Eo ".*[0-9]" | bc
60
[root@ansible-salve1 shell]# grep -Eo "[0-9]+" nianling.txt 
20
18
22
[root@ansible-salve1 shell]# grep -Eo "[0-9]+" nianling.txt | tr '\n' +| grep -Eo ".*[0-9]" | bc
60
[root@ansible-salve1 shell]# 
逻辑运算

True用数字表示1,False用数字表示0

与:&

1 与 1 = 1   
1 与 0 = 0
0 与 1 = 0
0 与 0 = 0

或:|

1 或 1 = 1
1 或 0 = 1
0 或 1 = 1
0 或 0 = 0

非:!

!1 = 0  !True=False
!0 = 1  !False=True

异或:^

#异或的两个值,相同为假,不同为真
1 ^ 1 =0
1 ^ 0 =1
0 ^ 1 =1
0 ^ 0 =0

条件测试命令
条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成测试过程,实现评估布尔声明,以便在条件性环境下进行执行。

若真,则状态码变量$?返回0

若假,则状态码变量$?返回1

扩展: [ ] 与 [[ ]] 的区别
 

`区别1:
[ ]是符合POSIX标准的测试语句,兼容性强,几乎可以运行在所有的Shell解释器中
[[ ]]仅可运行在特定的几个Shell解释器中(如Bash)
​
`区别2:
> < 可以在[[ ]]中使用ASCII码顺序进行排序,而[]不支持
​
`区别3:
在[ ]中使用-a 和 -o 表示逻辑与和逻辑或,[[ ]]使用&& 和 || 表示,[[ ]]不支持-a
​
`区别4:
在[ ]中==是字符匹配,在[[ ]]中==是模式匹配
​
`区别5:
[ ]不支持正则匹配,[[ ]]支持用=~进行正则匹配
​
`区别6:
[ ]仅在部分Shell中支持用()进行分组,[[ ]]均支持
​
`区别7:
在[ ]中如果变量没有定义,那么需要用双引号引起来,在[[ ]]中不需要
————————————————
版权声明:本文为CSDN博主「小白银子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiaobaiyinzi/article/details/151069124
条件测试命令及其语法

语法1:test <测试表达式> 说明:test命令和<测试表达式>之间至少有一个空格

# 在shell中,大于用 -gt 表示,小于用 -lt 表示,大于或等于用 -ge 表示,小于或等于用 -le表示 ,不相等用-ne 表示
[root@ansible-salve1 ~]# test 1 -lt 2
[root@ansible-salve1 ~]# echo $?
0
[root@ansible-salve1 ~]# test 2 -lt 1
[root@ansible-salve1 ~]# echo $?
1
[root@ansible-salve1 ~]#

语法2:[<测试表达式>] 说明:该方法和test命令的用法一样,[]的两边和内容之间至少有一个空格

[root@ansible-salve1 ~]# [ 1 -gt 3 ]
[root@ansible-salve1 ~]# echo $?
1
[root@ansible-salve1 ~]# [ 1 -lt 3 ]
[root@ansible-salve1 ~]# echo $?
0
[root@ansible-salve1 ~]# 

语法3:[[ <测试表达式> ]] 说明:比test和[]更新的语法格式。[[]]的边界和内容之间至少有一个空格。[[]]中可以使用通配符等进行模式匹配

[root@ansible-salve1 ~]# [[ 1 > 3 ]]
[root@ansible-salve1 ~]# echo $?
1
[root@ansible-salve1 ~]# [[ 1 < 3 ]]
[root@ansible-salve1 ~]# echo $?
0
[root@ansible-salve1 ~]# 

语法4:((<测试表达式>)) 说明:一般用于if语句里,双小括号两端不需要有空格,测试对象只能是整数

[root@ansible-salve1 ~]# ((1>2))
[root@ansible-salve1 ~]# echo $?
1
[root@ansible-salve1 ~]# ((1<2))
[root@ansible-salve1 ~]# echo $?
0
[root@ansible-salve1 ~]#
变量测试

语法规则:-v VAR 变量var是否被定义

示例:判断NAME变量是否被定义

[root@ansible-salve1 shell]# [[ -v NAME ]]
[root@ansible-salve1 shell]# echo $?
1
[root@ansible-salve1 shell]# NAME=1
[root@ansible-salve1 shell]# [[ -v NAME ]]
[root@ansible-salve1 shell]# echo $?
0
[root@ansible-salve1 shell]#

语法规则: -R VAR 变量VAR是否被引用

示例:判断NAME变量是否被引用

[root@ansible-salve1 shell]# NAME=10
[root@ansible-salve1 shell]# test -v NAME
[root@ansible-salve1 shell]# echo $?
0
[root@ansible-salve1 shell]# test -R NAME
[root@ansible-salve1 shell]# echo $?
1
[root@ansible-salve1 shell]# 
文件测试表达式

以下是常用的文件测试操作符说明表格:

文件测试操作符对照表

操作符说明
-a/-e文件是否存在
-b文件是否存在且为块设备文件
-c文件是否存在且为字符设备文件
-L/-h文件是否存在且为符号链接文件
-d文件是否存在且为目录
-f文件是否存在且为普通文件
-s文件是否存在且大小不为0
-S文件是否存在且为套接字文件
-p文件是否存在且为管道文件
-u文件是否存在且设置了SUID权限
-g文件是否存在且设置了SGID权限
-r文件是否存在且可读
-w文件是否存在且可写
-x文件是否存在且可执行
-t fd文件描述符fd是否在终端打开
-N文件自上次读取后是否被修改
-O当前有效用户是否为文件属主
-G当前有效用户是否为文件属组
-ef文件f1是否是文件f2的硬链接(比较inode)
-nt文件f1是否比文件f2新(根据修改时间判断)
-ot文件f1是否比文件f2旧(根据修改时间判断)

使用示例

# 检查文件是否存在
[ -e "/path/to/file" ] && echo "文件存在"# 检查是否为目录
[ -d "/path/to/dir" ] && echo "是目录"# 比较文件新旧
[ "file1" -nt "file2" ] && echo "file1比file2新"

注:操作符通常用于Shell条件测试(如test命令或[ ]结构中)。


测试文件

[root@ansible-salve1 ~]# test -a test.txt
[root@ansible-salve1 ~]# echo $?
1
[root@ansible-salve1 ~]# test -d shell
[root@ansible-salve1 ~]# echo $?
0
[root@ansible-salve1 ~]# touch test.txt
[root@ansible-salve1 ~]# test -w test.txt &&echo  "true"
true
[root@ansible-salve1 ~]# test -r test.txt &&echo  "true"
true
[root@ansible-salve1 ~]# test -x test.txt &&echo  "true"
[root@ansible-salve1 ~]# 

 字符串测试表达式

-n "字符串"字符串长度不为0时返回真(n可理解为nonzero[ ] 或 test
-z "字符串"字符串长度为0时返回真(z可理解为zero[ ] 或 test
"字符串1" == "字符串2"字符串1与字符串2完全相等时返回真(需注意空格和大小写)[[ ]]
"字符串1" != "字符串2"字符串1与字符串2不相等时返回真[[ ]]
"字符串1" > "字符串2"按字典序比较,字符串1的ASCII码大于字符串2时返回真[[ ]]
"字符串1" < "字符串2"按字典序比较,字符串1的ASCII码小于字符串2时返回真[[ ]]
"字符串1" =~ "PATTERN"字符串1匹配右侧的扩展正则表达式时返回真(需用[[ ]][[ ]]


测试字符串

[root@ansible-salve1 ~]# var_test='Mike' 
[root@ansible-salve1 ~]# echo $var_test 
Mike
[root@ansible-salve1 ~]# [[ -n var_test ]] && echo "True"
True
​
# 通配符
[root@ansible-salve1 ~]# FILE=test.log
[root@ansible-salve1 ~]# [[ "$FILE" == *.log ]] && echo "True"
True
[root@ansible-salve1 ~]# FILE=test.txt
[root@ansible-salve1 ~]# [[ "$FILE" == *.log ]] && echo "True"
[root@ansible-salve1 ~]# [[ "$FILE" != *.log ]] && echo "True"
True
[root@ansible-salve1 ~]# 
​
# 扩展的正则表达式
[root@ansible-salve1 ~]# FILE=test.log
[root@ansible-salve1 ~]# [[ "$FILE" =~  \.log$ ]] && echo "True"
True
[root@ansible-salve1 ~]# N=100
[root@ansible-salve1 ~]# [[ "$N" =~ ^[0-9]+$ ]] && echo "True"
True
[root@ansible-salve1 ~]# N=A10
[root@ansible-salve1 ~]# [[ "$N" =~ ^[0-9]+$ ]] && echo "True"
[root@ansible-salve1 ~]# IP=1.2.3.4
[root@ansible-salve1 ~]# [[ "$IP" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]
[root@ansible-salve1 ~]# echo $?
0
[root@ansible-salve1 ~]# 
# 使用正则表达式判断IP是否合法
[root@ansible-salve1 ~]# IP=1.2.3.333
[root@ansible-salve1 ~]# [[ $IP =~ ^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]]
[root@ansible-salve1 ~]# echo $?
1
[root@ansible-salve1 ~]# IP=255.255.255.255
[root@ansible-salve1 ~]# [[ $IP =~ ^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]]
[root@ansible-salve1 ~]# echo $?
0
[root@ansible-salve1 ~]# 
​
整数测试表达式

逻辑操作符

[root@ansible-salve1 ~]# var_test=1
[root@ansible-salve1 ~]# var_t=2
[root@ansible-salve1 ~]# [ $var_test -lt 0 -a $var_t -gt 0 ]
[root@ansible-salve1 ~]# echo $?
1
[root@ansible-salve1 ~]# [ $var_test -lt 0 -o $var_t -gt 0 ]
[root@ansible-salve1 ~]# echo $?
0
[root@ansible-salve1 ~]# 
关于()与 { }

( )和 { }都可以将多个命令组合再一次,批量执行,{ } 里的内容需要与两侧用空格隔开并在命令结尾加上;

  • ( )会开启子shell,并且list中变量赋值及内部命令执行后,将不再影响后续的环境

    [root@ansible-salve1 ~]# name=mage;(echo $name;name=wang;echo $name);echo $name
    mage
    wang
    mage
    ​
    [root@ansible-salve1 ~]# (umask 444;umask);umask
    0444
    0022
    [root@ansible-salve1 ~]# (umask 444;touch 1.txt);umask
    0022
    [root@ansible-salve1 ~]# ll 1.txt 
    --w--w--w- 1 root root 0 11月 13 22:12 1.txt
    [root@ansible-salve1 ~]# echo $BASHPID
    1418
    [root@ansible-salve1 ~]# (echo $BASHPID; sleep 3)
    1501
    ​

    { } 不会开启子shell,在当前shell中运行,会影响当前shell环境

    [root@ansible-salve1 ~]# name=mage;{ echo $name;name=wang;echo $name; };echo $name
    mage
    wang
    wang
    [root@ansible-salve1 ~]# { umask 444;touch 1.txt; };umask
    0444
    [root@ansible-salve1 ~]# umask
    0444
    [root@ansible-salve1 ~]# ll 1.txt 
    --w--w--w- 1 root root 0 11月 13 22:23 1.txt
    [root@ansible-salve1 ~]# echo $BASHPID
    1418
    [root@ansible-salve1 ~]# { echo $BASHPID; sleep 3; }
    1418
    [root@ansible-salve1 ~]#
    组合测试条件
    第一种方式[ ]
    [ EXPRESSION1  -a EXPRESSION2]  并且 ==> 条件1与条件2都为真,结果才为真
    [ EXPRESSION1  -O EXPRESSION2]  或  ==> 条件1与条件2只要有一个为真,结果就为真
    [ !EXPRESSION1 ]  取反

    说明:-a 和 -o 需要使用测试命令执行,[[ ]] 不支持

    [root@ansible-salve1 ~]# ll 1.txt 
    --w--w--w- 1 root root 0 11月 13 22:23 1.txt
    [root@ansible-salve1 ~]# FILE=/root/1.txt 
    [root@ansible-salve1 ~]# [ -f $FILE -a -x $FILE ]
    [root@ansible-salve1 ~]# echo $?
    1
    [root@ansible-salve1 ~]# chmod +x /root/1.txt 
    [root@ansible-salve1 ~]# [ -f $FILE -a -x $FILE ]
    [root@ansible-salve1 ~]# echo $?
    0
    [root@ansible-salve1 ~]#
    第二种方式[[ ]]
    COMMAND1 && COMMAND2 #并且,短路与,代表条件性的AND THEN
    如果COMMAND1 成功,将执行COMMAND2,否则,将不执行COMMAND2
    ​
    COMMAND1 || COMMAND2 #或者,短路或,代表条件性的OR ELSE
    如果COMMAND1 成功,将不执行COMMAND2,否则,将执行COMMAND2
    ​
    ! COMMAND #非,取反
    ​
    ​
    # 结论:如果&& 和 || 混合使用,&&要在前,||放在后
    [root@ansible-salve1 ~]# id hehao &> /dev/null  || useradd hehao  # 前面执行不成功,则执行后面的语句
    [root@ansible-salve1 ~]# id hehao &> /dev/null  && echo "此账户已存在"
    此账户已存在
    [root@ansible-salve1 ~]# 
    ​
    [root@ansible-salve1 ~]# IP=10.0.0.11;ping -c1 -w1 $IP &> /dev/null && echo $IP is up || echo $IP is down
    10.0.0.11 is down
    [root@ansible-salve1 ~]# IP=192.168.80.1;ping -c1 -w1 $IP &> /dev/null && echo $IP is up || echo $IP is down
    192.168.80.1 is up
    [root@ansible-salve1 ~]# 

    示例:磁盘空间的判断

    # 查看磁盘空间占用率
    [root@ansible-salve1 shell]# df | grep '^/dev/nv'  | grep -oE '[0-9]+%' | tr -d %
    17
    [root@ansible-salve1 shell]# cat fd.sh 
    #!/bin/bash
    WARNING=10
    SPACE_USED=`df | grep '^/dev/nv'  | grep -oE '[0-9]+%' | tr -d %`
    ["$SPACE_USED" -gt $WARNING] && echo "磁盘空间不足,请尽快处理" |  mail -s "DISK Warning" 1446528135@qq.com
    使用read命令命令来接受输入

    read 是 Shell 内置命令,用来从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据

语法结构
read [option] [variables]
​
--options表示选项
​
--variables表示用来存储数据的变量,可以有一个,也可以有多个。
​
-- options和variables都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 REPLY 中。
选项:

示例:使用read给多个变量赋值并输出

[root@ansible-salve1 shell]# vim info.sh 
#!/bin/bash
read -p "Enter some information > " name url age
echo "网站名字:$name"
echo "网址:$url"
echo "年龄:$age"
[root@ansible-salve1 shell]# chmod +x info.sh 
[root@ansible-salve1 shell]# ./info.sh 
Enter some information > hehao www.baidu.com 18
网站名字:hehao
网址:www.baidu.com
年龄:18
[root@ansible-salve1 shell]# 
​
# 注意:必须在一行内输入所有的值,不能换行,否则只能给第一个变量赋值,后续变量都会赋值失败

示例:只读取一个字符

# -n 1表示只读取一个字符,运行脚本后,只要用户输入一个字符,立即就读取结束,不等待用户按下回车键
[root@ansible-salve1 shell]# vim info1.sh 
#!/bin/bash
read -n 1 -p "Enter a char > " char  && printf "\n"
echo "---------------------------------------------------------"
echo $char
[root@ansible-salve1 shell]# chmod +x info1.sh 
[root@ansible-salve1 shell]# ./info1.sh 
Enter a char > a
---------------------------------------------------------
a

示例:在指定时间内输入密码

#使用&&组合了多个命令,这些命令会依次执行,并且从整体上作为 if 语句的判断条件,只要其中一个命令执行失败(退出状态为非 0 值),整个判断条件就失败了,后续的命令也就没有必要执行
[root@ansible-salve1 shell]# vim info2.sh
#!/bin/bash
ifread -t 20 -sp "Enter password in 20 seconds(once) > " pass1 && printf "\n" &&  #第一次输入密码read -t 20 -sp "Enter password in 20 seconds(again)> " pass2 && printf "\n" &&  #第二次输入密码[ $pass1 == $pass2 ]  #判断两次输入的密码是否相等
thenecho "Valid password"
elseecho "Invalid password"
fi
[root@ansible-salve1 shell]# chmod +x info2.sh 
[root@ansible-salve1 shell]# ./info2.sh 
Enter password in 20 seconds(once) > 
Enter password in 20 seconds(again)> 
Valid password
[root@ansible-salve1 shell]# 

示例:利用正则表达式

[root@ansible-salve1 shell]# vim info3.sh
[root@ansible-salve1 shell]# cat info3.sh 
#!/bin/bash
read -p "Are you rich? yes or no: " ANSWER
[[ $ANSWER =~ ^[Yy]|[Yy][Ee][Ss]$ ]] && echo "You Are Rich" || echo "Good Good Study,Day Day up"
[root@ansible-salve1 shell]# chmod +x info3.sh 
[root@ansible-salve1 shell]# ./info3.sh 
Are you rich? yes or no: y
You Are Rich
[root@ansible-salve1 shell]# ./info3.sh 
Are you rich? yes or no: YeS
You Are Rich
[root@ansible-salve1 shell]# 

示例:工作选项

[root@ansible-salve1 shell]# vim backup.sh 
#!/bin/bash
SRC=/etc/
DEST=/data/backup_`date +%F_%H-%M-%S`
cp -a $SRC $DEST
[ $? -eq 0 ] && echo "备份成功" || echo "备份失败"
[root@ansible-salve1 shell]# chmod +x backup.sh
[root@ansible-salve1 shell]# vim info4.sh
#!/bin/bash
cat <<EOF
请选择:
1.备份文件
2.清理日志文件
3.软件升级
4.软件回滚
5.删库跑路
EOF
read -p "请输入上面的数字1-5:" MENU
[ $MENU -eq 1 ] && ./backup.sh
[ $MENU -eq 2 ] && echo "清理日志文件"
[ $MENU -eq 3 ] && echo "软件升级"
[ $MENU -eq 4 ] && echo "软件回滚"
[ $MENU -eq 5 ] && echo "删除跑路"
​
[root@ansible-salve1 shell]# chmod +x info4.sh 
[root@ansible-salve1 shell]# ./info4.sh 
请选择:
1.备份数据库
2.清理日志文件
3.软件升级
4.软件回滚
5.删库跑路
请输入上面的数字1-5:1
备份成功
[root@ansible-salve1 shell]# 
​

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

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

相关文章

SpringAI系列---【多租户记忆和淘汰策略】

1.多租户工作原理 2.引入jdbc的pom spring官网链接&#xff1a;https://docs.spring.io/spring-ai/reference/api/chat-memory.html&#xff0c;推荐使用官网的jdbc。 阿里巴巴ai链接&#xff1a;https://github.com/alibaba/spring-ai-alibaba/tree/main/community/memories j…

Linux gzip 命令详解:从基础到高级用法

Linux gzip 命令详解&#xff1a;从基础到高级用法 在 Linux 系统中&#xff0c;文件压缩与解压缩是日常运维和文件管理的常见操作。gzip&#xff08;GNU Zip&#xff09;作为一款经典的压缩工具&#xff0c;凭借其高效的压缩算法和简洁的使用方式&#xff0c;成为 Linux 用户处…

Redis有什么优点和缺点?

优点&#xff1a;极致性能&#xff1a; 基于内存操作和高效的单线程 I/O 模型&#xff0c;读写速度极快。数据结构丰富&#xff1a; 支持多种数据结构&#xff0c;如 String、Hash、List、Set、ZSet、Stream、Geo 等&#xff0c;编程模型灵活。持久化与高可用&#xff1a; 提供…

NestJS 3 分钟搭好 MySQL + MongoDB,CRUD 复制粘贴直接运行

基于上一篇内容《为什么现代 Node 后端都选 NestJS TypeScript&#xff1f;这组合真香了》&#xff0c;这篇文章继续写数据库的连接。 所以今天把MySQL、MongoDB全接上&#xff0c;做个小实例。朋友们项目里用什么数据库可以视情况而定。 这里的功能分别为&#xff1a; MySQ…

用了企业微信 AI 半年,这 5 个功能让我彻底告别重复劳动

每天上班不是在整理会议纪要&#xff0c;就是在翻聊天记录找文件&#xff0c;写文档还要自己抠数据…… 这些重复劳动是不是也在消耗你的时间&#xff1f;作为用了企业微信 AI 功能半年的 “老用户”&#xff0c;我必须说&#xff1a;企业微信 AI 的这 5 个功能&#xff0c;真的…

从入门到高手,Linux就应该这样学【好书推荐】

从入门到高手&#xff0c;请这样学Linux 一、Linux基础与终端操作 1.1 Linux简介 Linux 是一种开源的类 Unix 操作系统&#xff0c;以其稳定性、安全性和高效性被广泛应用于服务器、嵌入式系统及开发环境中。掌握基本命令和操作技巧是 Linux 学习的关键。 1.2 终端基础 打开…

【数据可视化-104】安徽省2025年上半年GDP数据可视化分析:用Python和Pyecharts打造炫酷大屏

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

组件库UI自动化

一、背景 背景&#xff1a; 组件库全局改动场景多&#xff0c;组件之间耦合场景多–时常需要全场景回归组件库demo有200多个&#xff0c;手动全局回归耗时耗力细微偏差纯视觉无法辨别 可行性分析&#xff1a; 组件库功能占比 L1&#xff08;视觉层&#xff09;&#xff1a;图片…

面试题:JVM与G1要点总结

一.Java内存区域 1.运行时数据区的介绍 2.站在线程的角度看Java内存区域 3.深入分析堆和栈的区别 4.方法的出入栈和栈上分配、逃逸分析及TLAB 5.虚拟机中的对象创建步骤 6.对象的内存布局 1.运行时数据区的介绍 运行时数据区的类型&#xff1a;程序计数器、Java虚拟机栈、本地方…

车辆安全供电系统开发原则和实践

摘要在汽车行业中&#xff0c;安全应用的重要性在不断提升&#xff0c;例如受车辆自动化发展以及机械备用系统重要性降低的影响。为应对这些趋势&#xff0c;安全相关的电气和 / 或电子系统&#xff08;E/E 系统&#xff09;的电源输入必须由供电系统来保障&#xff0c;这使得功…

WebSocket客户端库:websocket-fruge365

&#x1f680; 从零开始打造一个WebSocket客户端库&#xff1a;websocket-fruge365 &#x1f4d6; 前言 在现代Web开发中&#xff0c;实时通信已经成为不可或缺的功能。无论是聊天应用、实时数据监控&#xff0c;还是在线协作工具&#xff0c;WebSocket都扮演着重要角色。然而…

rocketmq批量执行跑批任务报错

rocketmq批量执行跑批任务&#xff0c;报下面的错误&#xff0c;怎么处理一下呢&#xff1f;是修改配置还是修改代码还是&#xff1f; org.apache.rocketmq.client.exception.MQBrokerException: CODE: 215 DESC: [FLOW]client has exhausted the send quota for the current …

大语言模型(LLM)简介与应用分享

1. 什么是大语言模型&#xff08;LLM&#xff09; 大语言模型&#xff08;Large Language Model&#xff0c;简称 LLM&#xff09;是基于 深度学习 和 海量文本数据 训练而成的人工智能模型。 采用 Transformer 架构参数规模巨大&#xff08;数十亿到数千亿&#xff09;能够 理…

【算法笔记】选择排序、插入排序、冒泡排序、二分查找问题

算法的笔记&#xff0c;直接上代码&#xff0c;思路和问题这些&#xff0c;都在代码注释上面 1、工具类 为了生成测试代码和比较器&#xff0c;专门写了一个数组工具类&#xff0c;代码如下&#xff1a; /*** 数组工具类*/ public class ArrUtil {/*** 生成随机数组* 长度是[0,…

行业分享丨基于SimSolid的大型汽车连续冲压模具刚度分析

*本文投稿自机械零部件制造业用户 汽车连续模具的刚度直接决定了冲压件质量&#xff08;尺寸精度、表面缺陷&#xff09;与模具寿命。传统有限元分析&#xff08;FEA&#xff09;在面对大型复杂模具装配体时&#xff0c;存在网格划分困难、计算资源消耗大、周期长等瓶颈。本文以…

用AI生成的html页面设计放到到Axure上实现再改造的方法

要将 AI 生成的 HTML 原型导入 Axure&#xff0c;该方法的核心逻辑是以 Figma 为 “中间桥梁”&#xff08;因 Axure 无法直接读取 HTML&#xff0c;需通过 Figma 转换格式&#xff09;&#xff0c;分 3 步即可完成&#xff0c;以下是详细操作指南&#xff08;含每步目标、具体…

从入门到实战:Linux sed命令全攻略,文本处理效率翻倍

从入门到实战&#xff1a;Linux sed命令全攻略&#xff0c;文本处理效率翻倍 文章目录从入门到实战&#xff1a;Linux sed命令全攻略&#xff0c;文本处理效率翻倍一、认识sed&#xff1a;什么是流编辑器&#xff1f;二、吃透sed工作原理&#xff1a;为什么它能高效处理文本&am…

TIOBE 8月编程语言榜深度解析:Python占比突破26%,Perl成最大黑马

根据TIOBE最新发布的2025年8月编程语言排行榜&#xff0c;一场静默的技术变革正在上演&#xff1a;Python以26.14%的占比首次突破26%大关&#xff0c;连续12个月稳居榜首。这一数据不仅刷新了Python自身的历史纪录&#xff0c;更成为TIOBE指数自2001年创立以来的最高单语言占比…

从发现到恢复,看瑞数信息如何构建“抗毁重构”实战路径

在信息化社会&#xff0c;“韧性”“弹性”这些词汇常被用来形容系统抵御和应对风险的能力&#xff0c;但对于身处关键基础设施行业的运营者来说&#xff0c;这些概念往往过于抽象&#xff0c;难以直接指导实践。 相比之下&#xff0c;“抗毁重构”更具画面感。它不仅是一个管理…

深入理解 jemalloc:从内存分配机制到技术选型

在高性能服务&#xff08;如数据库、缓存、JVM&#xff09;的底层优化中&#xff0c;内存分配效率直接影响系统整体性能。本文将从操作系统底层的malloc机制切入&#xff0c;详解 jemalloc 的设计理念、开源应用场景、实战案例&#xff0c;技术选型分析 一、操作系统底层的内存…