while和for循环应用
while循环和until循环的应用实践
当型和直到型循环语法
while循环语句
while<条件表达式>do指令...done当型和直到型循环的基本范例
竖向打印54321
while格式:
#!/bin/bashi=5while((i>0))doecho$i((i--))done计算1+2+3+…+99+100的和
#!/bin/bashi=1sum=0while((i<=100))do((sum+=i))((i++))# let i++doneecho"1+2+3+...+99+100=$sum"for和select循环语句的应用实践
for循环语法结构
变量取值型
第一种for循环语句语法结构如下:
for变量名in变量取值列表do指令...doneC语言型
for((expl;exp2;exp3))do指令...done这种for循环语句说明如下:
for关键字后的双括号内是三个表达式:
第一个是变量初始化(例如:i=0)
第二个为变量的范围(例如:i<100)
第三个为变量自增或自减(例如:i++)。
for循环语句的基础实践
竖向升序打印
# 列表型[han@han-shell ~]$vimfor1.sh#!/bin/bashforiin{1..5}doecho$idone[han@han-shell ~]$bashfor1.sh1234# c语言型[han@han-shell ~]$vimfor3.sh#!/bin/bashfor((i=1;i<=5;i++))doecho$idone# while型[han@han-shell ~]$vimwhile1.sh#!/bin/bashi=1while((i<=5))doecho$i((i++))done竖向降序打印
[han@han-shell ~]$vimfor4.sh#!/bin/bashforiin{5..1}doecho$idone[han@han-shell ~]$bashfor4.sh54321[han@han-shell ~]$vimfor5.sh#!/bin/bashforiin$(seq5-11)doecho$idone求和、求乘积
#!/bin/bashsum=0foriin{1..10}dosum=$[sum+ i]doneecho$(seq-s'+'10)=$sum#!/bin/bashsum=1foriin{1..10}do((sum*=i))doneecho$(seq-s'*'10)=$sum九九乘法表
#!/bin/bash for num1 in {1..9} do for ((num2=1;num2<=num1;num2++)) do echo -en "$num2*$num1=$[ num2 * num1 ]\t" done echo done百钱买百鸡
鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
#!/bin/bash# 鸡翁数量 cock_num# 鸡母数量 hen_num# 鸡雏数量 chick_num# 鸡总数量 sumsum=100# 钱总数 moneymoney=100for((cock_num=1;cock_num<=sum/5;cock_num++))dofor((hen_num=1;hen_num<=sum/3;hen_num++))doforchick_numin{3..100..3}doif[$[cock_num+hen_num+chick_num]-eq100-a$[cock_num*5+hen_num*3+chick_num/3]-eq100];thenecho"鸡翁:$cock_num鸡母:$hen_num鸡雏:$chick_num"echo"$cock_num*5+$hen_num*3+$chick_num/3=100"echofidonedonedone三对情侣参加婚礼
3个新郎为A、B、C,3个新娘为X、Y、Z。有人想知道究竟谁与谁结婚,于是就问新人中的三位,得到如下结果:
- A说他将和X结婚;
- X说她的未婚夫是C;
- C说他将和Z结婚。
这人事后知道他们说的全是假话。那么,究竟谁与谁结婚呢?
解题思路:
根据之前的假话得出反向判定条件
多个人不能同时和一个人结婚
#!/bin/bashforAinX Y ZdoforBinX Y ZdoforCinX Y Zdoif["$A"!="$B"-a"$A"!="$C"-a"$B"!="$C"-a"$A"!="X"-a"$C"!="X"-a"$C"!="Z"];thenechoA 与$A结婚echoB 与$B结婚echoC 与$C结婚fidonedonedone执行结果:
A 与 Z 结婚 B 与 X 结婚 C 与 Y 结婚实验
要求在模版虚拟机中开发一个脚本sethost:
1. 执行sethost 11,则设置改主机的主机名为ha1.han.cloud,IP地址为10.1.8.11,网关为10.1.8.21 DNS为10.1.8.21 2. 执行sethost 12,则设置改主机的主机名为ha2.han.cloud,IP地址为10.1.8.12,网关为10.1.8.21 DNS为10.1.8.21 以此类推 3. 执行sethost 21,则设置改主机的主机名为network1.han.cloud,IP地址为10.1.8.21,网关为10.1.8.2 DNS为10.1.8.223.5.5.5 3. 执行sethost 22,则设置改主机的主机名为network2.han.cloud,IP地址为10.1.8.22,网关为10.1.8.2 DNS为10.1.8.223.5.5.5 以下六台服务器全部克隆与模版虚拟机 10.1.8.11 ha1.han.cloud ha1 10.1.8.12 ha2.han.cloud ha2 10.1.8.13 proxy1.han.cloud proxy1 10.1.8.14 proxy2.han.cloud proxy2 10.1.8.21 network1.han.cloud network1 10.1.8.22 network2.han.cloud network2 对于网络节点网关为10.1.8.2 DNS为223.5.5.5 对于其他节点网关为10.1.8.21 DNS为10.1.8.21# 准备虚拟机和克隆虚拟机过程: 登录模版虚拟机,创建脚本文件 [root@centos7 ~ 16:19:05]# mkdir bin [root@centos7 ~ 16:19:11]# cd bin # 务必要微调sethost脚本中两个参数:DOMAIN、CON_NAME[root@centos7 bin 16:19:12]# vim sethost #!/bin/bash DOMAIN=han.cloud CON_NAME=ens32 ADDRESS=10.1.8.$1 GATEWAY=10.1.8.21 DNS=10.1.8.21 num=$1 if ((num>=11 && num<=14 || num==21 || num==22));then # 获取网络信息 case $1 in 1[12]) HOSTNAME=ha$[$1-10].$DOMAIN ;; 1[34]) HOSTNAME=proxy$[$1-12].$DOMAIN ;; 2[12]) HOSTNAME=network$[$1-20].$DOMAIN GATEWAY=10.1.8.2 DNS=223.5.5.5 ;; esac # 设置网络信息 hostnamectl set-hostname $HOSTNAME nmcli connection modify ${CON_NAME} ipv4.addresses $ADDRESS/24 ipv4.gateway $GATEWAY ipv4.dns $DNS nmcli connection up ${CON_NAME} &>/dev/null # 查看网络信息 echo "Hostname: $(hostname)" echo "IP4:" nmcli device show ens32|grep ^IP4 else echo "Usage: $0 11-14 | 21-22" fi [root@centos7 bin 16:19:32]# chmod +x sethost# 在模板虚拟机本地console中执行sethost命令测试,例如: sethost 11 sethost 21 测试没有问题的情况下,在执行init 0关机。 # 打快照,快照名称为sethostname。 # 选中该快照,点击克隆,节省磁盘空间,选择链接克隆。 # 克隆完成后,启动这些虚拟机。 # 在克隆出来的虚拟机中执行脚本,设置主机名和网络信息。 以network2 为例 sethost 21维护脚本在ha1节点开发
1. 配置/etc/hosts [root@ha1 ~ 16:37:35]# vim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.1.8.11 ha1.han.cloud ha1 10.1.8.12 ha2.han.cloud ha2 10.1.8.13 proxy1.han.cloud proxy1 10.1.8.14 proxy2.han.cloud proxy2 10.1.8.21 network1.han.cloud network1 10.1.8.22 network2.han.cloud network22. 配免密登录[root@ha1 ~16:38:12]# [ -d ~/.ssh ] || mkdir 700 ~/.ssh[root@ha1 ~16:38:38]# ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ''[root@ha1 ~16:39:21]# echo 'StrictHostKeyChecking no' >> /etc/ssh/ssh_config[root@ha1 ~16:39:32]# for host in ha{1,2} proxy{1,2} network{1,2}dosshpass-p123ssh-copy-id root@$host&>/dev/nullsshroot@$hosthostnamedone3. 开发维护脚本[root@ha1 ~16:42:31]# cd bin/[root@ha1 bin16:42:33]# vim weihu#!/bin/bashfunctionusage(){echo"Usage: weihu cmd COMMAND, 在集群中所有的机器上执行对应COMMAND命令"echo"Usage: weihu copy source target,将本地source文件,推送到集群中所有的机器上"exit}action=$1HOSTLIST='ha1 ha2 proxy1 proxy2 network1 network2'(($#<=1))&&usagecase"$action"in"cmd")# 删除参数1shiftCOMMAND="$*"forhostin$HOSTLISTdosshroot@$host"$COMMAND"done;;"copy")# 删除参数1shiftforhostin$HOSTLISTdoscp$1root@$host:$2done;;*)usage;;esac[root@ha1 bin16:52:01]# chmod +x weihu4. 验证[root@ha1 ~17:04:56]# weihu cmd hostnameha1.han.cloud ha2.han.cloud proxy1.han.cloud proxy2.han.cloud network1.han.cloud network2.han.cloud[root@ha1 ~17:04:59]# weihu copy /etc/hostname /tmphostname100%1621.3KB/s 00:00hostname100%1612.5KB/s 00:00hostname100%1612.5KB/s 00:00hostname100%1613.3KB/s 00:00hostname100%168.6KB/s 00:00hostname100%1612.2KB/s 00:00[root@ha1 ~17:05:18]# weihu cmd cat /tmp/hostnameha1.han.cloud ha1.han.cloud ha1.han.cloud ha1.han.cloud ha1.han.cloud ha1.han.cloud