浅学一下Shell脚本(4)--流程控制和循环

一.流程控制语句

1.if语句

1.1 语法结构

if 语句语法格式:

if [ condition ];then
		command1
    	command2
		...
fi

# 也可以用下面这种方式
[ 条件 ] && command

if else 语法格式:

if [ condition ];then
		command1
else
		command2
fi

# 也可以用下面这种方式
[ 条件 ] && command1 || command2

if else-if else 语法格式:

if [ condition1 ];then
		command1
elif [ condition2 ];then
		command2
else
		command3
fi

1.2 案例

1) 判断当前用户是否为root。
#!/bin/bash 
if [ `id -u` -eq 0 ];then 
		echo "the user is root" 
else 
		echo "the user is not root" 
fi
2) 判断脚本后输入的ip能否ping通。
#!/bin/bash 
ip=$* 
if [ -z $ip ];then 
		echo "please input correct ip" 
		exit
else 
		ping -c1 $ip &>/dev/null &&{ 
				echo "$ip can ping" 
		}||{ 
				echo "$ip can not ping" 
				exit 
		} 
fi
3) 判断脚本后输入的软件是否安装 未安装则安装。
#!/bin/bash 
read -p "please input the software name: " name 
rpm -q $name &>/dev/null 
if [ $? -eq 0 ];then 
		echo "the $name is installed" 
else 
		echo "the $name is not installed" 
		dnf install $name -y 
		if [ $? -eq 0 ];then 
				echo "the $name now is installed" 
		else
				echo "sorry,the $name installed failed" 
		fi 
fi
4) 判断当前内核主版本是否为2,次版本是否大于等于6
#!/bin/bash
kernel=`uname -r`
var1=`echo $kernel|cut -d. -f1`
var2=`echo $kernel|cut -d. -f2`
test $var1 -eq 2 -a $var2 -ge 6 && echo $kernel || echo "当前内核版本不符合要求"
或者
[ $var1 -eq 2 -a $var2 -ge 6 ] && echo $kernel || echo "当前内核版本不符合要求"
或者
[[ $var1 -eq 2 && $var2 -ge 6 ]] && echo $kernel || echo "当前内核版本不符合要求"
#!/bin/bash
if [ $master_version -eq 2 ];then 
		if [ $slave_version -ge 6 ];then 
				echo $full_version 
		fi 
fi	

2.多分支case语句

2.1 语法结构

case var in             # 定义变量;var代表是变量名
	pattern 1)          # 模式1;用 | 分割多个模式,相当于or
    command1            # 需要执行的语句
    ;;                  # 两个分号代表命令结束
	pattern 2)
    command2
    ;;
	pattern 3)
    command3
    ;;
		*)              # default,不满足以上模式,默认执行*)后的语句
    command4
    ;;
esac					# esac表示case语句结束

2.2 案例

1) 传入start、stop、reload时分别执行相应命令。
#!/bin/bash
case $1 in
	start|S)
	echo "service is running...."
	;;
	stop|T)
	echo "service is stoped..."
	;;
	reload|R)
	echo "service is restart..."
	;;
		*)
	echo "请输入你要的动作"
	;;
esac
2) 模拟一个多任务维护界面。
#!/bin/bash
#打印菜单
menu(){
cat <<-END
	h	显示命令帮助
	f	显示磁盘分区
	d	显示磁盘挂载
	m	查看内存使用
	u	查看系统负载
	q	退出程序
	END
}
menu
while true
do
	read -p "请输入你的操作[h for help]:" var1
	case $var1 in
		h)
		menu
		;;
		f)
		read -p "请输入你要查看的设备名字[/dev/sdb]:" var2
		case $var2 in
			/dev/sda)
			fdisk -l /dev/sda
			;;
			/dev/sdb)
			fdisk -l /dev/sdb
			;;
		esac
		;;
		d)
		lsblk
		;;
		m)
		free -m
		;;
		u)
		uptime
		;;
		q)
		exit
		;;
	esac
done

二.循环语句

1.for循环

1.1 语法结构

  • 列表循环
for variable in {list}
    do
        command 
        commanddone
或者
for variable in a b c
	do
		command
		command
    done

for var in {1..10};do echo $var;done
for var in 1 2 3 4 5;do echo $var;done
for var in `seq 10`;do echo $var;done
for var in $(seq 10);do echo $var;done
for var in {0..10..2};do echo $var;done
for var in {2..10..2};do echo $var;done
for var in {10..1};do echo $var;done
for var in {10..1..-2};do echo $var;done
for var in `seq 10 -2 1`;do echo $var;done
  • 不带列表循环
for variable
	do
		command 
        commanddone
  • 类C风格循环
for(( 初始值;循环控制条件;变量变化 ))
	do
		command
		commanddone

1.2 案例

1) 计算1-100内的奇数和
#!/bin/bash 
sum=0 
for i in {1..100..2} 
do 
	let sum=$sum+$i 
done 
echo $sum
2) 计算阶乘
#!/bin/bash 
read -p "Num:" num 
result=1 
for i in `seq $num` 
do 
	result=$[ $result * $i ] 
done 
echo "The result is:" $result
3) 批量新建用户stu1~stu5
#!/bin/bash 
for count in {1..5} 
do 
	username="stu$count" 
	id $username &> /dev/null 
	if [ $? -eq 0];then 
		echo "user %username exists" 
	else 
		useradd -d /rhome $username 
		echo "user $username create success" 
		echo 123 | passwd --stdin $username 
	fi 
done

2.while循环

2.1 语法结构

条件为真就进入循环;条件为假就退出循环

while conditon
	do
		command...
	done

2.2 案例

1) 计算1-50的偶数和
#!/bin/bash
sum=0
i=2

while [ $i -le 50 ]
do
	let sum=sum+i
	let i+=2
done

echo "1-50的偶数和为:$sum"
2) 输入的数值进行比较判断
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0

echo "商品的价格为0-999之间,猜猜看是多少?"
while true
do
	read -p "请输入您猜的价格:" INT
	let TIMES++

	if [ $INT -eq $PRICE ] ; then
		echo "恭喜您猜对了,实际价格是 $PRICE"
		echo "您总共猜了 $TIMES 次"
		exit 0
	elif [ $INT -gt $PRICE ] ; then
		echo "太高了"
	else
		echo "太低了"
	fi
done

3.until循环

3.1 语法结构

条件为假就进入循环;条件为真就退出循环

until condition
do
	command
	command
	...
done

3.2 案例

1) 打印数字1-9
#!/bin/bash
a=0

until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done
2) 批量创建10个用户

要求:stu1—stu5用户的UID分别为1001—1005;stu6~stu10用户的家目录分别在/rhome/stu6—/rhome/stu10

#!/bin/bash
i=1
until [ $i -gt 10 ]
do
	if [ $i -le 5 ];then
		useradd -u $[1000+$i] stu$i && echo 123|passwd --stdin stu$i
	else
		[ ! -d /rhome ] && mkdir /rhome
		useradd -d /rhome/stu$i stu$i && echo 123|passwd --stdin stu$i		
	fi
let i++
done

4.无限循环

# 格式1
while :
do
    command
done

# 格式2
while true
do
    command
done

# 格式3
for (( ; ; ))

5.循环控制

  • continue:继续;表示循环体内下面的代码不执行,重新开始下一次循环
  • break:打断;马上停止执行本次循环,执行循环体后面的代码
  • exit:表示直接跳出程序
    exit命令之后定义了返回值,那么这个脚本执行之后的返回值就是我们自己定义的返回值。可以通过查询$?这个变量,来查看返回值。如果exit之后没有定义返回值,脚本执行之后的返回值是执行exit 语句之前,最后执行的一条命令的返回值。

6.循环嵌套(打印九九乘法表)

for嵌套

#!/bin/bash
for ((y=1;y<=9;y++))
do
	for ((x=1;x<=$y;x++))
	do
		echo -ne "$x*$y=$[$x*$y]\t"
	done
echo
echo
done
#!/bin/bash
for i in `seq 9`
do
    for j in `seq $i`
    do
        echo -ne  "$j*$i=$[$i*$j]\t"
    done
echo
echo
done

while嵌套

#!/bin/bash
y=1
while [ $y -le 9 ]
do
        x=1
        while [ $x -le $y ]
        do
                echo -ne "$x*$y=$[$x*$y]\t"
                let x++
        done
echo
echo
let y++
done

until嵌套

#!/bin/bash
y=1
until [ $y -gt 9 ]
do
        x=1
        until [ $x -gt $y ]
        do
                echo -ne "$x*$y=$[ $x*$y ]\t"	
                let x++
        done
echo
echo
let y++
done
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cross-Attention指的是Transformer架构中的一种注意力机制,它用于混合两个不同嵌入序列的注意力。这两个序列必须具有相同的维度,并且可以是不同的模式形态,比如文本、声音、图像等。在Cross-Attention中,一个序列作为输入的Q,定义了输出的序列长度,而另一个序列提供输入的K和V。 Cross-Attention与Self-Attention不同之处在于,Cross-Attention的输入来自不同的序列,而Self-Attention的输入来自同一个序列。但除此之外,它们的基本原理是一致的。在Transformer中,Cross-Attention通常是指编码器和解码器之间的交叉注意力层。在这一层中,解码器会对编码器的输出进行注意力调整,以获得与当前解码位置相关的编码器信息。具体的计算过程包括:编码器输入(通常是来自编码器的输出)和解码器输入(已生成的部分序列)被分别表示为enc_inputs和dec_inputs。解码器的每个位置会生成一个查询向量(query),用来在编码器的所有位置进行注意力权重计算。编码器的所有位置会生成一组键向量(keys)和值向量(values)。通过对查询向量和键向量进行点积操作,并通过softmax函数获得注意力权重。注意力权重与值向量相乘,并对结果进行求和,得到编码器调整的输出。这样,Cross-Attention机制帮助解码器能够有效地建模当前生成位置的上下文信息。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【科研】浅学Cross-attention?](https://blog.csdn.net/MengYa_Dream/article/details/126688503)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [交叉注意力机制CrossAttention](https://blog.csdn.net/m0_63097763/article/details/132293568)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值