while和for循环应用
while和for循环应用while循环和until循环的应用实践当型和直到型循环语法while循环语句while条件表达式do指令...done当型和直到型循环的基本范例竖向打印54321while格式#!/bin/bashi5while((i0))doecho$i((i--))done计算123…99100的和#!/bin/bashi1sum0while((i100))do((sumi))((i))# let idoneecho123...99100$sumfor和select循环语句的应用实践for循环语法结构变量取值型第一种for循环语句语法结构如下for变量名in变量取值列表do指令...doneC语言型for((expl;exp2;exp3))do指令...done这种for循环语句说明如下:for关键字后的双括号内是三个表达式第一个是变量初始化例如i0)第二个为变量的范围例如i100)第三个为变量自增或自减例如i)。for循环语句的基础实践竖向升序打印# 列表型[hanhan-shell ~]$vimfor1.sh#!/bin/bashforiin{1..5}doecho$idone[hanhan-shell ~]$bashfor1.sh1234# c语言型[hanhan-shell ~]$vimfor3.sh#!/bin/bashfor((i1;i5;i))doecho$idone# while型[hanhan-shell ~]$vimwhile1.sh#!/bin/bashi1while((i5))doecho$i((i))done竖向降序打印[hanhan-shell ~]$vimfor4.sh#!/bin/bashforiin{5..1}doecho$idone[hanhan-shell ~]$bashfor4.sh54321[hanhan-shell ~]$vimfor5.sh#!/bin/bashforiin$(seq5-11)doecho$idone求和、求乘积#!/bin/bashsum0foriin{1..10}dosum$[sum i]doneecho$(seq-s10)$sum#!/bin/bashsum1foriin{1..10}do((sum*i))doneecho$(seq-s*10)$sum九九乘法表#!/bin/bash for num1 in {1..9} do for ((num21;num2num1;num2)) do echo -en $num2*$num1$[ num2 * num1 ]\t done echo done百钱买百鸡鸡翁一值钱五鸡母一值钱三鸡雏三值钱一百钱买百鸡问翁、母、雏各几何#!/bin/bash# 鸡翁数量 cock_num# 鸡母数量 hen_num# 鸡雏数量 chick_num# 鸡总数量 sumsum100# 钱总数 moneymoney100for((cock_num1;cock_numsum/5;cock_num))dofor((hen_num1;hen_numsum/3;hen_num))doforchick_numin{3..100..3}doif[$[cock_numhen_numchick_num]-eq100-a$[cock_num*5hen_num*3chick_num/3]-eq100];thenecho鸡翁$cock_num鸡母$hen_num鸡雏$chick_numecho$cock_num*5$hen_num*3$chick_num/3100echofidonedonedone三对情侣参加婚礼3个新郎为A、B、C3个新娘为X、Y、Z。有人想知道究竟谁与谁结婚于是就问新人中的三位得到如下结果A说他将和X结婚X说她的未婚夫是CC说他将和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.cloudIP地址为10.1.8.11网关为10.1.8.21 DNS为10.1.8.21 2. 执行sethost 12则设置改主机的主机名为ha2.han.cloudIP地址为10.1.8.12网关为10.1.8.21 DNS为10.1.8.21 以此类推 3. 执行sethost 21则设置改主机的主机名为network1.han.cloudIP地址为10.1.8.21网关为10.1.8.2 DNS为10.1.8.223.5.5.5 3. 执行sethost 22则设置改主机的主机名为network2.han.cloudIP地址为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# 准备虚拟机和克隆虚拟机过程 登录模版虚拟机创建脚本文件 [rootcentos7 ~ 16:19:05]# mkdir bin [rootcentos7 ~ 16:19:11]# cd bin # 务必要微调sethost脚本中两个参数DOMAIN、CON_NAME[rootcentos7 bin 16:19:12]# vim sethost #!/bin/bash DOMAINhan.cloud CON_NAMEens32 ADDRESS10.1.8.$1 GATEWAY10.1.8.21 DNS10.1.8.21 num$1 if ((num11 num14 || num21 || num22));then # 获取网络信息 case $1 in 1[12]) HOSTNAMEha$[$1-10].$DOMAIN ;; 1[34]) HOSTNAMEproxy$[$1-12].$DOMAIN ;; 2[12]) HOSTNAMEnetwork$[$1-20].$DOMAIN GATEWAY10.1.8.2 DNS223.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 [rootcentos7 bin 16:19:32]# chmod x sethost# 在模板虚拟机本地console中执行sethost命令测试例如 sethost 11 sethost 21 测试没有问题的情况下在执行init 0关机。 # 打快照快照名称为sethostname。 # 选中该快照点击克隆节省磁盘空间选择链接克隆。 # 克隆完成后启动这些虚拟机。 # 在克隆出来的虚拟机中执行脚本设置主机名和网络信息。 以network2 为例 sethost 21维护脚本在ha1节点开发1. 配置/etc/hosts [rootha1 ~ 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. 配免密登录[rootha1 ~16:38:12]# [ -d ~/.ssh ] || mkdir 700 ~/.ssh[rootha1 ~16:38:38]# ssh-keygen -t rsa -f ~/.ssh/id_rsa -N [rootha1 ~16:39:21]# echo StrictHostKeyChecking no /etc/ssh/ssh_config[rootha1 ~16:39:32]# for host in ha{1,2} proxy{1,2} network{1,2}dosshpass-p123ssh-copy-id root$host/dev/nullsshroot$hosthostnamedone3. 开发维护脚本[rootha1 ~16:42:31]# cd bin/[rootha1 bin16:42:33]# vim weihu#!/bin/bashfunctionusage(){echoUsage: weihu cmd COMMAND, 在集群中所有的机器上执行对应COMMAND命令echoUsage: weihu copy source target将本地source文件推送到集群中所有的机器上exit}action$1HOSTLISTha1 ha2 proxy1 proxy2 network1 network2(($#1))usagecase$actionincmd)# 删除参数1shiftCOMMAND$*forhostin$HOSTLISTdosshroot$host$COMMANDdone;;copy)# 删除参数1shiftforhostin$HOSTLISTdoscp$1root$host:$2done;;*)usage;;esac[rootha1 bin16:52:01]# chmod x weihu4. 验证[rootha1 ~17:04:56]# weihu cmd hostnameha1.han.cloud ha2.han.cloud proxy1.han.cloud proxy2.han.cloud network1.han.cloud network2.han.cloud[rootha1 ~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[rootha1 ~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