RHCE 函数与数组

news2024/11/23 18:37:52

第六章、函数和数组

6.1 函数

函数几乎是学习所有的程序设计语言时都必须过的一关。对于学习过其他的程序语言的用户来说,函数可能并不陌生。但是Shell中的函数与其他的程序设计语言的函数有许多不同之处。为了使用户了解Shell中的函数,本节将介绍函数的相关基础知识。

6.1.1 什么是函数

通俗地将,所谓函数就是将一组功能相对独立的代码集中起来,形成一个代码块,这个代码可以完成某个具体的功能。从上面的定义可以看出,Shell中的函数的概念与其他的语言的函数的概念并没有太大的区别。从本质上讲,函数是一个函数名到某个代码块的映射。也就是说,用户在定义了函数之后,就可以通过函数名来调用其所对应的一组代码。

使用shell函数优势

1、把相同的程序段定义为函数,可以减少整个程序段代码量,提升开发效率。

2、增加程序段可读性、易读性,提升管理效率。

3、可以实现程序功能模块化,使得程序具备通用性(可移植性)。

函数定义不会被执行,只有调用该函数才会被执行,定义在脚本文件最前面或者定义在函数调用前

函数和循环的区别:函数有传参和返回值,循环没有

函数一般可以执行相对功能,循环一般是对数据处理。

查看所有变量:set 请注意,set 命令不仅会列出环境变量,还会列出所有的 shell 变量

6.1.2 函数语法

1.
function 函数名() {        
    指令
    return
}
简化写法2:
function 函数名 {		————————————————————函数名和{之间必须要有空格
    指令
    return
}

简化写法3:
函数名() {
    指令
    return
}

函数命名规则:字母,数字,下划线组成

6.1.3 函数的返回值

首先,用户可以使用return语句来返回某个数值,这与绝大部分的程序设计语言是相同的。但是,在Shell中,return语句只能返回某个0~255之间的整数值。

返回代码执行之后的状态值

函数执行时匹配到return[0-255]:结束函数的执行;匹配到exit:结束当前脚本

6.1.4 函数的调用

在Shell中,函数调用的基本语法如下: function_name param1 param2 … 在上面的语法中,function_name表示函数名称,其后面跟的param1、param2…表示函数的参数。

函数执行:

调用函数: 直接执行函数名即可。 函数名

带参数的函数执行方法: 函数名 参数

6.1.5函数定义以及调用函数的方式 0-255 0 1-255

1.函数的定义及调用

#function printMsg() {                 //--函数定义的三种语法
#function printMsg {
printMsg() {
#	echo “hello shell”       //静态赋值--默认有参数值,直接调用函数
@	echo $1                           //默认没有参数值
	echo "$msg"                  
}
printMsg                                   
printMsg $1                        //  通过执行脚本调用函数时通过位置变量参入参数值   
read -p " Please input str…" msg      //函数调用通过变量传入参数值
printMsg $msg
--------------------------------------------------
注:[root@localhost /]# ./xx.sh hello world
Hello    ---若传入一个位置参数值,值中间有空格则需要将“$1”用=引号引用。 传入的值“hello world”用引号无用。
注:函数三种定义方式如果有()大括号前有无空格无所谓,但第二种函数定义无小括号,大括号后面必须加至少一个空格

2.return关键字接收函数返回值默认返回值为0-255,如果是其他字符则会报语法错误。

#function printMsg() {                 
#function printMsg {
printMsg() {
	return   3          //--不写默认为0    
	return $1                           
	return "$msg"       //-表示打断并返回值所以echo指令不执行
	echo " hello shell"            
}
printMsg                                   
printMsg $1                        
read -p " Please input str…" msg      
printMsg $msg
echo $?
-----------------------------------------------------------
注:打断程序接收函数返回值,返回值可以直接定义也可以调用函数传入返回值返回值范围0-255,输入其他字符报语法错误。“: line 3: return: msg: numeric argument required//
返回:msg:需要数字参数”、

第一种:1.无参数,无返回值

#ping1.sh
PING() {  
    if ping -c 2 -w 0.2 -i 0.1 www.baidu.com &>/dev/null; then  
        echo "up"  
    else  
        echo "down"  
    fi  
}  

PING
特殊
Msg (){
echo $1
}

Msg $1

[root@localhost ~]# bash zixi.sh hello world   
hello
[root@localhost ~]# bash zixi.sh "hello world"
hello
在函数调用时传入的是一个位置变量参数,那么哪怕是 用双引号将多个空格连接的参数 它也识别的是多个参数。

Msg (){
echo $1
}

Msg "$1"

[root@localhost ~]# bash zixi.sh "hello world"
hello world
Msg "$1"。引用变量时加上双引号

第二种:有参数,无返回值

#!/bin/bash 
PING() {
        if $(ping $ip -c 2 -w  0.2 -i 0.1 &>/dev/null) ;then
                echo "up"
        else
                echo "down"
        fi
}
read -p "..." ip
PING $ip

第三种:无参数,有返回值

echo $?:查看命令是否执行成功,成功为0,失败为1

#!/bin/bash 
PING() {
        if $(ping www.baidu.com -c 2 -w  0.2 -i 0.1 &>/dev/null) ;then
                return 0
        else
                return 1
        fi
}
PING
echo $?

第四种:有参数,有返回值

#!/bin/bash 
PING() {
        if $(ping $ip  -c 2 -w  0.2 -i 0.1 &>/dev/null) ;then
                return 0
        else
                return 1
        fi
}
read -p "..." ip
PING $ip
echo $?

函数案例

示例1:写一个脚本,判定192.168.0.200-192.168.0.254之间的主机哪些在线。

要求: 1、使用函数来实现一台主机的判定过程;

2、在主程序中来调用此函数判定指定范围内的所有主机的在线情况。

#直接使用函数实现(无参数,无返回值)

#!/bin/bash
#
PING() {
  for I in {200..254};do
    if ping -c 1 -W 1 192.168.0.$I &> /dev/null; then
 
      echo "192.168.0.$I is up."
    else
      echo "192.168.0.$I is down."
    fi
  done 
}
  
PING

#无参数有返回值

#!/bin/bash 
PING() {
       if $(ping www.baidu.com -c 2 -w  0.2 -i 0.1 &>/dev/null) ;then
            return 0
      else
      		return 1
      fi
}
PING
echo $?
if [ $? -eq 0 ];then
	echo up
else
	down 
fi

#使用函数传参(有参数,无返回值)

#!/bin/bash
#
PING() {
    if ping -c 1 -W 1 $1 &> /dev/null; then
      echo "$1 is up."
    else
      echo "$1 is down."
    fi
}

for I in {200..254}; do
  PING 192.168.0.$I
done

​ #使用函数返回值判断(有参数,有返回值)

#!/bin/bash
#
PING() {
    if ping -c 1 -W 1 $1 &> /dev/null; then
      return 0  
    else
      return 1
    fi
}

for I in {200..254}; do
  PING 192.168.0.$I
  if [ $? -eq 0 ]; then
    echo "192.168.0.$I is up."
  else
    echo "192.168.0.$I is down."
  fi
done

示例2:写一个脚本:使用函数完成

1、函数能够接受一个参数,参数为用户名;

判断一个用户是否存在

如果存在,就返回此用户的shell和UID;并返回正常状态值;

如果不存在,就说此用户不存在;并返回错误状态值;

2、在主程序中调用函数;

示例代码:

#!/bin/bash
#
user () {
if id $1 &> /dev/null ;then
   echo "`grep ^$1  /etc/passwd | cut -d: -f3,7`"
   return 0
else
   echo "no $1"
    return 1
fi
}
read -p "please input username:" username
until [ $username == q -o $username == Q ]; do
    user $username
    if [ $? == 0 ];then
        read -p "please input again:" username
    else
        read -p "no $username,please input again:" username
    fi
done

6.1.6 函数库文件

为了方便地重用这些功能,可以创建一些可重用的函数。这些函数可以单独地放在函数库文件中。本节将介绍如何在Shell程序中创建和调用函数库文件。

函数库文件定义

创建一个函数库文件的过程非常类似于编写一个Shell脚本。脚本与库文件之间的唯一区别在于函数库文件通常只包括函数,而脚本中则可以既包括函数和变量的定义,又包括可执行的代码。此处所说的可执行代码,是指位于函数外部的代码,当脚本被载入后,这些代码会立即被执行,毋需另外调用。

函数库文件的调用

当库文件定义好之后,用户就可以在程序中载入库文件,并且调用其中的函数。在Shell中,载入库文件的命令为.,即一个圆点,其语法如下: . filename 其中,参数filename表示库文件的名称,必须是一个合法的文件名。

库文件可以使用相对路径,也可以使用绝对路径,另外,圆点命令和库文件名之间有一个空格。. f1.sh 或者 . /root/f1.sh source f1.sh

[root@localhost day]# cat f1.sh  aaa.sh 
PING() {
     if	`ping -c 2 $ip &>/dev/null` ;then
	echo  $ip=up
     else	
	echo $ip=down
    fi 
}
------------------------------------------·-
#!/bin/bash
. f1.sh
ip=www.baidu.com
PING $ip
Vim fun.sh
#!/bin/bash
user () {
        if id $1 &> /dev/null ;then
                echo "`grep "^$1"  /etc/passwd | cut -d: -f3,7`"
                return 10
        else
                echo "no $1"
                return 1
        fi
}
user $1
------------------------------------------------
Vim fun3.sh
#!/bin/bash
read -p "please input username:" username
until [ $username == q -o $username == Q ]; do
        ./fun.sh $username
    if [ $? == 10 ];then
        read -p "please input again:" username
    else
        read -p "no $username ;please input again:" username
    fi
done
#!/bin/bash 
PING() {
        if $(ping $ip  -c 2 -w  0.2 -i 0.1 &>/dev/null) ;then
                return 0
        else
                return 1
        fi
}
read -p "..." ip
PING $ip
echo $?
-------------------------------
#!/bin/bash
[ -f n.sh ] && .  /n.sh
调用函数库文件
例子:函数配置nginx服务
[root@localhost ~]# cat day6.sh
nginx_service() {
	cat <<EOF >/etc/nginx/conf.d/day6.conf
#默认写入文件位于行首的话就不要加缩进
server {
	listen 192.168.111.130:8909;
	root /day6;

}
EOF
	mkdir /day6
	echo this is test > /day6/index.html
	systemctl restart nginx
	if [ $? -eq 0  ];then
		curl http://192.168.111.130:8909
	else
		echo "服务启动失败"
		cat /etc/nginx/conf.d/day6.conf
	fi
}

[root@localhost ~]# cat day6_1.sh
#只能用./filename或者source运行
source day6.sh

if ` command -v nginx &> /dev/null`;then
	nginx_service 	
else
	mount /dev/sr0 /mnt &> /dev/null
	dnf install nginx -y &> /dev/null
	if [ $? -eq 0  ];then
		nginx_service 
	else
		echo nginx安装失败
	fi
fi
[root@localhost ~]# bash -n  day6_1.sh  ------语法检测
[root@localhost ~]# bash day6_1.sh
mkdir: 无法创建目录 “/day6”: 文件已存在
this is test


会出现的问题:显示之前网页的内容
解决方法:使用多IP访问多网站或者多端口访问多网站
查看IP:
[root@localhost ~]# hostname -I
192.168.111.130 

6.1.7 递归函数

Linux的Shell也支持函数的递归调用。也就是说,函数可以直接或者间接地调用自身。在函数的递归调用中,函数既是调用者,又是被调用者。作为一个Shell函数介绍的补充内容,本节将介绍如何在Shell中实现递归函数。 递归函数的调用过程就是反复地调用其自身,每调用一次就进入新的一层。

递归求阶乘示例:

fact() {
#被乘数num  5   4  3 2       5*4*3*2
  local num=$1
  local fac   #累乘结果
 
#当被乘数为1时直接输出递乘为1.
   if ((num==1));then
      fac=1
#若果大于一,则被乘数递减为乘数
   else
       ((dec=num-1))     4  3   2  1
       fact $dec    #递归函数--#循环次数 4 3 2 1
       
       fac=$?     #1  5   20  60   120
       fac=`expr $num \* $fac`  #5*1=5   4*5  3*20 2*60=120  1*120
    fi
   return $fac    #5 20  60  120
}
fact $1
echo $? 
-------------------------------------
res=1
read -p "请输入数值" n
for ((i=1;i<=n;i++));do   #i=1
        echo $i
        let res*=i   #res=res*i
done
echo $res
  1. 递归遍历目录

    #多层级路径文件类型判断
    [root@localhost ~]# cat digui.sh
    #read -p "请输入要判断的文件路径:" dir
    #for file in ` ls $dir`;do
    #	if [ -f $dir/$file  ];then
    #		echo $dir/$file是文本文件
    #	else
    #		echo $dir/$file是目录文件
    #		for file1 in `ls $dir/$file`;do
    #			if [ -f $dir/$file/$file1  ];then
    #				echo $dir/$file/$file1是文本文件
    #			else
    #				echo $dir/$file/$file1是目录文件
    #			fi
    #			
    #		done
    #	fi
    #done
    
    file_type(){
    		for file1 in `ls $1`;do 
                            if [ -f $1/$file1  ];then 
                                    echo $1/$file1是文本文件
                            else
                                    echo $1/$file1是目录文件
                            	file_type $1/$file1
    			fi
    
                    done
    
    }
    file_type $1
    [root@localhost ~]# bash digui.sh /day6
    /day6/d1是目录文件
    /day6/d1/t1是目录文件
    /day6/d1/t2是目录文件
    /day6/d1/t3是目录文件
    /day6/d2是目录文件
    /day6/d2/t1是目录文件
    /day6/d2/t2是目录文件
    /day6/d2/t3是目录文件
    /day6/d3是目录文件
    /day6/d3/t1是目录文件
    /day6/d3/t2是目录文件
    /day6/d3/t3是目录文件
    /day6/index.html是文本文件
    
    
    
    
    #!/bin/bash
       read -p "请输入遍历路径" path
               for var in `ls $path`;do
                       if [ -d $path/$var ];then
                               echo "-d $path/$var"
                               for var1 in `ls $path/$var`;do
                                       if [ -d $path/$var/$var1 ];then
                                               echo -d $path/$var/$var1
                                       else
                                               echo "- $path/$var/$var1"
    
                                       fi
                               done
                       else
                               echo "- ${var}"
                       fi
    
         done
       #遍历深层次文件
       #/test/1/2/3
       #函数在他的函数体内调用他自身称为递归调用,没执行一次进入新的一层。
       #递归定义式:ls /test ls /test/1 ls /test/1/2    ls /test/1/2/3
       #终止条件当多级结构下没有文件是终止
       read -p "请输入遍历路径" path
       list() {
       	for var in `ls $1`;do
       		if [ -d $1/${var} ];then
       			echo d $var
       			list "$1/$var"
       		else
       			echo "- ${var}"
       		fi
         done
       }
       list ${path}
    
    #打印100-1
    function show() {
    	 if test $1 -eq 0;then
    			return
    	 fi
    	 echo $1
       show  `expr $1 - 1`
    }
    show 100
    
笔试题经常考:
.(){ .|.& };. 13个字符,递归死循环,可耗尽系统资源

代码解析: 
 .() 定义一个名字为 . 的函数 
 { 函数块开始 
 .|.& 在后台递归调用函数 . 
 } 函数块结束 
 ; 与下一条执行语句隔开 
 . 再次调用函数
 
 [root@localhost ~]# .(){ .|.& };.
[1] 8412
[root@localhost ~]# 
[1]+  已完成               . | .

-f -d -L -p -S -b -c   -r -w -x

ls -F
* 代表[可执行文件](https://so.csdn.net/so/search?q=可执行文件&spm=1001.2101.3001.7020)
/ 代表目录
@ 代表链接文件
| 代表管道文件
= 代表套接字
\> 代表进程间通讯设备

6.2 数组

有序列的元素列表,将有限个相同类型的变量集合命名,数组中各个变量称为元素或分量或下标变量;用来区分各个元素的数字标号称为下标。----数组用户存放多个相同类型数据的集合。

Shell语言对于数组的支持非常强大。在Shell中,用户可以通过多种方式来创建一个数组。为了能够使读者充分了解数组的创建方法,本节将介绍其中最常用的几种数组定义方法。

6.2.1 定义数组

有了a变量后,还可以创建一个a数组,但默认保存数组

方法一:用小括号将变量值括起来赋值给数组变量,每个变量之间要用空格进行分隔。
array=(value1 value2 value3 … )

方法二:用小括号将变量值括起来,同时采用键值对的形式赋值。
array=([1]=one [2]=two [3]=three)

方法三:通过分别定义数组变量方法。
array[0]=a;array[1]=b;array[2]=c

方法四:动态的定义变量,并使用命令的输出结果作为数组的内容。
array=(命令)

array=(1 2 3 4 5)
array2=([0]=1 [1]=2 [2]=3 [3]=4 [4]=5)
array3[0]=1 
array3[1]=2 
array3[2]=3
array4=(`seq 5`)
array5=(`ls *.sh`)
array6=($@)
6.脚本中通过read给数组赋值
i=0
while [ $i -le 10 ];do
        echo -n "请输入你的名字" 
        read  name[i]
        let i++
done
echo ${name[@]}

#while read arr5[i]
#do
#       echo ${arr5[i]}
#               
#       let i++
#done <  /file

for v in `seq 1 3`
do
        read -p "输入元素" arr6[i]
        let i++
done
echo ${arr6[@]}


定义关联数组: 申明关联数组

普通数组的下标只能是整数,而关联数组的下标是字符串。当然也可以使用数字作为下标
关联数组虽然大部分操作类似普通数组,但是其实它不是数组,而是字典,里面存储着键值对,且键的顺序不是按自然顺序排列的。

申明关联数组变量
# declare -A ass_array1
# declare -A ass_array2

方法一: 一次赋一个值

数组名[索引]=变量值
# ass_array1[index1]=pear
# ass_array1[index2]=apple
# ass_array1[index3]=orange
# ass_array1[index4]=peach

方法二: 一次赋多个值

# ass_array2=([index1]=tom [index2]=jack [index3]=alice [index4]='bash shell')

查看数组:
declare -A ass_array1='([index4]="peach" [index1]="pear" [index2]="apple" [index3]="orange" )'
declare -A ass_array2='([index4]="bash shell" [index1]="tom" [index2]="jack" [index3]="alice" )'

访问数组元数:

# echo ${ass_array2[index2]}        
访问数组中的第二个元数
# echo ${ass_array2[@]}                 
访问数组中所有元数  等同于 echo ${array1[*]}
# echo ${#ass_array2[@]}                
获得数组元数的个数
# echo ${!ass_array2[@]}                
获得数组元数的索引

用函数给数组赋值

[root@localhost ~]# cat shuzu.sh
for i in 1 2 3;do
	read arr[$i]
done
echo 显示数组元素(下标变量值)${arr[*]}
echo 显示数组的下标值 ${!arr[*]}
echo 显示数组元素个数 ${#arr[@]}

[root@localhost ~]# bash shuzu.sh
5
9
6
显示数组元素(下标变量值)5 9 6
显示数组的下标值 1 2 3
显示数组元素个数 3

6.2.2 数组操作

获取所有元素:
# echo ${array[*]} # *和@ 都是代表所有元素
获取元素下标:!
# echo ${!array[@]}
获取数组长度: #
# echo ${#array[*]}
获取第一个元素:
# echo ${array[0]}
添加元素:
# array[3]=d
添加多个元素:
# array+=(e f g)
删除第一个元素:
# unset array[0] # 删除会保留元素下标
删除数组:
# unset array

遍历数组:

方法 1:使用数组元素索引
#!/bin/bash
IP=(192.168.1.1 192.168.1.2 192.168.1.3)
for ((i=0;i<${#IP[*]};i++)); do
	echo ${IP[$i]}
done
# bash test.sh
192.168.1.1
192.168.1.2
192.168.1.3

方法 2:使用数组元素个数
#!/bin/bash
IP=(192.168.1.1 192.168.1.2 192.168.1.3)
for IP in ${IP[*]}; do
echo $IP
done

6.2.3 数组案例

​ 1、从“标准输入”读入n次字符串,每次输入的字符串保存在数组array里

        i=0
        n=5
        while [ "$i" -lt $n ] ; do
            echo "Please input strings ... `expr $i + 1`"
            read array[$i]
             let i++
        done
        echo ${array[@]}

​ 2、将字符串里的字母逐个放入数组,并输出到“标准输出”

        chars='abcdefghijklmnopqrstuvwxyz'
        for (( i=0; i<${#chars}; i++ )) ; do
            array[$i]=${chars:$i:1}
            echo ${array[$i]}
        done
        
        ${chars:$i:1},表示从chars字符串的 $i 位置开始,获取 1 个字符

​ 3、把1-3 3个数字存到数组里 分别乘以8 然后依次输出。

#!/bin/bash
    
    array1=(`seq 3`)
    for ((i=0;i<${#array1[@]};i++))
    do
        echo $[${array1[$i]}*8] 
    done

练习:

1、编写函数,实现打印绿色OK和红色FAILED
   判断是否有参数,存在为Ok,不存在为FAILED
2、编写函数,实现判断是否无位置参数,如无参数,提示错误
3、编写函数实现两个数字做为参数,返回最大值
4、编写函数,实现两个整数位参数,计算加减乘除。
5、将/etc/shadow文件的每一行作为元数赋值给数组
6、使用关联数组统计文件/etc/passwd中用户使用的不同类型shell的数量
7、使用关联数组按扩展名统计指定目录中文件的数量
grep  [option...] 'pattern'  [FILENAME]
参数
-n  :显示行号
-o  :只显示匹配的内容
-q  :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容
-l  :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl 'root' /etc 
-A  :如果匹配成功,则将匹配行及其后n行一起打印出来
-B  :如果匹配成功,则将匹配行及其前n行一起打印出来
-C  :如果匹配成功,则将匹配行及其前后n行一起打印出来
--color
-c  :如果匹配成功,则将匹配到的行数打印出来
-E  :等于egrep,扩展
-i  :忽略大小写
-v  :取反,不匹配
-w:匹配单词
-x 仅选择与整行完全匹配的匹配项。精确匹配每行内容(包括行首行尾看不到的空格内容)
-R -r以递归方式读取每目录下的文件
指定过滤器
--exclude-dir=  指定过滤目录,排除目录顾虑选择
[root@node1 ~]# grep   -rl  'aaa' /path  --exclude-dir=2  (注:直接写子路径)
--exclude-from=file指定过滤器文件,通过文件内容指定要排除的文件名

总结: shell脚本异常处理

set 异常处理

set -u  检测脚本中变量是否未定义,未定义终止脚本

----------------------------------------------
set -e  bug模式开启相当于bug打断点,当脚本遇到返回值非零的情况,就错误退出,不会继续执行
(1)
set -e 
cat aaa.sh
echo 1
(2)
set -e 
cat aaa.sh | echo "123"  #注全部执行,原因是cat文件不存在失败,但|echo 正确,最终第一条命令的返回结果为0,所以代码全部运行
echo success 
对于set -e 检测不准精确可以通过 set -o pipefail 解决,管道后的命令优先管道前的命令所以返回值是管道前的命令的返回值
(3)
set -e 
set -o pipfail 
cat aaa.sh | echo "123"  #注全部不执行
---------------------------------------
set -x   set +x 仅显示指定范围内代码是否成功执行,显示执行过程

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

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

相关文章

三层交换机静态路由实验

1、前置知识 2、实验目的 3、实验器材&#xff1a; 3560-23PS交换机2台、主机4台、交叉线1根和直通网线4根。 4、实验规划及拓扑 实验要求&#xff1a; &#xff08;1&#xff09;在交换机A和交换机B上分别划分基于端口的VLAN&#xff1a; 交换机 VLAN 端口成员 交换机…

iOS构建版本以及Hbuilder打iOS的ipa包全流程

目录 Hbuilder打ipa包 打包之前进行应用配置 应用版本号设置 使用广告标识设置 iOS-云打包 下载并转移安装包 使用Transporter提交版本 应用简介 下载应用 账号登录 提交安装包到apple store connect 在apple开发者平台上确认 总结 本篇文章详细的介绍了使用Hbuil…

java学习-集合

为什么有集合&#xff1f; 自动扩容 数组&#xff1a;长度固定&#xff0c;可以存基本数据类型和引用数据类型 集合&#xff1a;长度可变&#xff0c;可以存引用数据类型&#xff0c;基本数据类型的话需要包装类 ArrayList public class studentTest {public static void m…

返回流类型接口的错误信息处理

返回流类型接口的错误信息处理 前言axios拦截器src/utils/request.ts对应接口 前言 返回流类型接口需要在响应成功回调里拦截&#xff0c;且该接口的status始终是200&#xff0c;尽管后端返回的code可能是非2xx&#xff0c;因此返回流类型的接口&#xff0c;其错误信息需要单独…

用宏实现简单的计算器

大家好&#xff0c;那么经过我们前面几期的学习&#xff0c;我们对宏有了一定的了解&#xff0c;那么我们今天就来试试实现一个简单的加减乘除运算。 我们的思路是使用三目操作符来分别进行加减和乘除的运算&#xff0c;然后用if判断来”进入相关的判断体进而来进行计算。当然…

WEB攻防-通用漏洞文件上传js验证mimeuser.ini语言特性

知识点&#xff1a; 1、文件上传-前端验证 2、文件上传-黑白名单 3、文件上传-user.ini妙用 4、文件上传-php语言特性 详细点&#xff1a; 1、检测层面&#xff1a;前端&#xff0c;后端等 2、检测内容&#xff1a;文件头&#xff0c;完整型&#xff0c;二次渲染等 3、检…

《Vue零基础教程》(3)创建第一个应用案例

1 应用实例 参考官方文档 https://cn.vuejs.org/api/application.html#create-app 示例 const {createApp} Vue// 通过createApp创建一个应用实例 const app createApp({/* 选项 */ }) console.log(app) 分析打印结果, 可知 应用实例是一个对象没有_开头的是公开属性/方…

复合瓦片切片集集合数量与性能关系验证

作者&#xff1a;lzzzz Sci瓦片聚合性能分析 需要聚合的图层越多&#xff0c;性能越低&#xff0c;目前测试以每个瓦片仅包含一个矢量面数据为例&#xff1a; sci数量 服务拉起耗时 前端加载&#xff08;单瓦片&#xff09; 100 10s 500ms 1000 5min 3s 10000 1hour …

大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

摄影:相机控色

摄影&#xff1a;相机控色 白平衡&#xff08;White Balance&#xff09;白平衡的作用&#xff1a; 白平衡的使用环境色温下相机色温下总结 白平衡偏移与包围白平衡包围 影调 白平衡&#xff08;White Balance&#xff09; 人眼看到的白色&#xff1a;会自动适应环境光线。 相…

性能监控利器:Ubuntu 22.04 上的 Zabbix 安装与配置指南

简介 今天我们来聊聊如何在 Ubuntu 22.04 上安装和配置 Zabbix。我们会用到 PostgreSQL 作为数据库后端&#xff0c;Nginx 作为 Web 服务器&#xff0c;并用 Let’s Encrypt SSL 证书来保驾护航。 什么是 Zabbix&#xff1f; Zabbix 是一个开源的网络监控和管理解决方案&…

队列基本实现

模板 int queue[10010]; int hh1,tt0; void push1(int x) {queue[tt]x; } void pop1() {if(hh>tt){cout<<"ERR_CANNOT_POP"<<endl;}else{hh;} } int query1() {if(hh>tt){cout<<"ERR_CANNOT_QUERY"<<endl;}return queue[hh…

【ArcGISPro】使用AI模型提取要素-提取车辆(目标识别)

示例数据下载 栅格数据从网上随便找一个带有车辆的栅格数据 f094a6b1e205cd4d30a2e0f816f0c6af.jpg (1200799) (588ku.com) 添加数据

GitLab|数据迁移

注意&#xff1a;新服务器GitLab版本需和旧版本一致 在旧服务器执行命令进行数据备份 gitlab-rake gitlab:backup:create 备份数据存储在 /var/opt/gitlab/backups/ 将备份数据传输到新服务器的/var/opt/gitlab/backups/下&#xff0c;并修改文件权限&#xff08;下载前和上传…

UE5 5.1.1创建C++项目,显示error C4668和error C4067的解决方法

因为工作要求&#xff0c;没法使用最新 5.5版本的ue5 而是要用ue5.1和5.2版本。 但是我在安装下载了visual studio2022后&#xff0c;使用 ue5.1编辑器 创建C项目&#xff0c;爆出如下错误。 error C4668: ?????__has_feature?????ΪԤ?????꣬???0????…

网络安全概论

一、 网络安全是一个综合性的技术。在Internet这样的环境中&#xff0c;其本身的目的就是为了提供一种开放式的交互环境&#xff0c;但是为了保护一些秘密信息&#xff0c;网络安全成为了在开放网络环境中必要的技术之一。网络安全技术是随着网络技术的进步逐步发展的。 网络安…

51单片机基础01 单片机最小系统

目录 一、什么是51单片机 二、51单片机的引脚介绍 1、VCC GND 2、XTAL1 2 3、RST 4、EA 5、PSEN 6、ALE 7、RXD、TXD 8、INT0、INT1 9、T0、T1 10、MOSI、MISO、SCK 11、WR、RD 12、通用IO P0 13、通用IO P1 14、通用IO P2 三、51单片机的最小系统 1、供电与…

DASCTF 2024 10月 Reverse 完成笔记 附题目

题目链接: https://github.com/Airrcat/long_long/tree/main/DASCTF_2024_10 ezre 查PE 32位无壳 开始分析 看起来很像加壳了 字符串未有暴露信息&#xff0c;但是段中有一个themida 发现是一个壳&#xff0c;直接去找脱壳机 一些脱壳工具&#xff08;Magicmida)是…

JavaScript 中 arguments、类数组与数组的深入解析

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;什么是 arguments 对象2.1 arguments 的定义2.2 arguments 的特性2.3 使用场景 &#x1f4af;深入了解 arguments 的结构3.1 arguments 的内部结构arguments 的关键属性 3.2 类数组…

Kafka 工作流程解析:从 Broker 工作原理、节点的服役、退役、副本的生成到数据存储与读写优化

Kafka&#xff1a;分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析&#xff1a;从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析&#xff1a…