Linux 中变量的取用与设定

优质博文:IT-BLOG-CN

Linux是一个多人多任务的环境,每个人登录系统都能取得一个bash shell,每个人都能够使用bash下达mail这个指令来接收自己的邮箱等等。问题是,bash如何得知你的邮箱是那个文件?这就需要『变量』的帮助。

一、什么是变量

【1】变量的可变性与方便性: 简单的说,变量就是让一个特定的字符串代表不固定的内容。例如,每个账号的邮件预设是以MAIL这个变量来进行存取的。当zzx用户登录时,他便会去MAIL这个变量,而这个变量的内容其实是/var/spool/mail/zzx,那如果 bird登录,他的变量MAIL的内容就是/var/spool/mail/bird。而我们使用信件读取指令mail来读取自己的邮箱信件。

【2】影响bash环境操作的变量: 例如PATH变量,你能不能在任何目录下执行某个指令,与PATH这个变量有很大关系。例如你下达ls这个指令时,系统就是通过PATH这个变量里面的内容所记录的路径顺序来搜索指令的。如果搜索完PATH变量内的路径还找不到ls这个指令时,就会在屏幕上显示『 command not found 』的错误讯息了。在Linux System下,所有的线程都是需要一个执行码,当正确登入Linux后,你就有一个bash执行程序,也才真正的经由bash来跟系统沟通。由于系统需要一些变量来提供他自己数据的存取(或者是一些环境的设定参数值,例如是否要显示彩色等等),所以就有一些所谓的『环境变量』需要来读入系统中,这些环境例如PATHHOMEMAILSHELL等等。为了区别与自定义变量的不同,环境变量通常以大写字符来表示。

【3】脚本程序设计(shell script)的好帮手: 在个人设定方面,例如我们要写一个大型script时,有些数据可能由于用户习惯的不同而有差异,比如说路径,由于路径在script被使用的相当多,如果下次换一部主机,都要修改 script里面的所有路径,那一定很low,这个时候就使用变量,而该变量的定义写在最前面,后面相关的路径名称都以变量来取代,那到时候只需要修改一行就等于修改了全部路径,相当方便。

二、变量的取用与设定

【1】变量的取用(echo) 利用echo就能够读取变量,只需要在变量前加上$符号,或者用${变量}的方式读取内容。

[root@learnVM 桌面]# echo $PATH
:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin
[root@learnVM 桌面]# echo ${PATH}

【2】变量与变量内容之间如何设定与修改: 用等号(=)连接变量与他的内容就好。

[root@learnVM 桌面]# echo $username  
        <=  目前没有查询到任何数据,因为此变量为被设定。
[root@learnVM 桌面]# username=zzx
[root@learnVM 桌面]# echo $username
zzx     <=  为我们设定的username值。

【3】变量的设定规则:
①、等号两边不能直接接空格符。
②、变量名称只能是英文字母与数字,但是开头字符不能时数字。
③、变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来。

[root@learnVM 桌面]# test="i am is $username"   <= 双引号的特殊字符如$等,可以保有原本的特性
[root@learnVM 桌面]# echo $test
i am is zzx    <= 对$username进行了解析

[root@learnVM 桌面]# test='i am is $username'   <= 单引号的特殊字符,仅为一般字符,纯文本。
[root@learnVM 桌面]# echo $test
i am is $username   <= 不对$username进行了解析

④、可以使用跳脱字符『 \ 』将特殊符号(如:[Enter]$\ ,空格符,’ 等)

[root@learnVM 桌面]# test=i\ am\ is\ zzx
[root@learnVM 桌面]# echo $test
i am is zzx

⑤、变量值是一串指令所提供的信息时,可以使用反单引号『指令』『$(指令) 』,例如想要取核心版本:

[root@learnVM 桌面]# version=`uname -r`   
[root@learnVM 桌面]# echo $version
2.6.32-642.el6.x86_64

⑥、若该变量为扩展变量内容时,则可用 “$变量名称” 或 ${变量} 累加内容,如下:

[root@learnVM 桌面]# test=i\ am\ is\ zzx
[root@learnVM 桌面]# test=${test}\ cool  <= 或者使用"$test"\ cool
[root@learnVM 桌面]# echo $test
i am is zzx cool

⑦、若该变量需要在其他子程序执行,则需要export来使变量编程环境变量:『 export 变量名 』
⑧、通常大写的变量是系统默认的变量,自定义的变量一般都为小写。(规则,不遵守也行)
⑨、取消变量的方法使用:unset

[root@learnVM 桌面]# unset test
[root@learnVM 桌面]# echo $test
             <= 变量已被取消,输出的值为空

三、环境变量的功能

【1】用env观察环境变量与常见环境变量说明: 列出目前的shell环境下的所有环境变量与其内容。

[root@learnVM 桌面]# env
ORBIT_SOCKETDIR=/tmp/orbit-root
HOSTNAME=learnVM                     <=这部主机的主机名
IMSETTINGS_INTEGRATE_DESKTOP=yes
SHELL=/bin/bash                      <=目前这个环境下,使用的shell是哪一个程序
TERM=xterm                           <=这个终端机使用的环境是什么类型
HISTSIZE=1000                        <=记录指令的笔数,默认支持1000
USER=root                            <=使用者的名称
......

envenvironment(环境)的简写,如下部分环境变量。如果使用export也会是一样的内容。下面对环境变量进行介绍:
HOME:代表用户的家目录。我们可以通过cd ~去家目录。有很多程序都可能会取用到这个变量的值。
SHELL:当前使用的SHELL是哪只程序,Linux预设使用/bin/bash
MAIL:当我们使用mail这个指令在收信时,系统会去读取邮件邮箱文件(mailbox)
HISTSIZE:这个与『历史命令』有关,我们曾下达过的指令可以被系统记录下来,而记录的『笔数』则是由这个值来设定的。
PATH:就是执行文件搜索的路径,目录与目录之间以冒号分割,由于文件的搜索是依序由PATH的变量内的目录来查询的,所以,目录的顺序也是很重要的。
LANG:这个比较重要,很多讯息都会用到它,例如:当我们启动某些 Perl 的程序语言文件时,他会主动的去分析语系数据文件,如果发现他无法解析的编码语系,就可能产生错误。
RANDOM:随机数的变量,目前大多数distributions都会有随机数生成器,那就是/dev/random文件,在BASH环境下,这个RANDOM变量的内容,介于0~32767之间。如果要去0~9之间的数值,利用declare宣告数值类型,如下:

[root@learnVM 桌面]# declare -i number=$RANDOM*10/32768;echo $number
2         <= 此时会随机取0~9之间的数值

【2】用set观察所有变量(含环境变量与自定义变量):bash可不只有环境变量,还有一些与bash操作接口有关的变量,以及用户自己定义的变量存在的。可通过set指令查看,set除了环境变量之外,还会将其他在bash内的变量统统显示出来。

[root@learnVM 桌面]# set
BASH=/bin/bash          <=BASH 主程序放置路径
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu") <=bash 的版本
COLUMNS=80              <=在目前的终端机环境下,使用的字段有几个字符长度
HISTFILE=/root/.bash_history     <=历史命令记录的放置位置,隐藏档。
HISTFILESIZE=1000       <=存起来(与上个变量有关)的文件之指令的最大记录笔数
HISTSIZE=1000           <=目前环境下,内存中记录的历史命令最大笔数
IFS=$' \t\n'            <=预设的分隔符
LINES=24                <=目前终端机下的最大行数
PS1='[\u@\h \W]\$ '     <=PS1 就是我们系统的命令提示符,例如我的是=[root@learnVM 桌面]
PS2='> '                <=如果你使用逃脱符号(\)第二行以后的提示字符

【3】PS1(提示字符的设定):命令提示符,当我们每次按下Enter键去执行某个指令后,最后要在此出现提示字符时,就会去主动读取这个变量值了,例如我本机的PS1='[\u@\h \W]\$ ' 显示的是一种特殊符号,这些特殊符号可以显示不同的信息,每个distributionbash默认的PS1变量内容可能有差异,但不要紧,可以通过man bash查询PS1的相关说明,以理解底下的一些符号的意义。
\d:可显示出『星期 月 日』的日期格式,如:“Mon Feb 2”
\H:完整的主机名。
\h:仅取主机在第一个小数点之前的名字。
\t:显示时间,为24小时格式的『HH:MM:SS』
\T:显示时间,为12小时格式的『HH:MM:SS』
\A:显示时间,为24小时格式的『HH:MM』
\@:显示时间,为12小时格式的『am/pm』
\u:目前使用者的账号名称
\vBASE的版本信息
\w:完整的工作目录名称,由根目录写起的目录名称,所以仅会列出最后一个目录名。
\#:下达的第几个指令
\$:提示字符,如果是root的话,提示字符为# ,否则为$

CentOS预设的PS1内容:PS1='[\u@\h \W]\$ ',这个反斜杠后的数据为PS1的特殊功能,与bash的变量设定没有关系,现在我们应该都清楚为什么我的命令提示符是:『root@learnVM 桌面』,我们也可以修改自己的命令提示符:

[zzx@learnVM home]$ PS1='[\u@\h \w \A #\#]\$'  <= \#表示第2次下达的命令,每执行一次命令累加1
[zzx@learnVM /home 06:34 #2]$  

【4】$(关于本shellPID):钱字号本身也是个变量,表示当前Shell的线程代号,既所谓的PID(Process ID)。想要知道自己shellPID可以通过echo $$获取PID号码。

[zzx@learnVM /home 06:34 #2]$echo $$
3405

【5】(关于上个执行指令的回传值):问号也是一个特殊的变数,在 bash 中这个变量很重要,表示上一个执行的指令所回传的值,当执行某指令时,这些指令都会回传一个执行后的代码。一般来说,如果成功的执行该指令,则会回传一个0值,如果执行过程发生错误,就会回传『错误代码』,一般就是以非为0的数值来取代。

[zzx@learnVM /home 06:37 #3]$12name=ddd
bash: 12name=ddd: command not found
[zzx@learnVM /home 06:44 #4]$echo $?
127     <=错误代码回传值依据软件而有不同,我们可以利用这个代码来搜索错误的原因

【6】export(自定义变量转成环境变量):环境变量与自定义变量的区别,就是该变量能够被子程序继续引用的就是环境变量,反之则为自定义变量。简单介绍下子程序与父程序:当登录Linux后,会获取一个bash(独立的程序),这个程序的识别使用的是一个称为程序标识符PID。接下来在bash底下所下达的任何指令都是由这个bash所衍生的,那些被下达的指令被称为子程序。
在这里插入图片描述

如上所示,我们在原本的bash底下执行另一个bash,结果操作的环境接口就会跑到第二个bash去(就是子程序),原本的bash就是sleep这个指令运行的环境就是实现部分,若要回到原本的bash去,就只有将第二个bash结束掉(下达exit或者logout)指令。因为子程序仅会继承父程序的环境变量,所以 bash的自定义变量在进入子程序后就会消失,一直到离开子程序并回到原父程序后,变量才会有生效。那么如何将自定义的变量转化为环境变量啦,就是通过export指令实现。

[zzx@learnVM home]$ export 变量名称

如果下达export指令就会将所有的『环境变量』绣出来:

[zzx@learnVM home]$ export
declare -x CLASS_PATH=".:/usr/install/jvm/jdk1.8.0_121/lib/dt.jar:/usr/install/jvm/jdk1.8.0_121/lib/tools.jar:/usr/install/jvm/jdk1.8.0_121/jre/lib"
declare -x COLORTERM="gnome-terminal"
declare -x CVS_RSH="ssh"
declare -x DBUS_SESSION_BUS_ADDRESS="unix:abstract=/tmp/dbus-2vt9iZbym4,guid=3aeb40487b94bd413a26d22f0000003a"
declare -x DESKTOP_SESSION="gnome"
declare -x DISPLAY=":0.0"
declare -x GDMSESSION="gnome"
declare -x GDM_KEYBOARD_LAYOUT="us"
...........

四、影响显示结果的语系变量(locale)

当我们使用man command的方式去查询某个数据的说明文件时,该说明文档的内容可能会因为我们使用的语系不同而产生乱码。另外,利用ls查询文件的时间时,也可能会有乱码出现在时间部分。这个问题其实就是语系的问题。目前大多数的Linux系统都支持万国码了,也支持大部分的国家语系。我们可以通过locale指令查询自己的Linux支持多少语系。

[root@learnVM 桌面]# locale -a
zh_TW.big5     <= 大五码的中文编码
zh_TW.euctw
zh_TW.utf8     <= 万国码的中文编码
......

正体中文语系至少支持了两种以上的编码,一种是目前还是很常见的big5,另一种则是越来越热门的utf-8编码。我们可以通过以下逐一设定每个语系有关的数据变量,但事实是, 如果其他语系变量都没设置,且你有设置LANG 或者是LC_ALL时,则其他的语系变量就会被这两个变量所取代!这也是为什么在Linux当中,通常说仅设定LANGLC_ALL两个变量而已。在Linux主机的终端机接口(tty1~tty6)的环境下,如果设定『 LANG=zh_TW.utf8 』这个设定值生效后,使用 man 或者其他讯息输出时,都会出现一堆乱码,尤其是ls -l这个参数。Linux主机的终端机接口环境下是无法显示像中文这么复杂的编码文字,所以就会产生乱码了。

[root@learnVM 桌面]# locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=

五、变量的有效范围

变量也有使用的范围,则『变量』可否被引用与export有关。被export后的变量为『环境变量』。为什么环境变量的数据可以被子程序所引用,是因为内存配置的关系。
✔ 当启动一个shell,操作系统会分配一记忆区块给 shell 使用,此内存内之变量可让子程序取用。
✔ 若在父程序中利用export功能,可以让自定义变量的内容写到上述的记忆区块当中(环境变量)
✔ 当加载另一个 shell 时,子shell可以将父shell的环境变量所在的记忆区块导入自己的环境变量区块中。

六、变量键盘读取、数组与宣告(read、array、declare)

除了提到的变量设定功能,我们也可以通过键盘输入。就类似于我们执行某些程序时,会提示使用这输入“yes/no”之类的讯息。我们还可以宣告这个变量的属性,例如:数组或者是数字等等。
read:读取来自键盘输入的变量。这个指令最常被用在shell script的撰写当中,想要跟使用者对谈就使用该指令。

[root@learnVM /]# read [-pt] variable
选项与参数:
   -p : 后面可以接提示符
   -t : 后面可以接等待的『秒数』这个比较有趣,不会一直等待使用者。

范例一:让用户由键盘输入一内容,将该内容编程名为 atest 的变量
[root@learnVM /]# read atest
this is a test       <= 此时光标会等待你输入
[root@learnVM /]# echo $atest
this is a test       <= 你刚刚输入的数据已经变成一个变量内容

范例二:提示使用者 30 秒内输入自己的大名,将该输入字符串作为名为 named 的变量内容
[root@learnVM /]# read -p "pelse you name" -t 30 names
pelse you name zzx  <= 会有提示字符
[root@learnVM /]# echo $names
zzx                 <= 输入的数据又变成一个变量的内容

declare/typeset:宣告变量的类型。如果使用declare后面并没有接任何参数,那么bash就会主动将所有的变量名称与内容统统叫出来,就好像使用 set一样。

[root@learnVM /]# declare [-aixr] variable
选项与参数:
-a : 将后面名为 variable 的变量定义成为数组(array)类型
-i : 将后面名为 variable 的变量定义为整数数字(integer)类型
-x :用法与 export 一样,就是将后面的 variable 变成环境变量。
-r : 将变量设定成为 readonly 类型,该变量不可被更改内容,也不能unset。

范例一:让sum 进行 1+2+3 的加和
[root@learnVM /]# sum=1+2+3
[root@learnVM /]# echo $sum
1+2+3
[root@learnVM /]# declare -i sum=1+2+3
[root@learnVM /]# echo $sum
6

由于在默认的情况底下bash对于变量有几个基本的定义:
● 变量类型默认为『字符串』,所以若不指定变量类型,则1+2为一个『字符串』而不是『计算式』。
bash环境中的数值运算,预设最多仅能达到整数形态,所以1/3结果是 0
如果需要非字符串类型的变量,那就得要进行变量的宣告才行。如下继续接受declare功能。

范例二:将sum 变为环境变量
[root@learnVM 桌面]# declare -x sum
[root@learnVM 桌面]# export |grep sum
declare -ix sum="6"              <= 会出现 i 与 x 的宣告

范例三:将sum 变为只读属性,不可更改
[root@learnVM 桌面]# declare -r sum
[root@learnVM 桌面]# sum=test
bash: sum: readonly variable     <=不允许修改此属性

范例四:将sum 更改为非环境变量的自定义变量
[root@learnVM 桌面]# declare +x sum   <= 将-变成+ 表示【取消】功能,这里 x 表示环境变量
[root@learnVM 桌面]# declare -p sum   <= -p 可以单独列出变量的类型
declare -ir sum="6"                  <= 只剩下i,r的类型,不具有x(环境变量)类型。

需要注意的是,如果不小心将变量设定为『只读』,通常得要注销再登入才能复原该变量的类型。

✔ 数组(array)变量类型:var[index]=content:表示数组名为var,我们假定数组的内容为var[1]=1,var[2]=2,var[3]=3等等,那么index就是一些数字。

范例:设定上面提到的 var[1] ~ var[3] 的变数
[root@learnVM 桌面]# var[1]="1"
[root@learnVM 桌面]# var[2]="2"
[root@learnVM 桌面]# var[3]="3"
[root@learnVM 桌面]# echo "${var[1]},${var[2]},${var[3]}"
1,2,3

七、与文件系统及程序的限制关系(ulimit)

我们知道Linux可以同时登陆十个人,如果同时启动十个文件每个文件的大小约10 MBytes,主机的内存就需要10*100*10= 10000MBytes=10GBytes,系统就会挂点。为了要预防这个情况的发生,所以我们的bash是可以『限制用户的某些系统资源』的,包括可以开启的文件数量,可以使用的CPU时间,可以使用内存总量等等。可以用ulimit进行设置。

[root@learnVM 桌面]# ulimit [-SHacdfltu] [配额]
选项与参数:
 -H : hard limit ,严格的设定,必定不能超过这个设定的数值;
 -S :soft limit ,警告的设定,可以超过这个设定值,但是若超过则有警告信息。
                   在设定上,通常 soft 会比 hard 小,例如 soft 80,而hard 100
 -a :后面不接任何选项与参数,可以列出所有的限制额度
 -c : 当某些程序发生错误时,系统可能会将该程序的内存中的信息写成文件(除错用),
      这种文件就被称为核心文件(core file)。此为限制每个核心文件的最大容量。
 -f : 此 shell 可以建立的最大文件容量(一般可能设定为2GB)单位为 Kbytes
 -d : 程序可使用的最大断裂内存(segment)容量。
 -l : 可用于锁定的内容容量
 -t : 可使用的最大CPU时间(单位为秒)
 -u : 单一用户可以使用的最大程序(process)数量

范例:列出你目前身份(假设为一般账号)的所有限制数据数值

[root@learnVM 桌面]# ulimit -a
core file size          (blocks, -c) 0              <=只要是0就代表么有限制
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited      <=可建立的单一文件大小
pending signals                 (-i) 7334
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024           <=同时可开启的文件数量
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7334
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

想要复原ulimit的设定最简单的方法就是注销再登入,否则就是得要重新以 ulimit设定才行。需要注意的是,一般身份使用者如果要以ulimit设定-f的文件大小,那么他『只能继续减小文件容量,不能增加文件容量』。

八、变量内容的删除、取代与替换(Optional)

【1】变量内容的删除与取代: 具体举例说明:

[root@learnVM 桌面]# test=1234567890
[root@learnVM 桌面]# echo ${test#*5}  <= test是变量名称,#表示从变量的最前面开始向右删除,且仅删除最短的那个
67890

[root@learnVM 桌面]# echo ${test//8/44}  <= 将8 替换为 44
12345674490

(*)表示通配符,取0到无穷多个任意字符。从上面 的案例可以看出删除了5之前的所有元素。上面的一个 # 表示删掉最短的那个,那么两个 ## 表示删除最长的那个数据。那么除了上述从前面开始删除#之外,还有重后面开始删除的%。上述取掉实例中,两个斜线中间的是旧字符串,后面的是新字符串。那么两个双斜线表示的是替换所有符号条件的内容。

【2】变量的测试与内容替换: 通常我们会判断某变量是否存在,如存在使用以有的,若不存在则给予一个常用的设定。举例:

[root@learnVM 桌面]# echo ${username}
                                               <= 空白表示username变量不存在
[root@learnVM 桌面]# username=${username-root}
[root@learnVM 桌面]# echo $username
root                                           <= 因为username不存在所以赋默认root值
[root@learnVM 桌面]# username=zzx               <=当给其手动赋值zzx后,再是用 *-root
[root@learnVM 桌面]# username=${username-root}
[root@learnVM 桌面]# echo $username          
zzx                                             <=会发现默认的 root 不会生效

在大括号内冒号【:】的作用,被测试的变量如果设定为空字符串时,就可以用*-root中的root来替换设定的空字符串的值:

变量设定方式str 没有设定str 为空字符串str 已设定非为空字符串
var=${str-expr}var=exprvar=var=$str
var=${str:-expr}var=exprvar=exprvar=$str
var=${str+expr}var=var=exprvar=expr
var=${str:+expr}var=var=var=expr
var=${str=expr}str=expr var=exprstr不变 var=str不变 var=$str
var=${str:=expr}str=expr var=exprstr=expr var=exprstr不变 var=$str

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

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

相关文章

jmeter性能测试

一.jmeter基本使用 1.元件执行顺序 配置元件&#xff1b; 前置处理器&#xff1b; 定时器&#xff1b; sampler&#xff1b; 后置处理器&#xff1b;&#xff08;关联&#xff0c;正则表达式提取器&#xff09; 断言&#xff1b; 监听&#xff1b;&#xff08;不涉及顺序&…

Windows 电脑类别怎么区分?不同类别区分总结

电脑类别 Windows 电脑的类别有哪些&#xff1f;我们可以大致分为这三类&#xff1a;CopilotPC、AI PC、普通 PC。下面就来看看这些电脑类别的区别。 普通 PC 普通 PC 就是指那些标准的台式电脑或者笔记本电脑&#xff0c;它们是由中央处理器&#xff08;CPU&#xff09;以及…

【面试题】信息安全风险评估要做些什么

信息安全风险评估是识别、评估和管理信息系统中潜在风险的重要过程。它具有以下几个关键步骤&#xff1a; 1.资产识别&#xff1a; 确定需要保护的信息资产&#xff0c;如硬件、软件、数据、人员等。例如&#xff0c;企业的客户数据库、重要的业务文档等。 2.威胁评估&#…

手把手教你打造高精度STM32数字时钟,超详细步骤解析

STM32数字时钟项目详解 1. 项目概述 STM32数字时钟是一个集成了时间显示、闹钟功能、温湿度检测等多功能于一体的小型电子设备。它利用STM32的实时时钟(RTC)功能作为核心,配合LCD显示屏、按键输入、温湿度传感器等外设,实现了一个功能丰富的数字时钟系统。 2. 硬件组成 STM…

文献解读-基因编辑-第十二期|《CRISPR-detector:快速、准确地检测、可视化和注释基因组编辑事件引起的全基因组范围突变》

关键词&#xff1a;基因组变异检测&#xff1b;全基因组测序&#xff1b;基因编辑&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;CRISPR-detector: fast and accurate detection, visualization, and annotation of genome-wide mutations induced by g…

做外贸有些事说早了,未必是好事

如果说能说话&#xff0c;其实谁也会&#xff0c;但是能把话说好却并不是一个简单的事&#xff0c;而且说话的时机往往也影响着事情的结局和走向&#xff0c; 所以才有了老人常提起的那句话&#xff1a;三岁学说话&#xff0c;一生学闭嘴。 最近我又因为图省事而犯了一个错误&…

云通SIPX,您的码号资源智能调度专家!

在数字化转型的浪潮中&#xff0c;号码资源作为企业与客户沟通的重要桥梁&#xff0c;其管理效率直接关系到企业运营的成败。随着运营商对号码资源管理的规范化和精细化&#xff0c;企业对高效、智能的号码资源管理需求日益增长&#xff0c;以实现对外呼叫的降本增效。 一、什么…

JAVA编程题期末题库【中】

8.计算邮资 程序代码: public static void main(String[] args) {// 计算邮资//if多分支语句//创建对象java.util.Scanner inputnew java.util.Scanner(System.in); //提示输入用户&#xff0c;输入邮件的重量System.out.println("邮件的重量&#xff1a;");int wei…

VMware ESXi 8.0U2c macOS Unlocker OEM BIOS Huawei (华为) FusionServer 定制版

VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS Huawei (华为) FusionServer 定制版 ESXi 8.0U2 标准版&#xff0c;Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科)、Hitachi (日立)、Fujitsu (富士通)、NEC (日电)、Huawei (华为)、xFusion (超聚…

小型智能驱鸟器,建筑驱鸟专用

随着城市化进程的加快&#xff0c;鸟类与人类的居住空间逐渐交织重合&#xff0c;鸟类对建筑物的侵扰问题也愈发凸显。家庭庭院、住宅窗前、屋顶&#xff0c;甚至那些承载着历史与文化底蕴的名胜古迹和精美雕像&#xff0c;都时常受到鸟粪的污染。鸟粪具有腐蚀性且很难清理&…

智能疏散指示系统为什么是验收的必然考核标准?哪些厂家具备资质

智能疏散系统需要什么&#xff1f;现阶段&#xff0c;随着我国经济不断发展趋势的加快&#xff0c;住宅建筑具有复杂的特点。近年来&#xff0c;我国高层住宅、大中型建筑、综合性公共建筑越来越多。随着这座现代建筑的进步&#xff0c;我发现这种类型的建筑在发生火灾或事故时…

【高级篇】主从复制与高可用性:构建坚若磐石的数据库基础设施(十二)

引言 在上一章《备份与恢复》中,我们深入探讨了如何通过各种备份策略和恢复技术,确保数据的安全性和业务的连续性。然而,为了应对更大规模的业务挑战和灾难恢复需求,仅仅依靠备份是不够的。本章,我们将聚焦于MySQL的主从复制与高可用性技术,从原理到实践,从配置到优化,…

程序猿大战Python——Python与MySQL交互一

pymysql模块的安装 目标&#xff1a;了解如何安装pymysql模块&#xff1f; 当要使用Python和MySQL数据库进行交互&#xff0c;需要借助一个第三方模块&#xff1a;pymysql。 在使用pymysql模块前&#xff0c;先进行安装&#xff1a; pip install pymysql 有时使用pip instal…

iptables(11)target(SNAT、DNAT、MASQUERADE、REDIRECT)

简介 前面我们已经介绍了ACCEPT、DROP、REJECT、LOG,这篇文章我们介绍SNAT、DNAT、MASQUERADE、REDIRECT,这几个参数的定义我们在上篇文章中都有介绍,我这里再列出回顾一下 DNAT(目标地址转换)和 SNAT(源地址转换) 原理:修改数据包的源或目标 IP 地址。通常用于 NAT(…

制造业“智改数转”背景下,产品经理考取NPDP证书的重要性

在“智改数转”&#xff08;智能化改造和数字化转型&#xff09;已成为推动制造业高质量发展的关键路径背景下&#xff0c;作为连接市场需求与产品实现的关键角色&#xff0c;产品经理的角色愈发重要。而考取NPDP&#xff08;新产品开发专业人士认证&#xff09;证书&#xff0…

VBA 进度条(2)

1.前提 1-1. 在VBA编辑器找到工具-引用-勾选MicroSoft Visual Basic for Applications Extensibility Library 1-2. 信任中心 -> 宏设置 -> 开发人员宏设置 -> 选中“信任对VBA工程对象模型的访问” 2.类模块 Private objApp As Object Private u…

Mysql进阶-索引-使用规则-索引失效情况二(or连接的条件、数据分布影响)

文章目录 1、or连接的条件1.1、展示 tb_user 索引1.2、查询 id10 or age231.3、执行计划 id10 or age231.4、给 age 创建 索引1.4、执行计划 phone17799990004 or age23 2、数据分布影响2.1、查询 tb_user2.2、查询 phone >177999900202.3、执行计划 phone >177999900202…

Java 自定义jackson2序列化器遇到的问题

问题1&#xff1a;java: 错误: 不支持发行版本 5 修改idea java环境 问题2&#xff1a;ClassNotFoundException: com.fasterxml.jackson.annotation.JsonMerge 缺少 jar 包&#xff1a;jackson-annotations 引入依赖的地址&#xff1a;https://mvnrepository.com/artifact/c…

【深度学习】【Lora训练3】StabelDiffusion,Lora训练过程,秋叶包,Linux,SDXL Lora训练

为了便于使用&#xff0c;构建一个docker镜像来使用秋叶包。2024年6月26日。 docker run -it --gpus all -v /ssd/xiedong:/datax --net host kevinchina/deeplearning:pytorch2.3.0-cuda12.1-cudnn8-devel-xformers bashgit clone --recurse-submodules https://github.com/A…

如何实现智慧农田的精准灌溉

如何实现智慧农田的精准灌溉 智慧农田的精准灌溉是现代农业技术发展的重要组成部分&#xff0c;它集成了物联网、大数据分析、人工智能以及现代水利技术&#xff0c;旨在通过实时监测土壤湿度、气象条件及作物生长状况&#xff0c;实现水资源的高效利用和作物产量、品质的双重…