shell语法

概论

shell是我们通过命令行与操作系统沟通的语言

shell脚本可以直接在命令行中执行,也可以将一套逻辑组织成一个文件,方便复用。
DA Terminal中的命令行可以看成是一个“shell脚本在逐行执行”。

1.脚本示例

新建一个test.sh文件,内容如下:

#! /bin/bash
echo "Hello World!"
2.运行方式
  • 作为可执行文件

    acs@9e0ebfcd82d7:~$ chmod +x test.sh  # 使脚本具有可执行权限
    acs@9e0ebfcd82d7:~$ ./test.sh  # 当前路径下执行
    Hello World!  # 脚本输出
    acs@9e0ebfcd82d7:~$ /home/acs/test.sh  # 绝对路径下执行
    Hello World!  # 脚本输出
    acs@9e0ebfcd82d7:~$ ~/test.sh  # 家目录路径下执行
    Hello World!  # 脚本输出
    
  • 用解释器执行

    acs@9e0ebfcd82d7:~$ bash test.sh
    Hello World!  # 脚本输出
    

注释

1.单行注释
  • 每行中#之后的内容均是注释。

    # 这是一行注释
    echo 'Hello World'  #  这也是注释
    
2.多行注释
  • 格式

    :<<EOF
    第一行注释
    第二行注释
    第三行注释
    EOF
    
  • 其中EOF可以换成其它任意字符串。例如:

    :<<abc
    第一行注释
    第二行注释
    第三行注释
    abc:<<!
    第一行注释
    第二行注释
    第三行注释
    !
    

变量

1.定义变量
  • 定义变量,不需要加$符号,例如:

    name1='abc'  # 单引号定义字符串
    name2="abc"  # 双引号定义字符串
    name3=abc    # 也可以不加引号,同样表示字符串
    
2.使用变量
  • 使用变量,需要加上 符号,或者 符号,或者 符号,或者{}符号。

  • 花括号是可选的,主要为了帮助解释器识别变量边界。

    name=zhangsan
    echo $name  # 输出zhangsan
    echo ${name}  # 输出zhangsan
    echo ${name}hello  # 输出zhangsanhello
    
3.只读变量
  • 使用readonly或者declare可以将变量变为只读

    name=abc
    readonly name
    declare -r name  # 两种写法均可name=def  # 会报错,因为此时name只读
    
4.删除变量
  • unset可以删除变量。

    name=abc
    unset name
    echo $name  # 输出空行
    
5.变量类型
  • 自定义变量(局部变量):子进程不能访问的变量

    acs@9e0ebfcd82d7:~$ name=abc  # 定义变量
    acs@9e0ebfcd82d7:~$ export name  # 第一种方法
    acs@9e0ebfcd82d7:~$ declare -x name  # 第二种方法
    
  • 环境变量(全局变量):子进程可以访问的变量

    acs@9e0ebfcd82d7:~$ export name=abc  # 定义环境变量
    acs@9e0ebfcd82d7:~$ declare +x name  # 改为自定义变量
    
6.字符串
  • 字符串可以用单引号,也可以用双引号,也可以不用引号

  • 单引号与双引号的区别:

    • 单引号中的内容会原样输出,不会执行、不会取变量;
    • 双引号中的内容可以执行、可以取变量
    name=abc  # 不用引号
    echo 'hello, $name \"hh\"'  # 单引号字符串,输出 hello, $name \"hh\"
    echo "hello, $name \"hh\""  # 双引号字符串,输出 hello, abc "hh"
    
  • 获取长度与提取子串

    name="abc"
    echo ${#name}  # 输出3name="hello, abc"
    echo ${name:0:5}  # 提取从0开始的5个字符
    
7.文件参数变量
  • 在执行shell脚本时,可以向脚本传递参数。

  • $1是第一个参数,$2是第二个参数,以此类推。特殊的,$0文件名(包含路径)

    #! /bin/bashecho "文件名:"$0
    echo "第一个参数:"$1
    echo "第二个参数:"$2
    echo "第三个参数:"$3
    echo "第四个参数:"$4acs@9e0ebfcd82d7:~$ chmod +x test.sh 
    acs@9e0ebfcd82d7:~$ ./test.sh 1 2 3 4
    文件名:./test.sh
    第一个参数:1
    第二个参数:2
    第三个参数:3
    第四个参数:4
    
  • 其他参数相关变量

    参数说明
    $#代表文件传入的参数个数,如上例中值为4
    $*由所有参数构成的用空格隔开的字符串,如上例中值为"$1 $2 $3 $4"
    $@每个参数分别用双引号括起来的字符串,如上例中值为"$1" "$2" "$3" "$4"
    $$脚本当前运行的进程ID
    $?上一条命令的退出状态(注意不是stdout,而是exit code)。0表示正常退出,其他值表示错误
    $(command)返回command这条命令的stdout(可嵌套)
    command返回command这条命令的stdout (不可嵌套)

8.数组

定义
  • 数组用小括号表示,元素之间用空格隔开

    array=(1 abc "def" hhh)
    
  • 也可以直接定义数组中某个元素的值:

    array[0]=1
    array[1]=abc
    array[2]="def"
    
9.读取
  • 读取数组中某个元素的值

    ${array[index]}array=(1 abc "def" hhh)
    echo ${array[0]}
    echo ${array[1]}
    echo ${array[2]}
    
  • 读取整个数组

    ${array[@]}  # 第一种写法
    ${array[*]}  # 第二种写法array=(1 abc "def" hhh)
    echo ${array[@]}  # 第一种写法
    echo ${array[*]}  # 第二种写法
    
10.数组长度
  • 类似于字符串

    ${#array[@]}  # 第一种写法
    ${#array[*]}  # 第二种写法
    

expr命令

shell中不可以直接通过表达式计算值,这时候就要用到 expr 命令

1.使用
  • 格式

    expr 表达式
    
  • 表达式说明

    • 用空格隔开每一项
    • 用反斜杠放在shell特定的字符前面(发现表达式运行错误时,可以试试转义)
    • 对包含空格和其他特殊字符的字符串要用引号括起来
    • expr会在stdout中输出结果。如果为逻辑关系表达式,则结果为真,stdout1,否则为0
2.字符串表达式
  • length STRING:返回字符串长度

  • index STRING CHARSET

    • CHARSET中任意单个字符在STRING中最前面的字符位置,下标从1开始,依次寻找。
    • 找到则返回相应位置,到最后也找不到则返回0
  • substr STRING POSITION LENGTH

    • 返回STRING字符串中从POSITION开始,长度最大为LENGTH的子串。如果POSITIONLENGTH为负数,0或非数值,则返回空字符串。
    str="Hello World!"echo `expr length "$str"`  # ``不是单引号,表示执行该命令,输出12
    echo `expr index "$str" aWd`  # 输出7,下标从1开始
    echo `expr substr "$str" 2 3`  # 输出 ell
    
3.整数表达式

expr支持普通的算术操作,算术表达式优先级低于字符串表达式,高于逻辑关系表达式

  • + -:加减运算。两端参数会转换为整数,如果转换失败则报错。

  • * / %:乘,除,取模运算。两端参数会转换为整数,如果转换失败则报错。

  • ():可以改变优先级,但需要用反斜杠转移

    a=3
    b=4echo `expr $a + $b`  # 输出7
    echo `expr $a - $b`  # 输出-1
    echo `expr $a \* $b`  # 输出12,*需要转义
    echo `expr $a / $b`  # 输出0,整除
    echo `expr $a % $b` # 输出3
    echo `expr \( $a + 1 \) \* \( $b + 1 \)`  # 输出20,值为(a + 1) * (b + 1)
    
4.逻辑关系表达式
  • |

    • 如果第一个参数非空且非0,则返回第一个参数的值,否则返回第二个参数的值
    • 但要求第二个参数的值也是非空或非0,否则返回0。
    • 如果第一个参数是非空或非0时,不会计算第二个参数。
  • &

    • 如果两个参数都非空且非0,则返回第一个参数,否则返回0。
    • 如果第一个参为0或为空,则不会计算第二个参数。
  • < <= = == != >= >

    • 比较两端的参数,如果为true,则返回1,否则返回0。
    • ”==”是”=”的同义词。
    • ”expr”首先尝试将两端参数转换为整数,并做算术比较,如果转换失败,则按字符集排序规则做字符比较。
  • () 可以改变优先级,但需要用反斜杠转义

    a=3
    b=4echo `expr $a \> $b`  # 输出0,>需要转义
    echo `expr $a '<' $b`  # 输出1,也可以将特殊字符用引号引起来
    echo `expr $a '>=' $b`  # 输出0
    echo `expr $a \<\= $b`  # 输出1c=0
    d=5echo `expr $c \& $d`  # 输出0
    echo `expr $a \& $b`  # 输出3
    echo `expr $c \| $d`  # 输出5
    echo `expr $a \| $b`  # 输出3
    

read命令

read命令用于从标准输入中读取单行数据。当读到文件结束符时,exit code为1,否则为0

1.参数说明
  • -p: 后面可以接提示信息

  • -t:后面跟秒数,定义输入字符的等待时间,超过等待时间后会自动忽略此命令

    DAs@9e0ebfcd82d7:~$ read name  # 读入name的值
    zhangsan  # 标准输入
    DAs@9e0ebfcd82d7:~$ echo $name  # 输出name的值
    zhangsan  #标准输出
    DAs@9e0ebfcd82d7:~$ read -p "Please input your name: " -t 30 name  # 读入name的值,等待时间30秒
    Please input your name: zhangsan  # 标准输入
    DAs@9e0ebfcd82d7:~$ echo $name  # 输出name的值
    zhangsan  # 标准输出
    

echo命令

此命令用于输出字符串

1.命令格式
echo STRING
2.不同显示
  • 显示普通字符

    echo "Hello"
    echo Hello # 引号可以省略
    
  • 显示转义字符

    echo "\"Hello\""  # 注意只能使用双引号,如果使用单引号,则不转义
    echo \"Hello\"  # 也可以省略双引号
    
  • 显示变量

    name=zhangsan
    echo "My name is $name"  # 输出 My name is zhangsan
    
  • 显示换行

    echo -e "Hi\n"  # -e 开启转义
    echo "jony"
    Hi
    jony
    
  • 显示不换行

    echo -e "Hi \c" # -e 开启转义 \c 不换行
    echo "jony"Hi jony
    
  • 显示结果定向至文件

    echo "Hello World" > output.txt  # 将内容以覆盖的方式输出到output.txt中\\
    
  • 原样输出

    name=DAwing
    echo '$name\"'
    
  • 显示命令执行结果

    echo `date`
    Wed Sep 1 11:45:33 CST 2021
    

printf命令

printf命令用于格式化输出,类似于C/C++中的printf函数。默认不会在字符串末尾添加换行符

printf "%10d.\n" 123  # 占10位,右对齐
printf "%-10.2f.\n" 123.123321  # 占10位,保留2位小数,左对齐
printf "My name is %s\n" "zhangsan"  # 格式化输出字符串
printf "%d * %d = %d\n"  2 3 `expr 2 \* 3` # 表达式的值作为参数123.
123.12    .
My name is zhangsan
2 * 3 = 6

test命令与判断符号[]

1.逻辑运算符&&和||
  • && 表示与,|| 表示
  • 二者具有短路原则:
    • expr1 && expr2:当expr1为假时,直接忽略expr2
    • expr1 || expr2:当expr1为真时,直接忽略expr2
  • 表达式的exit code0,表示真;为非零,表示假。(与C/C++中的定义相反)(可以理解为main函数正常运行时返回0)
2.test命令
  • 在命令行中输入man test,可以查看test命令的用法。

  • test命令用于判断文件类型,以及对变量做比较。

  • test命令用exit code返回结果,而不是使用stdout。0表示真,非0表示假。

    test 2 -lt 3  # 为真,返回值为0
    echo $?  # 输出上个命令的返回值,输出0DAs@9e0ebfcd82d7:~$ ls  # 列出当前目录下的所有文件
    homework  output.txt  test.sh  tmp
    DAs@9e0ebfcd82d7:~$ test -e test.sh && echo "exist" || echo "Not exist"
    exist  # test.sh 文件存在
    DAs@9e0ebfcd82d7:~$ test -e test2.sh && echo "exist" || echo "Not exist"
    Not exist  # testh2.sh 文件不存在
    
3.关于文件
  • 类型判断:test -e filename # 判断文件是否存在

    测试参数代表意义
    -e文件是否存在
    -f是否为文件
    -d是否为目录
  • 权限判断:test -r filename # 判断文件是否可读

    测试参数代表意义
    -r文件是否可读
    -w文件是否可写
    -x文件是否执行
    -s是否为非空文件
4.比较与多重条件判定
  • 整数间比较:test $a -eq $b # a是否等于b

    测试参数代表意义
    -eq判断两数是否相等
    -ne判断两数是否不等
    -gt是否大于关系
    -lt是否小于关系
    -ge是否大于等于关系
    -le是否小于等于关系
  • 字符串比较

    测试参数代表意义
    test -z STRING判断字符串是否为空
    test -n STRING判断字符串是否非空
    test str1 == str2断字符串是否相等
    test str1 != str2判断字符串是否不等
  • 多重条件判定:test -r filename -a -x filename

    测试参数代表意义
    -a两条件是否同时成立
    -o两条件是否至少成立一个
    !取反,当文件不可执行时返回true
5.判断符号[]

**[]与test用法几乎一模一样,更常用于if语句中。另外[[]]是[]的加强版,支持的特性更多。 ** 前半括号后必须用空格隔开!

[ 2 -lt 3 ]  # 为真,返回值为0
echo $?  # 输出上个命令的返回值,输出0
DAs@9e0ebfcd82d7:~$ ls  # 列出当前目录下的所有文件
homework  output.txt  test.sh  tmp
DAs@9e0ebfcd82d7:~$ [ -e test.sh ] && echo "exist" || echo "Not exist"
exist  # test.sh 文件存在
DAs@9e0ebfcd82d7:~$ [ -e test2.sh ] && echo "exist" || echo "Not exist"
Not exist  # testh2.sh 文件不存在
  • 注意

    • []内的每一项都要用空格隔开
    • 中括号内的变量,最好用双引号括起来
    • 中括号内的常数,最好用单或双引号括起来
    name="zhang san"
    [ $name == "zhang san" ]  # 错误,等价于 [ zhang san == "zhang san" ],参数太多
    [ "$name" == "zhang san" ]  # 正确
    

判断语句

if…then形式,类似于C/C++中的if-else语句

  • 单层if

    if condition
    then语句1语句2...
    fia=3
    b=4if [ "$a" -lt "$b" ] && [ "$a" -gt 2 ]
    thenecho ${a}在范围内
    fi
    
  • 单层if-else

    if condition
    then语句1语句2...
    else语句1语句2...
    fi
    
  • 多层if-elif-elif-else

    if condition
    then语句1语句2...
    elif condition
    then语句1语句2
    else语句1语句2...
    fi
    
  • case...esDA形式

    case $变量名称 in值1)语句1语句2...;;  # 类似于C/C++中的break值2)语句1语句2...;;*)  # 类似于C/C++中的default语句1语句2...;;
    esDA
    

循环语句

  • for…in…do…done命令格式

    for var in val1 val2 val3
    do语句1语句2...
    done#输出1-10
    for i in $(seq 1 10)#第一个数为1,最后一个数为10
    doecho $i
    done#输出a-z
    for i in {a..z}
    doecho $i
    done
    
  • for ((…;…;…)) do…done命令格式

    for ((expression; condition; expression))
    do语句1语句2
    done#类似于c语言的循环
    for ((i=1; i<=10; i++))
    doecho $i
    done
    
  • while…do…done循环命令格式

    while condition
    do语句1语句2...
    done#示例,文件结束符为Ctrl+d,输入文件结束符后read指令返回false
    while read name
    doecho $name
    done
    
  • until…do…done循环:当条件为真时结束

    until condition
    do语句1语句2...
    done#示例,当用户输入yes或者YES时结束,否则一直等待读入。
    until [ "${word}" == "yes" ] || [ "${word}" == "YES" ]
    doread -p "Please input yes/YES to stop this program: " word
    done
    
  • break命令与continue命令

    • break:跳出当前一层循环,注意与C/C++不同的是:break不能跳出case语句
    • continue跳出当前循环
死循环的处理方式
  • 如果DA Terminal可以打开该程序,则输入Ctrl+c即可
  • 否则可以直接关闭进程:
    • 使用top命令找到进程的PID
    • 输入kill -9 PID即可关掉此进程

函数

1.概要
  • return的返回值,返回的是exit code取值为0-255,0表示正常结束

  • 如果想获取函数的输出结果,可以通过echo输出到stdout中,然后通过$(function_name)来获取stdout中的结果

  • 函数的return值可以通过$?来获取。

    [function] func_name() {  # function关键字可以省略语句1语句2...
    }
    
2.不获取return值和stdout
func() {name=zhangsanecho "Hello $name"
}func#Hello zhangsan
3.获取return值和stdout
  • 不写return时,默认return 0。
func() {name=abcecho "Hello $name"return 123
}output=$(func)
ret=$?echo "output = $output"
echo "return = $ret"#output = Hello abc
#return = 123
4.函数的输入参数
  • 在函数内,$1表示第一个输入参数,$2表示第二个输入参数,依此类推。
  • 注意:函数内的$0仍然是文件名,而不是函数名。
func() {  # 递归计算 $1 + ($1 - 1) + ($1 - 2) + ... + 0word=""while [ "${word}" != 'y' ] && [ "${word}" != 'n' ]doread -p "要进入func($1)函数吗?请输入y/n:" worddoneif [ "$word" == 'n' ]thenecho 0return 0fi  if [ $1 -le 0 ] thenecho 0return 0fi  sum=$(func $(expr $1 - 1))echo $(expr $sum + $1)
}echo $(func 10)
5.函数内的局部变量
  • 可以在函数内定义局部变量,作用范围仅在当前函数内。
  • 可以在递归函数中定义局部变量。
  • 命令格式local 变量名=变量值
#! /bin/bashfunc() {local name=abcecho $name
}
funcecho $name

exit命令

  • exit命令用来退出当前shell进程,并返回一个退出状态;使用$?可以接收这个退出状态。

  • exit命令可以接受一个整数值作为参数,代表退出状态。如果不指定,默认状态值是 0

  • exit退出状态只能是一个介于 0~255 之间的整数,其中只有 0 表示成功,其它值都表示失败。

    #! /bin/bashif [ $# -ne 1 ]  # 如果传入参数个数等于1,则正常退出;否则非正常退出。
    thenecho "arguments not valid"exit 1
    elseecho "arguments valid"exit 0
    fiacs@9e0ebfcd82d7:~$ chmod +x test.sh 
    acs@9e0ebfcd82d7:~$ ./test.sh abc
    arguments valid
    acs@9e0ebfcd82d7:~$ echo $?  # 传入一个参数,则正常退出,exit code为0
    0
    acs@9e0ebfcd82d7:~$ ./test.sh 
    arguments not valid
    acs@9e0ebfcd82d7:~$ echo $?  # 传入参数个数不是1,则非正常退出,exit code为1
    1
    

文件重定向

1.概述
  • stdin标准输入,从命令行读取数据,文件描述符为0
  • stdout标准输出,向命令行输出数据,文件描述符为1
  • stderr标准错误输出,向命令行输出数据,文件描述符为2
2.重定向命令列表
命令说明
command > filestdout重定向到file
command < filestdin重定向到file中(从文件中写入)
command >> filestdout以追加的方式重定向到file
command n > file将文件描述符n重定向到file
command n >> file将文件描述符n以追加方式重定向到file
3.输入和输出重定向
echo -e "Hello \c" > output.txt  # 将stdout重定向到output.txt中
echo "World" >> output.txt  # 将字符串追加到output.txt中read str < output.txt  # 从output.txt中读取字符串echo $str  # 输出结果:Hello World
4.同时重定io
acs@9e0ebfcd82d7:~$ chmod +x test.sh  # 添加可执行权限
acs@9e0ebfcd82d7:~$ ./test.sh < input.txt > output.txt  # 从input.txt中读取内容,将输出写入output.txt中
DAs@9e0ebfcd82d7:~$ cat output.txt  # 查看output.txt中的内容
7

引入外部脚本

  • 语法格式

    . filename  # 注意点和文件名之间有一个空格
    #或
    source filename
    
  • 示例

    #创建test1.sh
    #! /bin/bashname=abc  # 定义变量name#创建test2.sh
    #! /bin/bashsource test1.sh # 或 . test1.shecho My name is: $name  # 可以使用test1.sh中的变量
    

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

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

相关文章

Ubuntu上传文件到SMB共享文件夹

0. 前言 公司有一些数据共享文件夹&#xff0c;平时可以把开发的重要文件放到上面备份。本人开发使用ubuntu系统&#xff0c;共享文件夹是windows的形式&#xff0c;想通过命令的方式&#xff0c;方便快捷&#xff0c;还可shell脚本自动化。 1. 安装挂载库 sudo apt-get upd…

LeetCode [中等]98. 验证二叉搜索树

98. 验证二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子…

Nacos 架构原理

基本架构及概念​ 服务 (Service)​ 服务是指一个或一组软件功能&#xff08;例如特定信息的检索或一组操作的执行&#xff09;&#xff0c;其目的是不同的客户端可以为不同的目的重用&#xff08;例如通过跨进程的网络调用&#xff09;。Nacos 支持主流的服务生态&#xff0c…

Vue3 的 inject 和 provide (附源码)

一&#xff1a;前言 在前端项目中牵扯的最多的莫过于组件之间的传值了&#xff0c;除了最最常用的 props 和 emit&#xff0c;其实在 Vue 中还额外提供了另外几种方法。今天分享一种组件之间通信的方法&#xff1a;provide 和 inject。 二&#xff1a;使用 1、目录结构 以下是…

配置攻击防范示例

1、组网需求。 如果局域网内存在Hacker向SwitchA发起畸形报文攻击、分片报文攻击和泛洪攻击&#xff0c;将会造成SwitchA瘫痪。为了预防这种情况&#xff0c;管理员希望通过在SwitchA上部署各种攻击防范措施来为用户提供安全的网络环境&#xff0c;保障正常的网络服务。 2、配…

【测试开发】第五节.测试——自动化测试(Selenium工具)

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;Java测试开发 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 前言 一、…

匿名结构体类型、结构体的自引用、结构体的内存对齐以及结构体传参

文章目录 &#x1f680;前言&#x1f680;结构体✈️结构体类型的声明✈️结构体变量的创建与初始化✈️结构体类型的特殊声明✈️结构体的自引用✈️结构体的内存对齐&#x1f681;修改默认对齐数 ✈️结构体传参 &#x1f680;前言 在C语言中有着各种数据类型&#xff0c;这…

Linux部署HDFS集群

&#xff08;一&#xff09;VMware虚拟机中部署 ps、其中node1、node2、node3替换为自己相应节点的IP地址&#xff0c;或者host文件中配置过的主机名&#xff0c;或者看前置准备 或者查看前置准备&#xff1a;Linux部署HDFS集群前置准备 1.下载压缩包 https://www.apache.or…

ChatGPT 问世一周年之际,开源大模型能否迎头赶上?

就在11月30日&#xff0c;ChatGPT 迎来了它的问世一周年&#xff0c;这个来自 OpenAI 的强大AI在过去一年里取得了巨大的发展&#xff0c;迅速吸引各个领域的用户群体。 我们首先回忆一下 OpenAI和ChatGPT这一年的大事记&#xff08;表格由ChatGPT辅助生成&#xff09;&#x…

【模型报错记录】‘PromptForGeneration‘ object has no attribute ‘can_generate‘

通过这个连接中的方法解决&#xff1a; “PromptForGeneration”对象没有属性“can_generate” 期刊 #277 thunlp/OpenPrompt GitHub的 问题描述&#xff1a;在使用model.generate() 的时候报错&#xff1a;PromptForGeneration object has no attribute can_generate 解决方法…

MySQL安全相关——TDE和数据脱敏功能介绍

MySQL作为一款广泛使用的开源关系型数据库管理系统(RDBMS)&#xff0c;其安全性一直是开发者和企业关注的重点。在MySQL中&#xff0c;有一些与安全相关的功能&#xff0c;其中包括Transparent Data Encryption(TDE)和数据脱敏。本文将对这些功能进行介绍。 一、Transparent Da…

Python一键采集京*东商品数据,保存表格,零基础也能学会

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 开发环境: python 3.8 pycharm 专业版 模块使用&#xff1a; requests >>> 发送请求 第三方库 (需要安装) parsel >>> 第三方库 用来提取网…

RHCSA学习笔记(RHEL8) - Part1.RH124

Chapter Ⅰ 入门 - Linux 开源系统&#xff0c;命令行&#xff0c;模块化&#xff08;软件包的形势&#xff09; - Windows 闭源Linux是类UNIX系统&#xff0c;mac系统也是类UNIX系统&#xff0c;所以二者的图形化界面比较相似 开源许可证&#xff1a;公共版权&#xff1b;宽…

el-select实现可复制一段“关键词“(多个)实现搜索 以及 回车选中搜索项

el-select实现可复制一段"关键词"&#xff08;多个&#xff09;实现搜索 以及 回车选中搜索项 <el-selectref"productRef"filterableclearablev-model"fItem.productName"multiple:reserve-keyword"true"remote:filter-method&quo…

学校图书管理系统设计

基于ASP.NET MVC技术的图书管理系统的设计与实现 摘要&#xff1a;图书管理系统是一套高新科学技术和图书知识信息以及传统历史文化完美结合的体现。它改变了传统图书收藏的静态书本式图书服务特征&#xff0c;实现了多媒体存取、远程网络传输、智能化检索、跨库无缝链接、创造…

登录校验——JWT(JSON Web Token)介绍

目录 一、前后端分析二、JWT在前后端的联系1. 前端实现2. 后端实现 三、JWT在登录中的作用和优缺点1. 作用2. 优缺点 JWT&#xff08;JSON Web Token&#xff09;是一种在Java前后端分离项目中实现登录功能的常用方式。本文将对前后端的分析&#xff0c;JWT在前后端的联系以及其…

《地理信息系统原理》笔记/期末复习资料(8. 数字高程模型)

目录 8. 数字高程模型 8.1 概述 8.1.1 数字高程模型概念 8.1.2 数字高程模型特点 8.2 DEM数据分布特征 8.2.1 格网状数据 8.2.2 离散数据 8.3 DEM的表示方法 8.3.1 数学方法 8.3.2 图形方法 8.3.3 DEM三维表达方法 8.4 TIN的生成方法 8.4.1 人工方法 8.4.2 程序自…

selenium 工具 的基本使用

公司每天要做工作汇报&#xff0c;汇报使用的网页版&#xff0c; 所以又想起 selenium 这个老朋友了。 再次上手&#xff0c;发现很多接口都变了&#xff0c; 怎么说呢&#xff0c; 应该是易用性更强了&#xff0c; 不过还是得重新看看&#xff0c; 我这里是python3。 pip安装…

数字员工「取数宝」上新!4大优势,解决电商取数难题

全域电商&#xff0c;是近几年的新趋势&#xff0c;几乎所有商家都在布局全域&#xff0c;追求全域增长。但商家发现&#xff0c;随着投入成本的上涨&#xff0c;利润却没有增加。 其中最为突出的是——商家为保证全域数据的及时更新&#xff0c;通过堆人头的方式完成每日取数…

程序员的养生指南

亲爱的知友们&#xff0c;大家好&#xff01;今天&#xff0c;我将为大家带来一篇关于程序员养生的重要文章。作为一名资深的程序员&#xff0c;我深知健康对于我们的职业生活的重要性。因此&#xff0c;我将结合自己的经验和专业知识&#xff0c;为大家提供一份实用的程序员养…