RHCE的学习(18)

第二章 变量和引用


深入认识变量

        在程序设计语言中,变量是一个非常重要的概念。也是初学者在进行Shell程序设计之前必须掌握的一个非常基础的概念。只有理解变量的使用方法,才能设计出良好的程序。本节将介绍Shell中变量的相关知识。

什么是变量

  • 顾名思义,变量就是程序设计语言中的一个可以变化的量,当然,可以变化的是变量的值。变量几乎所有的程序设计语言中都有定义,并且其涵义也大同小异。

  • 从本质上讲,变量是在程序中保存用户数据的一段内存存储空间,变量名是内存空间的首地址

  • 在程序的执行过程中,保存数据的内存空间的内容可能会不断地发生变化,但是,代表内存地址的变量名却保持不变。

变量的名称

        在Shell中,变量名可以由字母、数字或者下划线组成,并且只能以字母或者下划线开头。对于变量名的长度,Shell并没有做出明确的规定。因此,用户可以使用任意长度的字符串来作为变量名。但是,为了提高程序的可读性,建议用户使用相对较短的字符串作为变量名。

        在一个设计良好的程序中,变量的命名有着非常大的学问。通常情况下,用户应该尽可能选择有明确意义的英文单词作为变量名,尽量避免使用拼音或者毫无意义的字符串作为变量名。这样的话,用户通过变量名就可以了解该变量的作用。

  • 组成:字母、数字、下划线组成,不能以数字开头

  • 变量名称的长度,shell没有明确规定,但是为了增加可读性,建议使用较短的、见名知意的名称命名

  • 规则

    • 首字符必须为字母或者下划线:a-z,A-Z

    • 中间不能由空格,可以使用下划线(_)

    • 不能使用标点符号

    • 不能使用bash中关键字,输入help查看bash的保留字

    • 例:下面的变量名都是很好的选择

[root@server ~]# JAVA_HOME=/usr/bin/jvm/jre-1.6.0-openjdk.x86_64
[root@server ~]# SUM=0
[root@server ~]# back_up=/root
[root@server ~]# PATH=/sbin
[root@server ~]# UID=100
[root@server ~]# SSHD=/usr/sbin/sshd

扩展两种方式:

  • 驼峰语法
    • 小驼峰
    • 大驼峰
  • 匈牙利命名法

什么是驼峰语法?

        骆驼式命名法就是当变量名或函数名是由一个或多个单词连结在一起,而构成的唯一识别字时,(小驼峰)第一个单词以小写字母开始;从第二个单词开始以后的每个单词的首字母都采用大写字母或者大驼峰法把第一个单词是大写,后面的单词首字母也大写例如:myFirstName、MYLastName,这样的变量名看上去就像骆驼峰一样此起彼伏,故得名。

        除了驼峰命名法,另外还有匈牙利命名法基本原则是:变量名=属性+类型+对象描述。匈牙利命名法关键是:标识符的名字以一个或者多个小写字母开头作为前缀;前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。比如m_lpszStr, 表示指向一个以0字符结尾的字符串的长指针成员变量。属性部分

属性部分:

g_ 全局变量 ​

c_  常量 ​

m_  

c++类成员变量 ​

s_  静态变量 ​ 





类型部分: ​

数组 a ​

指针 p ​

函数 fn_

另外,有些程序员喜欢用下划线。比如file_name.

变量的类型

  • 原则:shell是一种动态类型语言和弱类型语言,即在Shell中,变量的数据类型毋需显示地声明,变量的数据类型会根据不同的操作有所变化。准确地讲,Shell中的变量是不分数据类型的,统一地按照字符串存储。但是根据变量的上下文环境,允许程序执行一些不同的操作,例如字符串的比较和整数的加减等等。

什么是弱类型语言、强类型语言?
  • 强类型和弱类型主要是站在变量类型处理的角度进行分类的。
  • 强类型是指不允许隐式变量类型转换,弱类型则允许隐式类型转换。

换句话说:

  • 强类型语言,当你定义一个变量是某个类型,如果不经过代码显式转换(强制转化)过,它就永远都是这个类型,如果把它当做其他类型来用,就会报错

  • 弱类型语言,你想把这个变量当做什么类型来用,就当做什么类型来用,语言的解析器会自动(隐式)转换。

  • 比如:

    • C语言定义变量,int+变量名,实则前面的int就似给变量内存划分了等级,int定义整形所以空间里只能存放整形,这就是强类型

    • php、C#和Python等都是强类型语言。

变量的分类

        在Shell中,通常情况下用户可以直接使用变量,而毋需先进行定义,当用户第一次使用某个变量名时,实际上就同时定义了这个变量,在变量的作用域内,用户都可以使用该变量。

  • shell的变量数据类型

[root@server ~]# vim  test1.sh
​
#!/bin/bash
​
# 定义变量x,输入初始值123
x=123
​
# 变量x加1
​
let "x+=1"
​
# 输出变量x的值
echo  "x=$x"
​
# 替换x中1的值为abc,并赋值给变量y
y=${x/1/abc}
​
# 使用declare  -i  声明变量y为整型变量(-i 表示整型)
declare  -i  y
​
# 输出y的值
echo  "y=$y"
​
[root@server ~]# bash  test1.sh 
x=124
y=abc24

#显示空行
echo

变量的定义

  • 原则:直接使用,不需要变量声明

  • 格式:变量名=变量的值

  • 例:

[root@server ~]# vim  test2.sh

#!/bin/bash
# 定义变量a
a=1

# 定义变量b
b="hello"

# 定义变量c
c="hello world"

# 定义路径
bak_dir=/data/backup

注:

  • = 前后不能收空格

[root@server ~]# a= 3
bash: 3: command not found...
[root@server ~]# b =5
bash: b: command not found...
  • 字符串类型建议使用双引好作为定界符引起,尤其是字符串中有空格

[root@server ~]# stu_name=zhang san
bash: san: command not found...
[root@server ~]# stu_name="zhang san"
[root@server ~]# stu_name='zhang san'

自定义变量

  • 概念:上述以赋值形态形成的变量定义形式称为自定义变量

  • 定义变量:变量名=变量值

  • 变量名必须以字母或下划线开头,区分大小写 ip1=192.168.2.115

  • 本地(自定义变量)变量 环境变量 export

  • 引用变量的值:

    • $变量名

    • ${表达式或变量名}

    • 例:

[root@server ~]# a=1024
[root@server ~]# echo $a
1024
[root@server ~]# echo  ${a}
1024
  • 查看变量

[root@server ~]# set
[root@server ~]# declare

echo $变量名 
set(所有变量:包括自定义变量和环境变量)
env    # 显示当前用户的环境变量
printenv   #同上
例如env |grep back_dir2
  • 取消变量:unset 变量名

[root@server ~]# a=256
[root@server ~]# echo  $a
256
[root@server ~]# unset  a
[root@server ~]# echo  $a
  • 作用范围:只在当前shell起效

环境变量

概念
  • 环境变量又称为全局变量,可以在任意子shell生效(当前进程与当前进程的子进程生效),环境变量又分为自定义环境变量和bash内置的环境变量,用户退出命令后改变量会丢失,若需要永久保存就必须写在文件中(/etc/profile.d/*.sh 与 /etc/bashrc)

  • 定义环境变量

# 法1
export  环境变量=值

# 法2
变量名=值
export  变量名

# 法3
declare  -x   变量名=值
  • 例:

[root@server ~]# export  back_dir1=/home/backup  将自定义变量转换成环境变量
[root@server ~]# NAME="zhang san"
[root@server ~]# export  NAME
[root@server ~]# declare  -x  AGE=20
[root@server ~]# env   # 显示当前用户的环境变量
[root@server ~]# printenv  # 同上
[root@server ~]# export  # 同上
  • 注意:以上定义的环境变量都是临时的,重启后会失效,若要永久生效,则需要写入到配置文件中

  • 对比:

C语言      局部变量      全局变量
shell     自定义变量     环境变量

=========================================

示例:

 TZ=Asia/Shanghai
  export TZ
  设置java环境变量  https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
    #配置环境变量/etc/profile
    export JAVA_HOME=/usr/java/jdk1.6.0_45
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 
    export PATH=$PATH:$JAVA_HOME/bin
    #使配置生效 #source /etc/profile
    #检测: # java –version
    java version "1.6.0_45"
    Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
    Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode
    #也可以脚本形式(比如java.sh)定义在/etc/profile.d/下面
     让环境变量的修改在退出shell再次登陆时仍然有效,需要在相关配置文件中修改。
shell 环境变量存储的文件:
  • bash shell 初始化文件有:/etc/profile、 ~/.bash_profile、 ~/.bash_login、 ~/.profile、 ~/.bashrc、/etc/bashrc

  • 如图:

  • image-20230130154156590

  • /etc/profile :存放一些全局(共有)变量,不管哪个用户,登录时都会读取该文件。通常设置一些Shell变量PATH,USER,HOSTNAME和HISTSIZE等

  • ~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次,默认情况下,此文件通过脚本执行同目录下用户的.bashrc文件

  • ~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取

  • /etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取

  • /etc/inputrc文件为特定的情况处理键盘映射

  • 执行顺序:/etc/profile-->/etc/profile.d/*.sh--> ~/.bash_profile -->/etc/bashrc-->~./.bashrc

  • 结论:

    • 对于用户的环境变量设置,常见的是用户家目录下的.bashrc和.bash_profile

    • 对于全局环境变量设置,常见的文件有:/etc/profile /etc/bashrc /etc/profile.d 这三个配置文件

    • 常用方法是直接在/etc/profile文件中写入全局变量,如果想要在登陆后初始化或者显示加载的内容,只需要把脚本文件放在 /etc/profile.d 文件下即可

区别:

bash_profile只会在会话开始(登陆)时读取一次,bashrc文件每次打开终端都会读取。 定义环境变量,配置文件读取顺序

(会继承上一个shell的全部变量)
1)配置文件的执行顺序    su - root
/etc/profile.d/test.sh
/etc/profile
/root/.bashrc
/etc/profile
~/.bash_profile

2)登录式shell的配置文件执行顺序
(清除所有变量,通过文件重新读入)
•    a.直接通过终端输入账号密码进行登陆
•    b.使用su - USERNAME切换用户
执行顺序:(影响该shell的配置文件)
/etc/profile-->/etc/profile.d/*.sh-->/etc/bashrc-->~./.bashrc-->~/.bash_profile

3)非登录式shell配置胚子文件执行顺序
•   a. su UserName
•   b.图形界面打开终端
•   c.执行脚本(进入子shell)    ./
•   d.任何其他的bash实例
执行顺序(影响该shell的配置文件)
~/.bashrc-->/etc/bashrc--->/etc/profile.d/*.sh

交互式shell和非交互式shell
交互式:正常的命令行
非交互式shell:shell脚本  

bash内置环境变量
  • shell程序在运行时,会接受一组变量来确定登录用户名、命令路径、终端类型、登录目录等等,这些变量就是环境变量。
  • shell内置的环境变量是所有的shell程序都可以使用的变量,环境变量会影响所有的脚本的执行结果。
变量说明
PATH命令的搜索路径,以冒号作为分隔符
HOME用户的家目录的路径,是cd命令的默认参数
COLUMNS命令行编辑模式下可使用命令的长度
HISTFILE命令历史的文件路径
HISTFILESIZE命令历史中包含的最大行数
HISTSIZEhistory命令输出的记录数
LOGNAME当前用户的名字
SHELL当前使用的shell
PWD当前的工作目录

位置变量

  • 概念:当一条命令或脚本执行时,后面可以跟多个参数,可以使用位置变量来表示该参数

  • 例:编写一个shell脚本,当命令行或者从其他shell脚本中调用它的时候,这个脚本接受若干参数。这些选项是通过linux作为位置参数提供给shell程序的。在shell脚本中应有变量,接受实参,这类变量的名称很特别分别为1,2,3...这类变量称为位置变量,位置参数1存放在位置变量1中,位置参数2存放在位置变量2中,....来访问。

sh  test1.sh  hello  world  123  456
  • 当执行test1.sh 脚本时,第一个参数为hello到第四个参数可以使用特殊的符号表示,如:$1 $2 $3 ……

  • 常见的位置变量

$0 : 脚本名
$1-$9 : 1-9个参数
${10} :10以上的参数需要大花括号括起
$* : 所有参数
$@ : 所有参数
$# : 参数个数
$$ : 当前进程的PID
$! : 上一个后台进程的PID
$? : 上一个命令的返回值状态码,0为成功
$_ 匹配上一个命令的最后一参数

(注:127找不到命令 2没有文件或目录 )
  • 例:

[root@server ~]# vim  test3.sh
#!/bin/bash
​
echo  "第2个位置参数是: $2"
echo  "第1个位值参数是: $1"
echo  "第4个位置参数是: $4"
echo  "所有参数是: $*"
echo  "所有参数是: $@"
echo  "参数的个数是: $#"
echo  "当前进程的PID值: $$"
​
[root@server ~]# bash  test3.sh 1 2 3 4 5
第2个位置参数是: 2
第1个位值参数是: 1
第4个位置参数是: 4
所有参数是: 1 2 3 4 5
所有参数是: 1 2 3 4 5
参数的个数是: 5
当前进程的PID值: 2986
[root@server ~]# vim  test4.sh
​
​
[root@server ~]# bash test4.sh  孙小帅  18  123456@qq.com
name: 孙小帅
age: 18
E-mail:123456@qq.com
  • 例2:$?和位置变量
# vim ping.sh
#!/bin/bash                     
ping -c2 $1 &>/dev/null     
if [ $? = 0 ];then              
        echo "host $1 is ok"    
else                            
        echo "host $1 is fail"  
fi                              
# chmod a+x ping.sh
​
# ./ping.sh 192.168.2.25

  • $* 与 $@区别

当$* 和 $ @没有被引用的时候,它们确实没有什么区别,都会把位置参数当成一个个体, 
"$*"会把所有位置参数当成一个整体(或者说当成一个单词),如果没有位置参数,
则"$* "为空,如果有两个位置参数并且IFS为空格时,"$*"相当于"$1 $2"
"$@"会把所有位置参数当成一个单独的字段,如果没有位置参数($#为0),则"$@"展开为空
(不是空字符串,而是空列表),如果存在一个位置参数,则"$@"相当于"$1",如果有两个参数,
则"$@"相当于"$1" "$2"等等
set -- "I am" test command   
--将任何剩余的参数分配给位置参数,如果没有剩余参数,位置参数未设置。
[root@localhost Scripts]# for i in "$*";do echo $i;done
I am test command
[root@localhost Scripts]# for i in "$@";do echo $i;done
I am
test
command
[root@localhost Scripts]# for i;do echo $i;done
I am
test
command
2)temp=‘this is a temped variable’;echo foo${temp},上述命令执行结果
​
3)下面环境变量($0)表示获取当前执行的shell脚本的文件名。

变量赋值和作用域

显示赋值
  • 格式:变量名=变量值

ip1=192.168.1.251
school="Peking University"
today1=`date +%F`  # 注意为反引号``
today2=$(date +%F)

 变量和引号

  • 双引号:除了$ 、单引号、反引号、发斜线之外,其它被引起的内容保持字面意思

  • 单引号:所有字符保持字面意思

  • 反引号:被引起的字符串转为shell命令

  • 反斜线:转义符(\),屏蔽后面字符的特殊含义

变量的作用域

  • 全局变量:全局变量定义在脚本中,也可以定义在函数中,作用范围:从定义的开始处到shell脚本结束或者被显示的去除

  • 例:

[root@server ~]# vim  test5.sh
​
#!/bin/bash
​
func()   # 定义函数
{
        echo   "$v1"
        v1=200
}
v1=100
func
echo  "$v1"
​
​
[root@server ~]# bash  test5.sh 
100
200
  • 函数内部定义全局变量

# 上例修改
[root@server ~]# vim  test5.sh
#!/bin/bash
​
func()   # 定义函数
{
        v2=200
}
func
echo  "$v2"
​
​
[root@server ~]# bash  test5.sh 
200
  • 局部变量:范围更小,仅限于某个程序段中,如:函数、shell等,通过local关键字定义,注意:函数的参数也是局部变量

# 上例修改
[root@server ~]# vim  test5.sh
​
#!/bin/bash
​
func()   # 定义函数
{
        local v3=200  # 使用local关键字声明为局部变量
}
func
echo  "$v3"
[root@server ~]# bash  test5.sh 
 
  • 全局变量和局部变量区别

# 上例修改
[root@server ~]# vim  test5.sh
​
#!/bin/bash
func()
{
        #输出全局变量v1的值
        echo "global variable v1 is $v1"
        #定义局部变量v1
        local v1=2
        #输出局部变量v1的值
        echo "local variable v1 is $v1"
}
​
#定义全局变量v1
v1=1
#调用函数
func
#输出全局变量v1的值
echo "global variable v1 is $v1"

 declare命令

declare为shell指令,在第一种语法中可用来声明变量并设置变量的属性([rix]即为变量的属性),在第二种语法中可用来显示shell函数。若不加上任何参数,则会显示全部的shell变量与函数(与执行set指令的效果相同)。

语法:declare [+/-][rxi][变量名称=设置值] 或 declare -f
  • +/-  "-"可用来指定变量的属性,"+"则是取消变量所设的属性。

  • -f  仅显示函数。

  • -r  将变量设置为只读。

  • -x  指定的变量会成为环境变量,可供shell以外的程序来使用。

  • -i  [设置值]可以是数值,字符串或运算式。

声明整数型变量

# declare -i ab //声明整数型变量
# ab=56 //改变变量内容
# echo $ab //显示变量内容
56

改变变量属性

# declare -i ef //声明整数型变量
# ef=1  //变量赋值(整数值)
# echo $ef //显示变量内容
1
# ef="wer" //变量赋值(文本值)
# echo $ef 
0
# declare +i ef //取消变量属性
# ef="wer"
# echo $ef
wer

设置变量只读

# declare -r ab //设置变量为只读
# ab=88 //改变变量内容
-bash: ab: 只读变量
# echo $ab //显示变量内容
56

声明数组变量

# declare -a cd='([0]="a" [1]="b" [2]="c")' //声明数组变量
# echo ${cd[1]}
b //显示变量内容
​
# echo ${cd[@]} //显示整个数组变量内容
a b c

显示函数

# declare -f
command_not_found_handle () 
{ 
  if [ -x /usr/lib/command-not-found ]; then
    /usr/bin/python /usr/lib/command-not-found -- $1;
    return $?;
  else
    if [ -x /usr/share/command-not-found ]; then
      /usr/bin/python /usr/share/command-not-found -- $1;
      return $?;
    else
      return 127;
    fi;
  fi
}

read 从键盘读入变量值

  • read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量

  • 格式:read -参数 变量名

  • 参数

    • -p “提示语句:” 屏幕打印出一行提示语句。

    • -n数字:当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量,如:-n1 , 只要接受到一个字符就退出。只要按下一个字符进行回答,read命令立即接受输入并将其传给变量。无需按回车键

    • -t 等待时间 :计时输入,使用read命令存在着潜在危险。脚本很可能会停下来一直等待用户的输入。如果无论是否输入数据脚本都必须继续执行,那么可以使用-t选项指定一个计时器。-t选项指定read命令等待输入的秒数。当计时满时,read命令返回一个非零退出状态

    • -s : 关闭回显,使read命令中输入的数据不显示在监视器上(实际上,数据是显示的,只是read命令将文本颜色设置成与背景相同的颜色)

    • 常用格式:

read  变量名
read  -p  "提示信息:"   变量名
  • 例:

[root@server ~]# read  -p  "Enter  Numbers: "  num
Enter  Numbers: 9527
[root@server ~]# echo  $num
9527
[root@server ~]# read  -t  3  n1    # 不要输入内容,等待3秒后自动结束输入
[root@server ~]# read  -s  -p  "Enter your password: "  passw
Enter your password: [root@server ~]# echo  $passw 
123456
​
[root@server ~]# echo  $REPLY
​
[root@server ~]# read
100
[root@server ~]# echo  $REPLY   # 当输入时没有指定变量接收,会默认存储到REPLY变量中
100
​
# 一次性输入多个变量的值
[root@server ~]# read  t1  t2
12 35
[root@server ~]# echo  $t1 $t2
12 35
  • 面试题:总结4中赋值方式

1.直接赋值:name="li si"
2.read命令: read  name
3.使用位置参数($1 $2 $3…) : name=$1
4.命令输入:name=$(whoami)    (命令返回值赋值)

shift命令: 剔除

  • 当Shell程序不知道其个数时,可以把所有参数一起赋值给变量$*。
  • 若用户要求Shell在不知道位置变量个数的情况下,还能逐个的把参数一一处理。
  • 在 shift命令执行前变量的值在shift命令执行后就不可用了。

示例如下:

echo "参数个数$#“
echo "所有参数$*"
shift   #默认剔除一个
echo "参数个数$#“
echo "所有参数$*"
shift 3 
echo "参数个数$#“
echo "所有参数$*"
for i in 1 3 4;do
    useradd $1
    shift
done

只读变量(readonly)

  • 将变量配置成为 readonly 类型,该变量不可被更改内容,也不能 unset -

定义方法:

  • 方法一: readonly [-fap] [变量定义] -f 定义只读函数 -a 定义只读数组变量 -p 显示系统中全部的只读变量列表      变量
  • 方法二: declare –r 变量定义

取消变量 unset 选项:-f 取消的是函数 -v 取消的是变量 如果没有指选项,首先尝试取消变量,如果失败尝试取消函数。

    unset name
    注意:Some variables cannot be unset; also see `readonly'.
        只读变量不能取消。
只读变量:值不能被修改;不能取消

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AG32 FPGA部分简单开发

环境 Quartus 13.0(Quartus 不能使用Lite 版本,需要使用Full 版本)AGM SDKSupra(快捷方式在SDK目录下,具体路径为AgRV_pio\packages\tool-agrv_logic\bin) FPGA编程 在AG32芯片中,拥有异构双…

__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined

VUE_PROD_HYDRATION_MISMATCH_DETAILS 未明确定义。您正在运行 Vue 的 esm-bundler 构建,它期望这些编译时功能标志通过捆绑器配置全局注入,以便在生产捆绑包中获得更好的tree-shaking优化。 Vue.js应用程序正在使用ESM(ECMAScript模块&#…

Spring——事务

事务 JdbcTemplate 简介 Spring框架对JDBC进行封装&#xff0c;使用JdbcTemplate方便实现对数据库操作 准备工作 ①搭建子模块 搭建子模块&#xff1a;spring-jdbc-tx ②加入依赖 <dependencies><!--spring jdbc Spring 持久化层支持jar包--><dependenc…

集合类源码浅析のJDK1.8ConcurrentHashMap(下篇)

文章目录 前言一、分段扩容1、addCount2、transfer3、helpTransfer 二、查询二、删除总结 前言 主要记录ConcurrentHashMap&#xff08;笔记中简称CHM&#xff09;的查询&#xff0c;删除&#xff0c;以及扩容方法的关键源码分析。 一、分段扩容 1、addCount 扩容的逻辑主要在…

H5页面多个视频如何只同时播放一个?

目录 背景1. 首先介绍下 muted 属性2. 监听播放和暂停操作3. 视频播放完毕后返回桌面&#xff0c;再进入H5页面发现视频封面丢失置灰解决思路&#xff1a; 背景 页面模块同时有个四个视频模块&#xff0c;发现可以同时播放四个视频&#xff0c;但是理想的是每次只播放一个。 …

D69【 python 接口自动化学习】- python 基础之数据库

day69 Python 执行 SQL 语句 学习日期&#xff1a;20241115 学习目标&#xff1a; MySQL 数据库&#xfe63;- Python连接redis 学习笔记&#xff1a; redis数据库的用途 使用Python访问redis数据库 使用Python对redis数据库进行读写操作 总结 1. redis是一款高性能的键…

jmeter常用配置元件介绍总结之逻辑控制器

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之逻辑控制器 逻辑控制器1.IF控制器2.事务控制器3.循环控制器4.While控制器5.ForEach控制器6.Include控制器7.Runtime控制器8.临界部分控制器9.交替控制器10.仅一次控制器11.简单控制器12.随机控制器13.随机顺序控制器14.吞…

21.<基于Spring图书管理系统②(图书列表+删除图书+更改图书)(非强制登录版本完结)>

PS&#xff1a; 开闭原则 定义和背景‌ ‌开闭原则&#xff08;Open-Closed Principle, OCP&#xff09;‌&#xff0c;也称为开放封闭原则&#xff0c;是面向对象设计中的一个基本原则。该原则强调软件中的模块、类或函数应该对扩展开放&#xff0c;对修改封闭。这意味着一个软…

springboot实现简单的数据查询接口(无实体类)

目录 前言&#xff1a;springboot整体架构 1、ZjGxbMapper.xml 2、ZjGxbMapper.java 3、ZjGxbService.java 4、ZjGxbController.java 5、调用接口测试数据是否正确 6、打包放到服务器即可 前言&#xff1a;springboot整体架构 文件架构&#xff0c;主要编写框选的这几类…

【已解决】 Tomcat10.1.x使用JSTL标签库

IDEA创建Java EE项目&#xff0c;使用Spring Spring MVC MyBatis框架&#xff0c;使用maven管理依赖。项目当前的环境是&#xff1a; Tomat 10.1.28Maven 3.6.3JDK 17 项目的功能&#xff1a;读取数据库的report表中的数据&#xff0c;返回一个List集合对象reportList在JSP…

权限相关知识

1.Linux权限的概念 在说Linux权限的概念之前我来问大家一个问题&#xff0c;你们觉得什么是权限&#xff1f; 权限平时的体现呢&#xff0c;就比如不是校长的亲戚就不能逛办公室&#xff0c;没充会员的爱奇艺看不了VIP影视剧&#xff0c;没成会员的的蛋糕店拿不到会员价等等等…

uniapp如何i18n国际化

1、正常情况下项目在代码生成的时候就已经有i18n的相关依赖&#xff0c;如果没有可以自行使用如下命令下载&#xff1a; npm install vue-i18n --save 2、创建相关文件 en文件下&#xff1a; zh文件下&#xff1a; index文件下&#xff1a; 3、在main.js中注册&#xff1a…

[刷题]入门3.彩票摇奖

博客主页&#xff1a;算法歌者本篇专栏&#xff1a;[刷题]您的支持&#xff0c;是我的创作动力。 文章目录 1、题目2、基础3、思路4、结果 1、题目 链接&#xff1a;洛谷-P2550-彩票摇奖 2、基础 此题目考察数组、三重循环、自增操作的能力。 3、思路 写代码时候&#xf…

JVM垃圾回收详解(重点)

堆空间的基本结构 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时&#xff0c;Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收 Java 堆是垃圾收集器管理的主要区域&#xff0c;因此也被称作 GC 堆&#xff08;Garbage Collected Heap&…

git rebase --continue解冲突操作

git rebase --continue解冲突操作 如果只是执行了 git rebase 命令&#xff0c;那么git会输出一下“错误”提示&#xff1a; There is no tracking information for the current branch. Please specify which branch you want to rebase against. See git-rebase(1) for detai…

腾讯地图GL JS点标识监听:无dragend事件的经纬度获取方案

引入腾讯地图SDK <!--腾讯地图 API--><script charset"utf-8" src"https://map.qq.com/api/gljs?librariestools&v1.exp&key***"></script>构建地图容器 <div class"layui-card"><div class"layui-car…

249: 凸包面积

解法&#xff1a; 使用Andrew算法【计算几何/凸包】安德鲁算法&#xff08;Andrews Algorithm&#xff09;详解_andrew算法求凸包-CSDN博客 排序&#xff1a; 将所有点按照x坐标进行升序排序。如果x坐标相同&#xff0c;则按照y坐标升序排序。 初始化栈&#xff1a; 使用一个栈…

基于VUE实现语音通话:边录边转发送语言消息、 播放pcm 音频

文章目录 引言I 音频协议音频格式:音频协议:II 实现协议创建ws对象初始化边录边转发送语言消息 setupPCM按下通话按钮时开始讲话,松开后停止讲话播放pcm 音频III 第三库recorderplayer调试引言 需求:电台通讯网(电台远程遥控软件-超短波)该系统通过网络、超短波终端等无线…

【Rust中的项目管理】

Rust中的项目管理 前言Package&#xff0c;Crate&#xff0c;Module &use &#xff0c;Path通过代码示例解释 Crate&#xff0c;Module &#xff0c;use&#xff0c;Path创建一个package&#xff1a;代码组织化skin.rs 中的代码struct & enum 相对路径和绝对路径引用同…

极客争锋 智连未来 TuyaOpen Framework极客创意大赛正式开启

TuyaOpen Framework极客创意大赛正式开启 可选择基于: TuyaOpen Framework 原生开源包: https://github.com/tuya/tuyaopen 支持 Ubuntu/T2/T3/T5/ESP32/ESP32C3等多款芯片TuyaOpen Arduino:https://github.com/tuya/arduino-tuyaopen支持 T2/T3/T5等多款芯片TuyaOpen LuaNode…