(20)Shell脚本的书写

linux中的shell脚本,其实是系统中真正的命令。Shell语言写的程序不需编译.定义各种参数和变量、使用条件命令、控制结构以及其他高级特性。

一、shell脚本基本元素

1.1变量

定义:定义一个名称,将参数赋予给这个名称。就叫变量。变量名可以由字母、数字或者下划线组成,并且只能以字母或者下划线开头。

eg:比如a=1那么$a等于一。系统内置变量如USER指当前环境所用的用户。具体指向谁,结果会发送改变的叫变量。

1.2数据类型

1.2.1字符串

在shell中,加了引号的字符就是字符串类型  单引号  双引号  也可以不用引号

双引号 “ ”  弱引用  引号的特殊字符有意义,里面包含变量,会显示变量的值
单引号 ‘  ’ 强引用  引号内所有特殊字符都取消意义。里面是什么字符就是什么字符,没有定义。

[root@shell ~]# vim a.sh
[root@shell ~]# chmod +x a.sh 
[root@shell ~]# ./a.sh 
1
$a

注意:字符串包含空格必须加引号

1.2.2布尔值


它只能是True或False  就是真假是非。一般与正确输出,错误输出连用。

1.2.3浮点数,整数

就是平常数字,但是expr使用时,只能是整数,还要shell脚本不能直接进行数字的计算。

1.3、脚本执行方式

(1)使用绝对路径执行
(2)使用相对路径执行。语法格式:./a.sh
(3)使用sh或bash命令来执行。
语法格式:
sh a.sh 不需要执行权限
(4)使用.(空格)脚本名称来执行
语法格式:
.  a.sh   不需要执行权限,注意的是.后面有空格
(5)使用source来执行
语法格式:
source  a.sh 不需要执行权限(主要用于生效配置文件)

1.4、shebang机制

前面第一行,进行说明是哪个执行的脚本
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl

二、脚本的组成结构

1、脚本的组成


(1)开头:#!/bin/bash  其中符号#!是用来告诉系统我们是用什么解析器来执行的
(2)注释:以#开头行表示注释
(3)命令行的书写规则:一行为一条命令,一行多条命令时需用(;)分割,分割长命令可以使用反斜杠\


2、程序返回值


程序执行以后有两类返回值:
(1)程序执行的结果
(2)程序状态返回代码(0-255)
            0:正确执行
            1-255:错误执行 

3、写脚本注意事项


(1)开头加解释器:#!/bin/bash
(2)语法缩进,使用四个空格;多加注释说明
(3)命名建议规则:变量名大写,局部变量小写,函数名小写,名字体现出实际作用
(4)默认变量是全局的,在函数中变量local指定为局部变量,避免污染其他作用域
(5)有两个命令能帮助调试脚本:set -e 遇到执行非0时退出脚本  set -x打印执行过程
(6)写脚本一定要先测试再到生产上
(7)脚本中的命令一定要用绝对路径
(8)引用命令是需要用` `符号

[[:alpha:]]  代表任意大小写字母
[[:digit:]]   代表任意整数

三、脚本书写案例

3.1基本语法


(1)创建目录/tmp/zz
(2)切换到/tmp/zz目录
(3)创建目录a1b  b2c  6cy
(4)创建空文件 xy  x123y  123

[root@shell ~]# vim b.sh

#!/bin/bash
mkdir /tmp/zz
cd /tmp/zz
mkdir a1b b2c 6cy
touch xy x123y 123
[root@shell ~]# rm -rf /tmp/*

删除tmp下面所有的内容,防止影响实验结果
[root@shell ~]# chmod +x b.sh 
[root@shell ~]# ./b.sh 
[root@shell ~]# cd /tmp/zz/
[root@shell zz]# ls
123  6cy  a1b  b2c  x123y  xy

(5)列出当前目录下以a或者6开头的文件或目录,将这些文件或目录导入到/tmp/file1文件中
(6)列出当前目录下以字母开头,后跟着一个任意数字,再者后面跟任意长度字符的文件或目录,将这些文件或目录导入到/tmp/file2文件中

[root@shell zz]# ls | egrep ^'a|6'

[root@shell zz]# ls | ^[[:alpha:]][[:digit:]]

脚本在命令行都是可以执行的,先在命令行写出来,才能写出脚本

(1)创建目录/tmp/zz
(2)切换到/tmp/zz目录
(3)创建目录a1b  b2c  6cy
(4)创建空文件 xy  x123y  123
(5)列出当前目录下以a或者6开头的文件或目录,将这些文件或目录导入到/tmp/file1文件中
(6)列出当前目录下以字母开头,后跟着一个任意数字,再者后面跟任意长度字符的文件或目录,将这些文件或目录导入到/tmp/file2文件中

[root@shell ~]#vim b.sh

#!/bin/bash
mkdir /tmp/zz
cd /tmp/zz
mkdir a1b b2c 6cy
touch xy x123y 123
ls | egrep ^'a|6' > /tmp/file1
ls | egrep ^[[:alpha:]][[:digit:]] > /tmp/file2

[root@shell ~]# rm -rf /tmp/*
[root@shell ~]# ./b.sh 
[root@shell ~]# cd /tmp/
[root@shell tmp]# ls
file1  file2  zz

3.2、常用运算符和语法(重要内容)


原生的bash并不支持简单的数学运算,通常要通过其他命令来实现

a和b都是变量

a=1

b=1
加法   expr  $a + $b
减法   expr  $a - $b
乘法   expr  $a \* $b
除法   expr  $b / $a
取余   expr  $b % $a
赋值   a=$b
相等  [ $a == $b ]
不相等  [ $a != $b ]

&&   相当于是AND的关系,两个并且的意思

||   相当于是OR的关系,或者的意思

-eq     //测试两个整数是否相等
-ne     //测试两个整数是否不等
-gt     //测试一个数是否大于另一个数
-lt     //测试一个数是否小于另一个数
-ge     //大于或等于
-le     //小于或等于

==      //等值比较,检查==两边的内容是否一致,==两边都要有空格
!=      //检查两边内容是否不一致,不一致为真,一致为假
-z "string"     //测试指定字符串是否为空,空则为真,不空则为假
-n "string"     //测试指定字符串是否不空,不空则为真,空则为假

read -p //后面接文本,输入值

$? //返回状态码

-a      //与关系   &&
-o      //或关系   ||
!       //非关系    !=

 


A=3
B=6
let C=$A+$B    //let算术运算表达式
C=$[ $A+$B ]    //$[算术运算表达式]
C=$(( $A+$B ))    //$((算术运算表达式))
C=`expr $A + $B`   //expr  算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用,这里不是单引号,是电脑键盘右上角飘号下面的小飘号。
[root@shell ~]# vim c.sh 
#!/bin/bash
A=3
B=6
let C=$A+$B    
C1=$[ $A+$B ]    
C2=$(( $A+$B ))    
C3=`expr $A + $B`
echo $C $C1 $C2 $C3

[root@shell ~]# chmod +x c.sh

[root@shell ~]# ./c.sh 
9 9 9 9

3.3判断语句If

3.3.1、if的语法结构

if  条件;then
  执行的命令
fi

双分支if语法:
if  条件;then
   执行的命令1
else
   执行的命令2
fi

多分支if语法:
if  条件1;then
   执行命令1
elif 条件2;then
   执行命令2
elif 条件3;then
   执行命令3
else
   执行命令3
fi

3.3.2案例

后面比较数字的大小的案例用if语句来写

[root@shell ~]# vim a3.sh

#!/bin/bash
read -p '请输入要比较的两个参数:' n m
expr $n + $m >/dev/null 2>&1
[ $? -ne 0 ]&&{
        echo '输入的参数必须是整数'
        exit
}
if [ $n -gt $m ];then
        echo "$n大于$m"

elif [ $n -eq $m ];then
        echo "$n等于$m"
else
        echo "$n小于$m"
fi

[root@shell ~]# chmod +x a3.sh

[root@shell ~]# ./a3.sh 12 20
请输入要比较的两个参数:12 34
12小于34

3.4表达式的书写


中括号或者双中括号里面写表达式,注意前后都有空格
[ 条件表达式 ]
[[ 条件表达式 ]]
test 条件表达式

test -e 后面接参数,下面是判断当前目录是否有文件zz存在

[root@shell ~]# test -e zz && echo true || echo false
false
[root@shell ~]# cd /tmp/zz/
[root@shell zz]# cd /tmp/
[root@shell tmp]# test -e zz && echo true || echo false
true


[root@shell ~]# vim d.sh

#!/bin/bash
a=10
b=8
[ $a -eq $b ]
echo $?
[root@shell ~]# chmod +x d.sh 

eq是是否相等,$?是返回状态码,10不等于8返回状态码是1,1是标准错误
[root@shell ~]# ./d.sh 
1

[root@shell ~]# cat d.sh 
#!/bin/bash
a=10
b=8
[ $a != $b ]
echo $?

10不等于8,返回状态码为0,正确输出
[root@shell ~]# ./d.sh 
0

0--标准输入   1--标准输出   2---错误输出
>/dev/null 2>&1的作用就是让标准输出重定向到/dev/null中(丢弃标准输出),然后错误输出由于重用了标准输出的描述符,
所以错误输出也被定向到了/dev/null中,错误输出同样也被丢弃了。执行了这条命令之后,该条shell命令将不会输出任何信息到控制台,
也不会有任何信息输出到文件中



3.5小小测试一下吧

案例1:
判断是否是两个参数,如果不是两个参数,则显示“必须输入两个参数”,如果输入的是两个参数,则继续运行脚本
判断是否为整数,如果输入的不是整数,则显示“输入的参数必须是整数”,如果输入的整数,则继续执行脚本
比较大小,分为三个阶段:大于、等于、小于
第一种:传递参数

[root@shell ~]# vim a1.sh

#!/bin/bash
[ $# -ne 2 ]&&{
        echo '必须输入两个参数'
        exit
}

#‘#$’表示输入的所有值
expr $1 + $2 >/dev/null 2>&1
[ $? -ne 0 ]&&{
        echo '输入的参数必须是整数'
        exit
}

#expr计算表达式的关键字,后面接表达式,双引号弱引用。双引号在yaml语法中里面
[ $1 -gt $2 ]&&{
        echo "$1大于$2"
}
[ $1 -eq $2 ]&&{
        echo "$1等于$2"
}
[ $1 -lt $2 ]&&{
        echo "$1小于$2"
}
[root@shell ~]# chmod +x a1.sh 
[root@shell ~]# ./a1.sh 
必须输入两个参数
[root@shell ~]# ./a1.sh 12 22
12小于22

案例2:

[root@shell ~]# vim a2.sh
#!/bin/bash
echo "打印菜单,按照选择项选择你喜欢的食物"
cat <<EOF
   1.烤鸭
   2.烤鸡
   3.烤火腿肠
EOF

#cat <<EOF  打印内容,以EOF开头和结尾 EOF。
read -p "please input the num you like: " num
[ $num -eq 1 -o $num -eq 2 -o $num -eq 3 ]&&{
            [ $num -eq 1 ]&&{
                echo 'I guess you like 烤鸭!'
                exit 0
            }
            [ $num -eq 2 ]&&{
                echo 'I guess you like 烤鸡!'
                exit 0
            }
            [ $num -eq 3 ]&&{
                echo 'I guess you like 烤火腿肠!'
                exit 0
            }
}||{
            echo 'I guess not foot you are like!'
            exit 2
}

[root@shell ~]# chmod +x a2.sh 
[root@shell ~]# ./a2.sh 
打印菜单,按照选择项选择你喜欢的食物
   1.烤鸭
   2.烤鸡
   3.烤火腿肠
please input the num you like: 3
I guess you like 烤火腿肠!
 

四文件类型的判断

//存在性测试:
    -e      //测试文件是否存在
//存在性及类别测试:
    -b      //测试文件是否为块设备文件
    -c      //测试文件是否为字符设备文件
    -f      //测试文件是否为普通文件
    -d      //测试指定路径是否为目录
    -L      //测试文件是否为符号链接文件
    -p      //测试文件是否为命名管道文件
    -S      //测试文件是否为套接字文件
//文件权限测试:
    -r      //测试当前用户对指定文件是否有读权限
    -w      //测试当前用户对指定文件是否有写权限
    -x      //测试当前用户对指定文件是否有执行权限
//文件特殊权限测试:
    -g      //测试文件是否有sgid权限
    -u      //测试文件是否有suid权限
    -k      //测试文件是否有sticky权限
//文件大小测试:
    -s      //测试文件是否非空
//文件是否打开测试:
    -t fd   //fd表示的文件描述符是否已经打开且与某终端相关
//双目测试:
    file1 -ef file2     //测试file1与file2是否指向同一个设备上的相同inode,说白点就是两者是不是同一个文件
    file1 -nt file2     //测试file1是否比file2新
    file1 -ot file2     //测试file1是否比file2旧
//无分类:
    -N      //测试文件自从上一次被读取之后是否被修改过
    -O      //测试文件是否存在并且被当前用户拥有
    -G      //测试文件是否存在并且默认组是否为当前用户组

[root@shell ~]# cd /tmp/
[root@shell tmp]# rm -rf *
[root@shell tmp]# ls
[root@shell tmp]# vim a.sh

#!/bin/bash
touch  /tmp/file1
touch  /tmp/file2
mkdir /tmp/dir1
ln  -s  /tmp/dir1  /tmp/dir2
mkdir /tmp/dir3
chmod g+s /tmp/dir3

a=/tmp/file1
b=/tmp/file2
c=/tmp/dir1
d=/tmp/dir2
e=/tmp/dir3
f=/tmp/file4
[ -e $a ]&&echo "file1文件已存在"||echo "file1文件不存在"
[ -e $f ]&&echo "file4文件存在"||echo "file4文件不存在"
[ -f $b ]&&echo "file2这是一个普通文件"||echo "file2不是普通文件"
[ -d $c ]&&echo "dir1这是一个目录"||echo "dir1不是一个目录"
[ -L $d ]&&echo "dir2这是一个链接文件"||echo "dir2不是一个链接文件"
[ -g $e ]&&echo "dir3这个具有SGID权限"||echo "dir3不具有SGID权限"
 

[root@shell tmp]# chmod +x a.sh
[root@shell tmp]# ./a.sh 
file1文件已存在
file4文件不存在
file2这是一个普通文件
dir1这是一个目录
dir2这是一个链接文件
dir3这个具有SGID权限

[root@shell ~]# [ 1 -eq 0 ] && echo true || echo false
false
[root@shell ~]# [ 1 -eq 1 ] && echo true || echo false
true

五、for和while循环

5.1语法


for  变量名  in  取值列表
do
   命令序列(命令行)
done

5.2案例


示例1:
       下面使用for循环语句从列表文件中读取多个用户,然后为其逐一创建用户账户并设置密码。
首先创建用户名称的列表文件users.txt,每个用户名称单独一行。
[root@shell ~]# vim  /root/users.txt
jim
bob
marry
rose
mike

[root@shell ~]# for i in `cat /root/user.txt`
> do
> useradd $i
> echo "123" | password --stdin $i
> echo "$i" create success 
> done^C   //最后没有执行,但是执行的是这个命令

[root@shell ~]# cat user.sh 
#!/bin/bash
read -p "enter the user password:" PASSWD

#read -p文本输入参数,PASSWD,read -p后面的值默认是变量,变量$a第一次出现时,是创建变量,第二次出现时是调用变量
for UNAME in `cat /root/user.txt`

#将user.txt文件里面的名字,赋予给UNAME。for ..in是以此一个一个读取,如for i in {1..5}那么i的值为12345
do
        useradd $UNAME
        echo "$PASSWD" | passwd --stdin $UNAME

#设置密码,一条命令调用了两个参数,这里的echo是将密码给用户,下面的echo是输出一句话
        echo "$UNAME",create success
done

[root@shell ~]# chmod +x user.sh 
[root@shell ~]# ./user.sh 
enter the user password:123

5.2、for自增,自减

示例2:
循环输出1-10
#!/bin/bash
for ((i=1;i<=10;i++))               //自增1
do
        echo $i
done


for ((i=1;i<=10;i+=2))               //自增2

5.3、for数值的循环


用for语句,输出1-100的所有整数和
#!/bin/bash
a=0                                  //先定义一个和的变量
for ((i=1;i<=100;i++))
do
        a=$(($a+$i))          //循环赋值(1+..+100)的和给a
done
echo "1-100所有整数相加的和未$a"

[root@shell ~]# vim 5a.sh 
#!/bin/bash
for ((i=1;i<=10;i++))
do
    echo $i
done

for ((a=1;a<=10;a+=2))
do
    echo $a
done
[root@shell ~]# ./5a.sh 
1
2
3
4
5
6
7
8
9
10
1
3
5
7
9

5.5、for主机ip循环ping通

开一台192.168.121.40的虚拟机

[root@shell ~]# vim ip.txt

192.168.121.30
192.168.121.40
192.168.121.50
[root@shell ~]# vim ip.sh

#!/bin/bash
ip=$(cat /root/ip.txt)

#$第一次出现,设置变量变量ip
for i in $ip

#调用变量ip,也就是ip.txt的数值
do
ping -c 3 $i &>/dev/null

#/dev/null是一个空目录,把文件放到这里,就等于删除了。恢复不了
if [ $? -eq 0 ];then
        echo "$i通"
else
        echo "$i不通"
fi
done
[root@shell ~]# chmod +x ip.sh 
[root@shell ~]# ./ip.sh 
192.168.121.30通
192.168.121.40通
192.168.121.50不通

5.6、while循环和嵌套循环

5.6.1for的嵌套循环

下面的脚本循环25次1然后1到5;2然后1到5

#!/bin/bash
for ((a=1;a<=5;a++))
do
        echo "a=$a"
        for ((b=1;b<=5;b++))
        do
                echo "b=$b"
        done
done

while循环
显示0-10的所有整数
#!/bin/bash
a=0
while [ $a -le 10 ]
do
        echo $a
        let a++
done

示例2:
求1-100的整数和
#!/bin/bash
i=0
n=1
while [ $n -le 100 ]
do
i=$(( $i + $n ))
let n++
done
echo "1-100的和为:$i"

5.7、猜数字游戏

# expr $RANDOM % 100

43

$RANDOM是随机数linux的内置变量,% 后面接数值100,在100里面取随机数

示例3:
随机猜数字游戏,1000以内的猜数字游戏
#!/bin/bash
num=$(expr $RANDOM % 1000)
a=0
echo "数字范围为0-999的整数,猜猜看"
while true
do
read -p "请输入你猜的整数:" n
let a++
if [ $n -eq $num ];then
    echo "恭喜你答对了,数字为$num"
    echo "你总共猜了$a次"
    exit 0
elif [ $n -gt $num ];then
    echo "你猜高了"
else
    echo "你猜低了"
fi
done
自己写吧,不想写了

5.7、break和continue


在内循环执行break 就跳出当前的内循环了,去执行外循环了
作用:
1跳出当前循环
2并且break下面的语句不去执行
(1)break,我们可以通过内外循环的输出来看break的特性。
#!/bin/bash
#break
for(( a=1;a<=5; a++ ))
do
  echo "outside $a"
  for ((b=1;b<=5;b++ ))
  do
     if [ $b -eq 4 ]
      then
      break                   #这里当b=4的时候,进行break,不进行后面的输出$b.
     fi
   echo "inside $b "
  done

done

outside 1
inside 1
inside 2
inside 3
outside 2
inside 1
inside 2
inside 3
outside 3
inside 1
inside 2
inside 3
outside 4
inside 1
inside 2
inside 3
outside 5
inside 1
inside 2
inside 3

内循环到4就停止了,5就不去判断了

(2)continue
中止某次循环,不会完全终止整个命令
#!/bin/bash
#continue
for (( a=1;a<=15;a++))
do
    if [ $a -gt 5 ] && [ $a -lt 10 ]
    then
       continue
    fi
   echo " $a "
done

[root@rhel8 ~]# ./e.sh
1
2
3
4
5
10
11
12
13
14
15


六、写出九九乘法表

[root@shell ~]# vim zz.sh

#!/bin/bash                                                                                       
for ((i=1;i<=9;i++))                              
do

    for((n=1;n<=$i;n++))
    do
        echo -n  " $n*$i = $(expr $n \* $i )  "
    done
    echo
done
 

[root@shell ~]# chmod +x zz.sh 
[root@shell ~]# ./zz.sh 

七、正则表达式匹配文本语法和规则

7.1、概念


正则表达式是你所定义的模式模板, Linux工具可以用它来过滤文本。 Linux 工具(比如sed编辑器或gawk程序)
能够在处理数据时使用正则表达式对数据进行模式匹配。如果数据匹配模式,它就会被接受并进一步处理;
如果数据不匹配模式,它就会被滤掉。

正则表达式(或称Regular Expression,简称RE),是用于描述字符排列和匹配模式的一种语法规则。
它主要用于字符串的分割,匹配、査找及替换操作。即正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串


7.2、基础正则(重要)


1、基础正则常见元字符(支付的工具:grep、egrep、sed、awk)
\ :转义字符,用于取消特殊符号的含义,例:\! 、\n、\$等
^ :匹配字符串开始的位置,例:^a、^the、^#、^[a-z]
$ :匹配字符串结束的位置,例: word$、 ^$匹配空行
. :匹配除\n之外的任意的一个字符,例: lo.*k、lo.k、l..k
* : 匹配前面一个字符出现0次或者多次,例: loo*k、lo*k
[list] : 匹配list列表中的一个字符,例: go[ola]d, [abc]、 [a-z]、 [a-z0-9]、 [0-9]匹配任意一位数字
[^list] : 匹配任意非list列表中的一个字符,例: [^0-9]、[^A-Z0-9]、 [^a-z]匹配任意一位非小写字母
\{n\} : 匹配前面一个字符n次,例: lo\{2\}k、 '[0-9]\{2\}'匹配两位数字
\{n,\} : 匹配前面一个字符不少于n次,例: lo\{2,\}k、 '[0-9]\{2,\}'匹配两位及两位以上数字
\{n,m\} : 匹配前面一个字符n到m次,例: lo\{2,3\}k、 '[0-9]\{2,3\}'匹配两位到三位数字

注: egrep、 awk使用{n}、{n,}、 {n, m}匹配时“{}"前不用加“\”

[root@shell ~]# vim ze.txt
lk
lok
look
loook
looooook
loooooaaak
looooooook
abbbbcd
abbbbcd666
ooooloooook
oooooolk
aoblck
[root@shell ~]# grep "lo.k" ze.txt
look
[root@shell ~]# grep "lo..k" ze.txt
loook
[root@shell ~]# grep "lo.*k" ze.txt 
lok
look
loook
looooook
loooooaaak
looooooook
ooooloooook

[root@shell ~]# grep "lo\{3,5\}k" ze.txt

o出现3到5次
loook
ooooloooook

7~分个段把

[root@shell ~]# vim ze2.txt 
aa
abd
cdd
cdc
cdd

[root@shell ~]# grep "^$" ze2.txt 

^$代表空行,“^(.*)$”双引号里面的代表任意字符

[root@shell ~]#  grep "d$" ze2.txt
[root@shell ~]# grep "^c" ze2.txt 

[root@shell ~]# egrep "lo{3,5}k" ze.txt
loook
ooooloooook
egrep和grep的区别是grep不能使用正则的符号^、$、{}、……等,但是egrep使用使用

扩展正则和内置参数:


+ : 匹配前面一个字符1次以上,例: lo+k, 将匹配至少一个o,如lok、look、loook等
 
? : 匹配前面一个字符0次或者1次,例: lo?k,将匹配lk或lok
 
() : 将括号中的字符串作为一个整体,例: l(oo)+k, 将匹配oo整体1次以上,如look、looook等
 
| : 以或的方式匹配字符串,例: l(oo|ab)k, 将匹配look或者labk
{} :允许为可重复的正则表达式指定一个上限,这通常称为间隔(interval)
    {n} 重复n次;{n,} 重复n次或更多次;{n,m} 重复n到m次

特殊的字符组
组                 描 述
[[:alpha:]]     匹配任意字母字符,不管是大写还是小写
[[:alnum:]]     匹配任意字母数字字符0~9、 A~Z或a~z
[[:blank:]]     匹配空格或tab键
[[:digit:]]     匹配0~9之间的数字
[[:lower:]]     匹配小写字母字符a~z
[[:print:]]     匹配任意可打印字符
[[:punct:]]     匹配标点符号
[[:space:]]     匹配任意空白字符:空格、tab、 NL、 FF、 VT和CR
[[:upper:]]     匹配任意大写字母字符A~Z

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C++【类和对象】(一)

文章目录 前言1.类的定义1.1类定义格式1.2 访问限定符1.3 类域 2. 实例化2.1 实例化的概念2.2 对象大小 3.this指针结语 前言 在前文我们讲解了C基础语法知识。本文将会讲解C的类和对象。 1.类的定义 1.1类定义格式 class name {}&#xff1b;class为定义类的关键字&#x…

Linux进阶命令-rsync

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 经过上一章Linux日志的讲解&#xff0c;我们对Linux系统自带的日志服务已经有了一些了解。我们接下来将讲解一些进阶命令&am…

erlang学习:Linux常用命令2

目录操作命令 对目录进行基本操作 相关cd切换目录之类的就直接省去了&#xff0c;以下操作中都会用到 查看当前目录下的所有目录和文件 ls 列表查看当前目录下的所有目录和文件&#xff08;列表查看&#xff0c;显示更多信息&#xff09; ls -l 或 ll 在当前目录下创建一个…

高性能并发计数器的比较

参考文档&#xff1a;https://baijiahao.baidu.com/s?id1742540809477784106&wfrspider&forpc 一、常用的并发计数方法 1、synchronized synchronized早期是一个重量级锁&#xff0c;因为线程竞争锁会引起操作系统用户态和内核态切换&#xff0c;浪费资源&#xff…

Element Plus中button按钮相关大全

一、基本用法 使用 type、plain、round 和 circle 来定义按钮的样式。 样式代码如下&#xff1a; <template><div class"mb-4"><el-button>Default</el-button><el-button type"primary">Primary</el-button><el…

C语言常见字符串函数模拟实现一

strlen模拟实现 重点&#xff1a;1.字符串已经\0作为结束标志&#xff0c;strlen返回的是字符串\0前面出现的字符个数&#xff08;不包含\0&#xff09; 2.参数指向的字符串必须要以\0结束。 3.注意函数的返回值是size_t&#xff0c;是无符号的&#xff0c;加减是无法对比的。…

卡西欧相机SD卡格式化后数据恢复指南

在数字摄影时代&#xff0c;卡西欧相机以其卓越的性能和便携性成为了众多摄影爱好者的首选。然而&#xff0c;随着拍摄量的增加&#xff0c;SD卡中的数据管理变得尤为重要。不幸的是&#xff0c;有时我们可能会因为操作失误或系统故障而将SD卡格式化&#xff0c;导致珍贵的照片…

数据类型转换中存在的问题分析

隐式类型转换&#xff08;implicit type conversion&#xff09; 隐式类型转换&#xff08;implicit type conversion&#xff09;包括整型提升&#xff08;integer promotion&#xff09;和标准算数转换&#xff08;usual arithmetic conversions&#xff09; 遵循较大范围优…

堡垒机(Bastion Host)概述

Bastion Host 堡垒机 一、什么是堡垒机&#xff1f; A bastion host is a computer specially designed to mitigate cyberattacks and manage access rights to an internal network. 堡垒机Bastion Host是一种专门设计用于缓解网络攻击并管理内部网络访问权限的计算机。 在…

肖扬新书《微权力下的项目管理》读书笔记2

一个核心思想&#xff1a;“借力” 合格的项目经理是不热衷于培养人的。项目经理的工作场景和职能经理的工作场景往往有很 大不同。职能经理的工作方式通常适用于常态化工作&#xff0c;要有足够的时间去培养人&#xff0c;先把人培 养起来&#xff0c;然后再干事&#xff0c;可…

加油卡APP定制搭建,让加油更便捷!

在汽车时代中&#xff0c;汽车的数量不断增加&#xff0c;加油已经成为了大众生活中不可缺少的一部分。同时&#xff0c;加油卡的出现也为大众的汽车加油提供了更多的优惠方式&#xff0c;为大众节省经济开支&#xff0c;为车主带来便利&#xff1b;同时加油卡的发展也提高了加…

2024年华为杯研赛(E题)数学建模竞赛解题思路|完整代码论文集合

我是Tina表姐&#xff0c;毕业于中国人民大学&#xff0c;对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在&#xff0c;我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…

如何远程访问局域网内的电脑?局域网内远程桌面怎么实现?揭秘4种干货技巧

想象一下&#xff0c;你正在办公室A&#xff0c;而你想访问办公室B里的某台电脑&#xff0c;却不想起身到另一楼层甚至是另一个房间。 如何不动身就能控制局域网内的另一台电脑呢&#xff1f; 这并不是科幻&#xff0c;而是完全可以通过远程桌面技术来实现。 今天&#xff0…

学习Java(一)类和对象

package demo.ceshi;public class Puppy {private int age;private String name;//构造器public Puppy( String name){this.name name;System.out.println("公主的名字叫&#xff1a;"name);}//设置age的值public void setAge(int age){this.age age;System.out.pr…

智慧仓储-AI销量预测

1、预测系统技术选型 基础层&#xff1a; Hbase、ClickHouse、Hdfs 用来做数据存储 框架层&#xff1a; 以 Spark RDD、Spark SQL、Hive 为主&#xff0c; MapReduce 程序占一小部分&#xff0c;是原先遗留下来的&#xff0c;目前正逐步替换成 Spark RDD。 选择 Spark 除了对…

rsyslogd 内存占用很高解决方案

在Kubernetes&#xff08;K8S&#xff09;集群中&#xff0c;监控日志是非常重要的&#xff0c;而rsyslogd是Linux系统中用于处理系统和应用程序日志的守护进程。有时候rsyslogd可能会占用较高的内存&#xff0c;这时候我们就需要对其进行优化和调整。 阿里云虚拟服务器&…

创客中国AIGC专题赛冠军天鹜科技:AI蛋白质设计引领者

“落霞与孤鹜齐飞,秋水共长天一色——这句出自《滕王阁序》的诗句,是我作为江西人熟记于心的佳句。它描绘的天地壮丽景色常浮现于我的脑海,正是这种豁达与壮观,启发我们将公司命名为‘天鹜科技’,我们希望将源自自然的蛋白质与现代科技的创新精神相结合,打造蛋白质设计与应用的…

16_Python的迭代器

在Python中&#xff0c;迭代是一个非常重要的概念。迭代通常指的是按照某种顺序逐个访问容器中的元素的行为。如使用for循环遍历取值的过程。 可迭代对象&#xff08;Iterable&#xff09; 可迭代对象是任何可以返回一个迭代器的对象。简单来说&#xff0c;它是可以逐一返回其…

机器学习模型中特征贡献度分析:预测贡献与错误贡献

在机器学习领域&#xff0c;特征重要性分析是一种广泛应用的模型解释工具。但是特征重要性并不等同于特征质量。本文将探讨特征重要性与特征有效性之间的关系&#xff0c;并引入两个关键概念&#xff1a;预测贡献度和错误贡献度。 核心概念 预测贡献度&#xff1a;衡量特征在…

【C++】—— stack queue deque

【C】—— stack & queue & deque 1 stack 与 queue 的函数接口2 适配器2.1 发现问题2.2 什么是适配器 3 stack 与 queue的模拟实现3.1 栈的基础框架3.2 栈的模拟实现3.3 队列的模拟实现 4 模板的按需实例化5 deque 的简单介绍5.1 vector 与list对比5.1.1 vector5.1.2 …