五、流程控制之循环

目录

5.1 步进循环语句for

5.1.1 带列表的for循环语句

5.1.2 不带列表的for循环语句

5.1.3 类C风格的for循环语句

5.2 while循环语句

5.2.1 while循环读取文件

5.2.2 while循环语句示例

5.3 until循环语句

5.4 select循环语句

5.5 嵌套循环


5.1 步进循环语句for

for循环是最简单,也是最常用的循环语句。与其他的程序设计语言一样,for循环都是初学者在学习循环结构时的入门课程。for循环通常用于遍历整个对象或者数字列表。按照循环条件的不同,for循环语句可以分为带列表的for循环、不带列表的for循环以及类C风格的for循环。

5.1.1 带列表的for循环语句

带列表的for循环通常用于将一组语句执行已知的次数,其基本语法如下:

for variable in list
dostatement1statement2...
done

在上面的语法中,variable称为循环变量,list是一个列表,可以是一系列的数字或者字符串,元素之间使用空格隔开。do和done之间的所有的语句称为循环体,即循环结构中重复执行的语句。for循环体的执行次数与list中元素的个数有关。在带列表的for语句执行时,Shell会将in关键字后面的list列表的第1个元素的值赋给变量variable,然后执行循环体;当循环体中的语句执行完毕之后,Shell会将列表中的第2个元素的值赋给变量variable,然后再次执行循环体。当list列表中的所有的元素都被访问后,for循环结构终止,程序将继续执行done语句后面的其他的语句。

示例1:直接列出变量列表所有元素

方法1:直接列出元素方法
[root@kittod ~]# cat list.sh
#!/bin/bashfor IP in 192.168.132.128 192.168.132.129
doecho $IP
done[root@kittod ~]# chmod +rx list.sh
[root@kittod ~]# ./list.sh
192.168.132.128
192.168.132.129方法2:使用大括号
[root@kittod ~]# cat list2.sh
#!/bin/bashfor IP in 192.168.132.12{8..9}
doecho $IP
done
[root@kittod ~]# chmod a+rx list2.sh
[root@kittod ~]# ./list2.sh
192.168.132.128
192.168.132.129方法3:使用seq
[root@kittod ~]# cat list3.sh
#!/bin/bashfor IP in $(seq -f "192.168.132.12%1g" 1 5)
doecho $IP
done
[root@kittod ~]# chmod a+rx list3.sh
[root@kittod ~]# ./list3.sh
192.168.132.121
192.168.132.122
192.168.132.123
192.168.132.124
192.168.132.125说明:seq的用法如下
[root@kittod ~]# seq 1 5
1
2
3
4
5
[root@kittod ~]# seq 1 2 10
1
3
5
7
9选项:
-s 指定输出的分隔符,默认为\n,即默认为回车换行[root@kittod ~]# seq -s + 1 10 
1+2+3+4+5+6+7+8+9+10[root@kittod ~]# seq -s "`echo -e "\t"`" 9 11   #echo -e启用转译字符
9 	10 	11-w 指定为定宽输出,不能和-f一起用
[root@kittod ~]# seq -w 8 11
08
09
10
11
[root@kittod ~]# seq -w 99 103
099
100
101
102
103-f 按照指定的格式输出,不能和-w一起使用,在没有使用-f选项指定格式时,默认格式为%g,类似于printf
[root@kittod ~]# seq 8 11
8
9
10
11
[root@kittod ~]# seq -f '%g' 8 11
8
9
10
11
[root@kittod ~]# seq -f '%3g' 8 11
8
9
10
11
[root@kittod ~]# seq -f '%03g' 8 11
008
009
010
011
[root@kittod ~]# seq -f "dir%g" 1 5
dir1
dir2
dir3
dir4
dir5
[root@kittod ~]# mkdir $(seq -f 'dir%03g' 1 10)
[root@kittod ~]# ll
total 10
drwxr-xr-x. 2 root root 6 May 4 15:59 dir001
drwxr-xr-x. 2 root root 6 May 4 15:59 dir002
drwxr-xr-x. 2 root root 6 May 4 15:59 dir003
drwxr-xr-x. 2 root root 6 May 4 15:59 dir004
drwxr-xr-x. 2 root root 6 May 4 15:59 dir005
drwxr-xr-x. 2 root root 6 May 4 15:59 dir006
drwxr-xr-x. 2 root root 6 May 4 15:59 dir007
drwxr-xr-x. 2 root root 6 May 4 15:59 dir008
drwxr-xr-x. 2 root root 6 May 4 15:59 dir009
drwxr-xr-x. 2 root root 6 May 4 15:59 dir010

示例2:获取当前目录下的文件名作为变量列表打印输出

[root@kittod ~]# cat list4.sh
#!/bin/bash
for FILE in $(ls -F | grep -v /$) #ls -F 表明查看一个文件,/$表示以/结尾
doecho $FILE
done
[root@kittod ~]# chmod a+rx list4.sh
[root@kittod ~]# ./list4.sh
list2.sh
list3.sh
list4.sh
list.sh
说明:
[root@kittod ~]# ls -F / | grep -v /$
bin@
lib@
lib64@
sbin@

示例3:打印出下面语句中字符数不大于6的单词

rabbit is favorite to eat cabbage

[root@kittod ~]# cat 3.sh
#!/bin/bash
for n in rabbit is favorite to eat cabbage
doif [ `expr length $n` -le 6 ];thenecho $nfi
done
[root@kittod ~]# chmod a+rx 3.sh
[root@kittod ~]# ./3.sh
rabbit
is
to
eat

Shell允许用户指定for语句的步长。当用户需要另外指定步长时,其基本语法如下:

for varibale in {start..end..step}
dostatement1statement2...
done

示例:通过for循环,计算100以内奇数的和

[root@kittod ~]# cat 4.sh
#!/bin/bash
sum=0
for i in {1..100..2}
dolet "sum+=i"
doneecho "the sum is $sum"[root@kittod ~]# chmod a+rx 4.sh
[root@kittod ~]# ./4.sh
the sum is 2500let用法:
应用变量时不需要使用$
[root@kittod ~]# no1=2
[root@kittod ~]# no2=4
[root@kittod ~]# let result=no1+no2
[root@kittod ~]# echo $result
6自加:
[root@kittod ~]# let no1++
[root@kittod ~]# echo $no1
3自减:
[root@kittod ~]# let no1--
[root@kittod ~]# echo $no1
2[root@kittod ~]# a=2
[root@kittod ~]# let "a+=1"
[root@kittod ~]# echo $a
3
[root@kittod ~]# let "a-=1"
[root@kittod ~]# echo $a
2
[root@kittod ~]# let "a*=2"
[root@kittod ~]# echo $a
4
[root@kittod ~]# let "a/=2"
[root@kittod ~]# echo $a
2
[root@kittod ~]# let "a=$a**3"
[root@kittod ~]# echo $a
8

5.1.2 不带列表的for循环语句

在某些特殊情况下,for循环的条件列表可以完全省略,称为不带列表的for循环语句。如果没有为for循环提供条件列表,Shell将从命令行获取条件列表。不带列表的for循环语句的一般语法如下:

for variable
dostatement1statement2...
done

由于系统变量$@同样可以获取所有的参数,所以以上的语法等价于以下语法:

for variable in $@或$*
dostatement1statement2...
done

示例:

[root@kittod ~]# cat 5.sh
#!/bin/bash
for arg
doecho $arg
done
[root@kittod ~]# bash 5.sh {1..6}
1
2
3
4
5
6

5.1.3 类C风格的for循环语句

for ((expression1;expression2;expression3))
dostatement1;statement2;...
done

在上面的语法中,for循环语句的执行条件被2个圆括号包括起来。执行条件分为3个部分,由2个分号隔开,第1部分expression1通常是条件变量初始化的语句;第2部分expression2是决定是否执行for循环的条件。当expression2的值为0时,执行整个循环体;当expression2的值为非0时,退出for循环体。第3部分,即表达式expression3通常用来改变条件变量的值,例如递增或者递减等。

示例1:批量创建用户:

用户名以test开头,按数字序号变化;

一共添加30个账号,即test01,tes02...,test30

用户初始密码为123456

分析:根据要求使用循环语句完成创建用户使用useradd命令,根据命名规则,10以下的需要加0初始账号设置方法(echo “123456” |passwd –stdin username)

解答:

[root@kittod ~]# cat add_user.sh
#!/bin/bash
for ((i=1;i<=30;i++))
doif [ $i -lt 10 ]thenuser=test0$ielseuser=test$ifiif ! id -u $user &> /dev/nullthenuseradd $userecho "12456" | passwd --stdin $user &> /dev/nullelseecho "$user is exists..."fi
done
[root@kittod ~]# bash add_user.sh
[root@kittod ~]# grep test /etc/passwd | cut -d ":" -f1
test01
test02
test03
test04
test05
test06
test07
test08
test09
test10
test11
test12
test13
test14
test15
test16
test17
test18
test19
test20
注意:可以简化写法,直接用for带列表的循环,这样就不用for里面嵌套if判断
比如for i in {01..30}

示例2:编写一个 Shell 程序,实现判断当前网络(假定为192.168.1.0/24,根据实际情况实现)里,当前在线用户的IP有哪些。

[root@kittod ~]# cat online_host.sh
#!/bin/bash
for ((i=1;i<=254;i++))
doif ping -c 1 192.168.132.$i &> /dev/nullthenecho "192.168.132.$i is up..."elseecho "192.168.132.$i is unknown..."fi
done

5.2 while循环语句

while循环是另外一种常见的循环结构。使用while循环结构,可以使得用户重复执行一系列的操作,直到某个条件的发生。这听起来好像跟until循环非常相似,但是与until语句相比,while语句有着较大的区别。

while循环语句的基本语法如下:

while expression
dostatement1statement2...
done

在上面的语法中,expression表示while循环体执行时需要满足的条件。虽然可以使用任意合法的Shell命令,但是,通常情况下,expression代表一个测试表达式,当expression的值为0时才执行循环体中的语句,每次执行到done时就会重新判断while条件表达式是否成立,当expression的值为非0值时,将退出循环体。与其他的循环结构一样,do和done这2个关键字之间的语句构成了循环体。

5.2.1 while循环读取文件

方法一:采用exec读取文件,然后进入while循环处理
[root@kittod ~]# cat file
shuju1
shuju2
shuju3
shuju4
[root@kittod ~]# cat file.sh
#!/bin/bash
exec < file
while read a   #read是按行赋值给a
doecho $a
done
[root@kittod ~]# bash file.sh
shuju1
shuju2
shuju3
shuju4方法二:使用cat读文件,然后通过管道进入while循环处理
#!/bin/bash
cat file | while read line
doecho $line
done方法三:通过在while循环结尾,使用输入重定向方式
while read line
doecho $line
done < File

5.2.2 while循环语句示例

示例1:猜商品价格

通过变量RANDOM获得随机数价格

提示用户猜测并记录次数,猜中后退出循环

分析: 产生随机数价格 猜中退出循环,显然要用死循环(while true),满足条件退出程序
通过if条件判断,根据用户输入数值和生成随机数比较 记录猜测次数,每猜测一次加1

解答:

[root@kittod ~]# cat price.sh
#!/bin/bash
PRICE=$[ $RANDOM % 100 ]  #$RANDOM 生成一个随机数
TIMES=0
while true  #注意:此处要写ture不能写1
doread -p "Please enter the product price [0-99] : " INTlet TIMES++if [ $INT -eq $PRICE ]thenecho "Good luck,you guessed it."echo "You have guessed $TIMES times."exit 0elif [ $INT -gt $PRICE ]thenecho "$INT is too high"elseecho "$INT is too low"fi
done
[root@kittod ~]# bash price.sh
Please enter the product price [0-99] : 80
80 is too low
Please enter the product price [0-99] : 40
40 is too low
Please enter the product price [0-99] : 90
90 is too high
Please enter the product price [0-99] : 85
85 is too low
Please enter the product price [0-99] : 88
88 is too high
Please enter the product price [0-99] : 87
87 is too high
Please enter the product price [0-99] : 86
Good luck,you guessed it.
You have guessed 7 times.
通用的算法公式%random%%%(max-min+1)+min来产生[min,max]区间里的随机数,最大值
和最小值均能取到。

示例2:while读取文件

工作过程中遇到要从一个ip列表中获取ip port,然后ssh ip 到目标机器进行特定的操作

[root@kittod ~]# cat iplist
192.168.132.128 22
192.168.132.129 22
192.168.132.130 22
[root@kittod ~]# cat ssh_port.sh
#!/bin/bash
while read line
doIP=$(echo $line |awk '{print $1}')   #awk '{print $1}' 截取并打印第一列PORT=$(echo $line | awk '{print $2}')  #awk '{print $2}' 截取并打印第二列echo "IP: $IP, PORT: $PORT"
done < iplist  #将iplist中的数据进行循环[root@kittod ~]# bash ssh_port.sh
IP: 192.168.132.128, PORT: 22
IP: 192.168.132.129, PORT: 22
IP: 192.168.132.130, PORT: 22注意:
[root@kittod ~]# cat ssh_port.sh
#!/bin/bash
while read line
do
IP=$(echo $line |awk '{print $1}')
PORT=$(echo $line | awk '{print $2}')
echo "IP: $IP, PORT: $PORT"
ssh root@$IP
done < iplist
[root@kittod ~]# bash ssh_port.sh
IP: 192.168.132.128, PORT: 22
Pseudo-terminal will not be allocated because stdin is not a terminal.
The authenticity of host '192.168.132.128 (192.168.132.128)' can't be
established.
ECDSA key fingerprint is
SHA256:Rwf0ESUa0h81yrog0NwU5f1rFuE9PJ1iByFEfwlKWKk.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
yes
Warning: Permanently added '192.168.132.128' (ECDSA) to the list of
known hosts.
root@192.168.132.128's password:
-bash: line 1: 192.168.132.129: command not found
-bash: line 2: 192.168.132.130: command not found如果在while循环中调用了ssh命令,那么ssh就会把当前输入中所有的数据读走,也就是重定
向给while命令的数据,都被ssh命令读走了,以至于下次循环的时候,read读到的内容为
空,导致循环提前结束。

示例3:将之前用for语句创建的test01-test30用户删除

[root@kittod ~]# cat del_user.sh
#!/bin/bash
i=1
while [ $i -le 20 ]
doif [ $i -lt 10 ]thenuser=test0$ielseuser=test$ifiif id -u $user &> /dev/null   #id -u显示用户idthenuserdel -r $userelseecho "$user is not exists..."filet i++
done
注意:while判断变量也可以使用(()),比如while ((i<=20))

5.3 until循环语句

until循环语句同样也存在于多种程序设计语言中。顾名思义,until语句的作用是将循环体重复执行,直到某个条件成立为止。until语句的基本语法如下:

until expression  #表达式为假时执行
dostatement1statement2...
done

条件为假的时候执行

在上面的语法中,expression是一个条件表达式。当该表达式的值不为0时,将执行do和done之间的语句;当expression的值为0时,将退出until循环结构,继续执行done语句后面的其它的语句。

示例:将之前用for语句创建的test01-test30用户删除

[root@kittod ~]# cat del_user2.sh
#!/bin/bash
i=1
until [ $i -gt 20 ]   #与while循环类似但是为假的时候执行
doif [ $i -le 9 ]thenuser=test0$ielseuser=test$ifiif id -u $user &> /dev/nullthenuserdel -r $userelseecho "$user is not exists..."filet i++
done

5.4 select循环语句

select循环语句的主要功能是创建菜单,在执行带有select循环语句脚本时,输出会按照数字顺序的列表显示一个菜单,并显示提示符(默认是#?),同时等待用户输入数字选择。

select语句的基本语法如下:

select 变量名 [ in 菜单值列表 ]
dostatement1statement2...
done

示例:

[root@kittod ~]# cat select.sh
#!/bin/bash
select mysql_version in 5.1 5.6
doecho $mysql_version
done
[root@kittod ~]# bash select.sh
1) 5.1
2) 5.6
#? 1
5.1
#? 2
5.6
#? 3

select可以快速创建菜单

5.5 嵌套循环

在程序设计语言中,嵌套的循环也是一种非常常见的结构。Shell同样也支持嵌套循环。通过嵌套循环,可以完成更复杂的功能。

示例1:打印九九乘法表

[root@kittod ~]# cat 99.sh
#!/bin/bash
for i in `seq 9`
dofor j in `seq 9`do[ $j -le $i ] && echo -n "$j*$i = `echo $(($j*$i))` "doneecho " "
done
[root@kittod ~]# bash 99.sh
1*1 = 1  
1*2 = 2 2*2 = 4  
1*3 = 3 2*3 = 6 3*3 = 9  
1*4 = 4 2*4 = 8 3*4 = 12 4*4 = 16  
1*5 = 5 2*5 = 10 3*5 = 15 4*5 = 20 5*5 = 25  
1*6 = 6 2*6 = 12 3*6 = 18 4*6 = 24 5*6 = 30 6*6 = 36  
1*7 = 7 2*7 = 14 3*7 = 21 4*7 = 28 5*7 = 35 6*7 = 42 7*7 = 49  
1*8 = 8 2*8 = 16 3*8 = 24 4*8 = 32 5*8 = 40 6*8 = 48 7*8 = 56 8*8 = 64  
1*9 = 9 2*9 = 18 3*9 = 27 4*9 = 36 5*9 = 45 6*9 = 54 7*9 = 63 8*9 = 72 9*9 = 81  

示例2:打印三角形

使用双层循环外层循环控制输出行数i:1-10内层循环:第一个循环打印每行空格j第二个循环打印数字ki(取值) 1 2 3 ... 9j(个数) 9 8 7 1 j<=10-ik(个数) 1 2 3 9 k<=i

解答:

[root@kittod ~]# cat sjx.sh
#!/bin/bash
for ((i=1;i<10;i++))
do
for ((j=1;j<10-i;j++))
do
echo -n " "
done
for ((k=1;k<=i;k++))
do
echo -n "$i "
done
echo " "
done
[root@kittod ~]# bash sjx.sh
1
2 2
3 3 3
4 4 4 4
5 5 5 5 5
6 6 6 6 6 6
7 7 7 7 7 7 7
8 8 8 8 8 8 8 8
9 9 9 9 9 9 9 9 9

示例3:打印杨辉三角

分析:杨辉三角
1
1 1
1 2 1
1 3 3 1
1、每行数字左右对称,由1开始逐渐变大,然后变小,回到1。
2、第n行的数字个数为n个。   
3、第n行数字和为2^(n-1)。(2的(n-1)次方)   
4、每个数字等于上一行的左右两个数字之和。
5、将第2n+1行第1个数,跟第2n+2行第3个数、第2n+3行第5个数……连成一线,这些数的和是
第2n个斐波那契数。将第2n行第2个数,跟第2n+1行第4个数、第2n+2行第6个数……这些数之
和是第2n-1个斐波那契数。   
6、第n行的第1个数为1,第二个数为1×(n-1),第三个数为1×(n-1)×(n-2)/2,第四个数
为1×(n-1)×(n-2)/2×(n-3)/3…依此类推。   
7.两个未知数和的n次方运算后的各项系数依次为杨辉三角的第(n+1)行。

解答:

[root@localhost test5]# vim yanghui.sh
#!/bin/bash
if (test -z $1)
thenread -p "Input Max Lines:" MAXelse
MAX=$1
fi
i=1
while [ $i -le $MAX ] #i行控制
do
j=1
while [ $j -le $i ] #j列控制
do
f=$[i-1] #f=i-1 这是另一种计算写法。
g=$[j-1] #g=j-1 这是另一种计算写法。
if [ $j -eq $i ] || [ $j -eq 1 ] ; thendeclare SUM_${i}_$j=1 #声明变量 头尾都是1
elsedeclare A=$[SUM_${f}_$j] #取上一行的j列变量declare B=$[SUM_${f}_$g] #取上一行的j-1列变量declare SUM_${i}_$j=`expr $A + $B` #声明并计算当前变量
的值
fi
echo -en $[SUM_${i}_$j]" " #输出当前变量let j++
done
echo #换行let i++
done
[root@localhost test5]# bash yanghui.sh
Input Max Lines:4
1
1 1
1 2 1
1 3 3 1

5.4 利用break和continue语句控制循环

在Shell中的循环结构中,还有2个语句非常有用,即break和continue语句。前者用于立即从循环中退出;而后者则用来跳过循环体中的某些语句,继续执行下一次循环。

break语句的作用是立即跳出某个循环结构。break语句可以用在for、while或者until等循环语句的循环体中。

continue语句则比较有趣,它的作用不是退出循环体。而是跳过当前循环体中该语句后面的语句,重新从循环语句开始的位置执行。

示例:

[root@kittod ~]# cat for_break.sh
#!/bin/bash
for i in `seq 10`
doif [ $i -eq 4 ]thenbreakfiecho $i
done
[root@kittod ~]# bash for_break.sh
1
2
3
[root@kittod ~]# cat for_continue.sh
#!/bin/bash
for i in `seq 10`
doif [ $i -eq 4 ]thencontinuefiecho $i
done
[root@kittod ~]# bash for_continue.sh
1
2
3
5
6
7
8
9
10

练习:

1. 使用case实现成绩优良差的判断
2. for创建20用户
用户前缀由用户输入
用户初始密码由用户输入
例如:test01,test10
3. for ping测试指网段的主机网段由用户输入,例如用户输入192.168.2 ,则ping 192.168.2.10 ---192.168.2.20
UP: /tmp/host_up.txt
Down: /tmp/host_down.txt
4. 使用for实现批量主机root密码的修改成功或失败都必须记录
提示:主机IP存放在一个文件中SSH:实现公钥认证,执行远程中主机命令
实现公钥认证# ssh-keygen 在用于管理的主上生成密钥对# ssh-copy-id -i 192.168.2.3

1. 使用case实现成绩优良差的判断

#!/usr/bin/env bashread -p "输入成绩:" num
case $num in
[0-5][0-9])echo "不及格"
;;
[6-7][0-9])echo "良好"
;;
[8-9][0-9] |100)echo "优秀"
;;
esac

2. for创建20用户

用户前缀由用户输入

用户初始密码由用户输入

例如:test01,test10

#!/bin/bash
read -p "请输入用户前缀:" user
read -p "请输入初始密码:" pass
for ((i=1;i<=20;i++ ))
doif [ $i -lt 10 ];thenusers=${user}0$ielseusers=${user}$ifiif ! id -u $users &> /dev/nullthenuseradd $usersecho "$pass" | passwd --stdin $users &> /dev/nullelseecho "$users is exists..."fi
done

3. for ping测试指网段的主机网段由用户输入,例如用户输入192.168.2 ,则ping 192.168.2.10 ---192.168.2.20

UP: /tmp/host_up.txt

Down: /tmp/host_down.txt

#!/bin/bash
read -p "请输入网段: " ip
for ((i=10;i<=20;i++))
doIP="$ip"."$i"echo $IPif ping -c 2 $IP &> /dev/nullthenecho "$IP is up" >>/tmp/host_up.txtelseecho "$IP is down" >>/tmp/host_down.txt                                                  cat fidone

4. 使用for实现批量主机root密码的修改成功或失败都必须记录

提示:主机IP存放在一个文件中

SSH:实现公钥认证,执行远程中主机命令实现公钥认证

# ssh-keygen 在用于管理的主上生成密钥对

# ssh-copy-id -i 192.168.2.3

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

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

相关文章

linux安装和使用-第一天

一. 安装linux系统 安装过程:略注意事项: 安装时一定一定一定不要选择有中文的目录包括镜像文件所在的目录,否则会发生各种问题,比如VMware Tools是灰色的.1. 安装ssh工具 (1) 安装命令 # 第一次安装系统需要更新一下apt的源,他维护了软件依赖关系,否则安装不了软件,每次安装…

Python数据容器(一)

一.数据容器入门 1.Python中的数据容器&#xff1a;一种可以容纳多份数据的数据类型&#xff0c;容纳的每一份数据称之为1个元素&#xff0c;每一个元素&#xff0c;可以是任意类型的数据&#xff0c;如字符串、数字、布尔等。 2.数据容器根据特点的不同&#xff0c;如&#…

CountDownLatch

CountDownLatch 翻译&#xff1a; 倒计时锁存器&#xff0c;&#xff0c;&#xff0c;&#xff0c;count计数&#xff0c;down停止&#xff0c;Latch锁 解释&#xff1a; 允许一个或多个线程等待&#xff0c;直到在其他线程中执行的一组操作完成的同步辅助不懂&#xff1f;…

github上的软件许可证是什么?如何合并本地的分支德语难学还是俄语更加难学?站在一个中国人的立场上,德语难学还是俄语更加难学?俄语跟德语有什么样的显著差别?

目录 github上的软件许可证是什么&#xff1f; 如何合并本地的分支 德语难学还是俄语更加难学&#xff1f; 站在一个中国人的立场上&#xff0c;德语难学还是俄语更加难学&#xff1f; 俄语跟德语有什么样的显著差别&#xff1f; github上的软件许可证是什么&#xff1f; …

46.HarmonyOS鸿蒙系统 App(ArkUI)网格布局

Grid(){GridItem(){Button(按钮1).fontSize(28)}.backgroundColor(Color.Blue)GridItem(){Text(数学).fontSize(28)}.backgroundColor(Color.Yellow)GridItem(){Text(语文).fontSize(28)}.backgroundColor(Color.Green)GridItem(){Text(英语).fontSize(28)}.backgroundColor(Co…

分布式锁-redission可重入锁原理

5.3 分布式锁-redission可重入锁原理 在Lock锁中&#xff0c;他是借助于底层的一个voaltile的一个state变量来记录重入的状态的&#xff0c;比如当前没有人持有这把锁&#xff0c;那么state0&#xff0c;假如有人持有这把锁&#xff0c;那么state1&#xff0c;如果持有这把锁的…

RabbbitMQ基本使用及其五种工作模型

初识MQ 同步通讯和异步通讯 什么是同步通讯呢&#xff1f;举个例子&#xff0c;你认识了一个小姐姐&#xff0c;聊的很火热&#xff0c;于是你们慢慢开始打电话&#xff0c;视频聊天&#xff0c;这种方式就成为同步通讯&#xff0c;那什么是一部通讯呢&#xff0c;同样的&…

uni-app如何生成骨架屏

为什么需要骨架屏&#xff1a;为了缓解用户打开程序时等待接口的焦虑情绪 1.打开微信开发者工具&#xff0c;找到模拟器中的页面信息&#xff0c;选择生成骨架屏 2.将生成的wxml代码复制到vscode&#xff0c;在index的components中新建一个vue文件&#xff0c;只需保留请求接口…

Day16_学点儿JavaEE_实践_基于IDEA2023的简易JavaWeb项目、Tomcat输出乱码解决

0 JavaWeb项目目录 └──JavaWeb├──resources│ └──db.properties├──src│ └──com.sdust.web│ ├──servlet│ │ └──StudentServlet│ ├──pojo│ │ └──Student│ └──util│ └──JDBCUtil├──web│ ├──st…

趣话最大割问题:花果山之群猴博弈

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨浪味仙 排版丨 沛贤 深度好文&#xff1a;3000字丨15分钟阅读 趋利避害&#xff0c;是所有生物遵循的自然法则&#xff0c;人类也不例外。 举个例子&#xff0c;假如你是某生鲜平台的配…

吴恩达llama课程笔记:第六课code llama编程

羊驼Llama是当前最流行的开源大模型&#xff0c;其卓越的性能和广泛的应用领域使其成为业界瞩目的焦点。作为一款由Meta AI发布的开放且高效的大型基础语言模型&#xff0c;Llama拥有7B、13B和70B&#xff08;700亿&#xff09;三种版本&#xff0c;满足不同场景和需求。 吴恩…

itext7 pdf转图片

https://github.com/thombrink/itext7.pdfimage 新建asp.net core8项目&#xff0c;安装itext7和system.drawing.common 引入itext.pdfimage核心代码 imageListener下有一段不安全的代码 unsafe{for (int y 0; y < image.Height; y){byte* ptrMask (byte*)bitsMask.Scan…

2022年蓝桥杯省赛软件类C/C++B组----积木画

想借着这一个题回顾一下动态规划问题的基本解法&#xff0c;让解题方法清晰有条理&#xff0c;希望更多的人可以更轻松的理解动态规划&#xff01; 目录 【题目】 【本题解题思路】 【DP模版】 总体方针&#xff1a; 具体解题时的套路&#xff1a; 【题目】 【本题解题思…

状态模式(行为型)

目录 一、前言 二、状态模式 三、总结 一、前言 状态模式(State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类&#xff0c;但实际上&#xff0c;由于状态模式的引入&#xff0c;行为的变…

macOS制作C/C++ app

C/C制作macOS .app 一、 .app APP其实是一个文件夹结构&#xff0c;只不过mac的界面中让它看起来像一个单独的文件。 在shell终端或者右键查看包结构即可看到APP的目录结构。 通常的app目录结构如下&#xff1a; _CodeSignature, CodeResources 一般为Mac APP Store上架程序…

华三交换机知道ip怎么查找主机ip在接入交换机哪个端口下

环境&#xff1a; 华三S5120V3-52S-SI H3C Comware Software, Version 7.1.070, Release 6329 问题描述&#xff1a; 华三交换机知道ip怎么查找主机ip在接入交换机哪个端口下 已知主机ip192.168.1.111 解决方案&#xff1a; 在H3C&#xff08;新华三&#xff09;交换机上…

K8S:常用资源对象操作

文章目录 一、使用Replication Controller(RC)、Replica Set(RS) 管理Pod1 Replication Controller&#xff08;RC&#xff09;2 Replication Set&#xff08;RS&#xff09; 二、Deployment的使用1 创建2 滚动升级3 回滚Deployment三、 Pod 自动扩缩容HPA1 使用kubectl autosc…

PCL中VTK场景添加坐标系轴显示

引言 世上本没有坐标系&#xff0c;用的人多了&#xff0c;便定义了坐标系统用来定位。地理坐标系统用于定位地球上的位置&#xff0c;PCL点云库可视化窗口中的坐标系统用于定位其三维世界中的位置。本人刚开始接触学习PCL点云库&#xff0c;计算机图形学基础为零&#xff0c;…

排序链表 - LeetCode 热题 33

大家好&#xff01;我是曾续缘&#x1f639; 今天是《LeetCode 热题 100》系列 发车第 33 天 链表第 12 题 ❤️点赞 &#x1f44d; 收藏 ⭐再看&#xff0c;养成习惯 排序链表 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a…

机器学习实训 Day1(线性回归练习)

线性回归练习 Day1 手搓线性回归 随机初始数据 import numpy as np x np.array([56, 72, 69, 88, 102, 86, 76, 79, 94, 74]) y np.array([92, 102, 86, 110, 130, 99, 96, 102, 105, 92])from matplotlib import pyplot as plt # 内嵌显示 %matplotlib inlineplt.scatter…