第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第10天早上想再吃时,只剩下一个桃子了。
求第一天共摘了多少?4.2.3 while循环格式:while CONDITION; do 循环体done说明:CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环,因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正进入条件:CONDITION为true退出条件:CONDITION为false范例:#配置发邮件的邮箱[root@centos8 ~]#cat .mailrc set from=29308620@qq.comset smtp=smtp.qq.comset smtp-auth-user=29308620@qq.comset smtp-auth-password=esvnhbnqocirbicfset smtp-auth=loginset ssl-verify=ignore[root@centos8 ~]#cat while_diskcheck.sh#!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2020-01-03#FileName: while_diskcheck.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2020 All rights reservedWARNING=80while :;do USE=`df | sed -rn '/^/dev/sd/s#.* ([0-9]+)%.*#1#p' |sort -nr|head -n1` if [ $USE -gt $WARNING ];then echo Disk will be full from `hostname -I` | mail -s "disk warning"29308620@qq.com fi sleep 10done练习:用while实现编写脚本,求100以内所有正奇数之和编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态,并统计在线和离线主机各多少编写脚本,打印九九乘法表编写脚本,利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大值和最小值编写脚本,实现打印国际象棋棋盘后续六个字符串:efbaf275cd、4be9c40b8b、44b2395c46、f8c8873ce0、b902c16c8b、ad865d2f63是通过对随机数变量RANDOM随机执行命令: echo $RANDOM|md5sum|cut –c1-10后的结果,请破解这些字符串对应的RANDOM值无限循环while true; do 循环体done4.2.4 until循环格式:until CONDITION; do 循环体done说明:进入条件: CONDITION 为false退出条件: CONDITION 为true无限循环until false; do 循环体Done4.2.4 循环控制语句 continuecontinue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层格式:while CONDITION1; do CMD1 ... if CONDITION2; then continue fi CMDn ...done范例:[root@centos8 script40]#cat continue_for.sh#!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2020-01-03#FileName: continue_for.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2020 All rights reserved#********************************************************************for ((i=0;i<10;i++));do for((j=0;j<10;j++));do [ $j -eq 5 ] && continue 2 echo $j done echo ---------------------------done[root@centos8 script40]#bash continue_for.sh012340123401234012340123401234012340123401234012344.2.5 循环控制语句 breakbreak [N]:提前结束第N层整个循环,最内层为第1层格式:while CONDITION1; do CMD1 ... if CONDITION2; then break fi CMDn ...done范例:[root@centos8 script40]#cat break_for.sh#!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2020-01-03#FileName: continue_for.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2020 All rights reserved#********************************************************************for ((i=0;i<10;i++));do for((j=0;j<10;j++));do [ $j -eq 5 ] && break echo $j done echo ---------------------------done范例:[root@centos8 script40]#cat break_for.sh#!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2020-01-03#FileName: continue_for.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2020 All rights reserved#********************************************************************for ((i=0;i<10;i++));do for((j=0;j<10;j++));do [ $j -eq 5 ] && break 2 echo $j done echo ---------------------------done[root@centos8 script40]#bash break_for.sh01234范例:[root@centos8 script40]#cat menu.sh#!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2020-01-03#FileName: menu.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2020 All rights reserved#********************************************************************sum=0COLOR='echo -e 33[1;31m'COLOR2='echo -e 33[1;32m'END="33[0m"while true;doecho -e "33[33;1mc"cat <<EOF1) 鲍鱼2) 满汉全席3) 龙虾4) 燕窝5) 帝王蟹6) 退出EOFecho -e "33[0m"read -p "请点菜: " MENUcase $MENU in1|4) $COLOR'菜价: $10'$END let sum+=10 ;;3|5) $COLOR'菜价: $20'$END let sum+=20 ;;2) $COLOR'菜价: $1000'$END let sum+=1000 ;;6) $COLOR2"你点的菜总价格是 $sum"$END break ;;*) echo "点错了,没有这道菜" ;;esac$COLOR2"你点的菜总价格是 $sum"$ENDdone范例:[root@centos8 script40]#cat guess.sh#!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2020-01-03#FileName: guess.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2020 All rights reserved#********************************************************************NUM=$[RANDOM%10]while read -p "输入 0-9 之间的数字: " INPUT ;do if [ $INPUT -eq $NUM ];then echo "恭喜你猜对了!" break elif [ $INPUT -gt $NUM ];then echo "数字太大了,重新猜!" else echo "数字太小了,重新猜!" fidone4.2.6 循环控制 shift 命令shift [n] 用于将参量列表 list 左移指定次数,缺省为左移一次。
参量列表 list 一旦被移动,最左端的那个参数就从列表中删除。
while 循环遍历位置参量列表时,常用到 shift范例:doit.sh#!/bin/bash# Name: doit.sh# Purpose: shift through command line arguments# Usage: doit.sh [args]while [ $You can't use 'macro parameter character #' in math mode# -gt 0 ] # or (( $# > 0 ))do echo $* shiftdone./doit.sh a b c d e f g h范例:示例:shift.sh#!/bin/bash#step through all the positional parametersuntil [ -z "$1" ] do echo "$1" shiftdoneecho ./shfit.sh a b c d e f g h范例:[root@centos8 script40]#vim shift_batch_user.sh #!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2020-01-03#FileName: shift_batch_user.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2020 All rights reserved#********************************************************************if [ $# -eq 0 ];then echo "Usage: `basename $0` user1 user2 ..." exitfi while [ "$1" ];do if id $1 &> /dev/null;then echo $1 is exist else useradd $1 echo "$1 is created" fi shiftdoneecho "All user is created"[root@centos8 script40]#bash shift_batch_user.shUsage: shift_batch_user.sh user1 user2 ...[root@centos8 script40]#bash shift_batch_user.sh tom alice jacktom is existalice is existjack is createdAll user is created练习每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log中,并退出脚本随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出用文件名做为参数,统计所有参数文件的总行数用二个以上的数字为参数,显示其中的最大值和最小值4.2.7 while read 特殊用法while 循环的特殊用法,遍历文件或文本的每一行格式:while read line; do 循环体done < /PATH/FROM/SOMEFILE说明:依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line范例:[root@centos8 ~]#echo magedu | read X ; echo $X[root@centos8 ~]#echo magedu | while read X ; do echo $X;donemagedu[root@centos8 ~]#echo magedu | { read X ; echo $X; }magedu[root@centos8 ~]#echo magedu | ( read X ; echo $X )magedu[root@centos8 ~]#echo mage wang zhang | ( read X Y Z; echo $X $Y $Z )mage wang zhang[root@centos8 ~]#echo mage wang zhang | while read X Y Z; do echo $X $Y $Z;donemage wang zhang范例:cat while_read_diskcheck.sh#!/bin/bashWARNING=80MAIL=root@wangxiaochun.comdf |sed -nr "/^/dev/sd/s#^([^ ]+) .* ([0-9]+)%.*#1 2#p"|while read DEVICE USE;do if [ $USE -gt $WARNING ] ;then echo "$DEVICE will be full,use:$USE" | mail -s "DISK WARNING" $MAIL fidone范例:cat while_read_check_dos.sh#!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2020-01-03#FileName: while_read_check_dos.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2020 All rights reserved#********************************************************************lastb | sed -rn '/ssh:/s@.* ([0-9.]{1,3}{3}[0-9]{1,3}) .*@1@p'|sort |uniq -c|while read count ip ;do if [ $count -gt 3 ];then iptables -A INPUT -s $ip -j REJECT fi done范例:cat while_read_passwd.sh#!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2020-01-03#FileName: while_read_passwd.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2020 All rights reserved#********************************************************************while read line ;do if [[ "$line" =~ /sbin/nologin$ ]] ;then echo $line | cut -d: -f1,3 fi done < /etc/passwd4.2.8 select 循环与菜单格式:select variable in list ;do 循环体命令done说明:select 循环主要用于创建菜单,按数字顺序排列的菜单项显示在标准错误上,并显示 PS3 提示符,等待用户输入用户输入菜单列表中的某个数字,执行相应的命令用户输入被保存在内置变量 REPLY 中select 是个无限循环,因此要记住用 break 命令退出循环,或用 exit 命令终止脚本。
也可以按ctrl+c 退出循环select 经常和 case 联合使用与 for 循环类似,可以省略 in list,此时使用位置参量范例:cat select.sh #!/bin/bash#sum=0PS3="请点菜(1-6): "select MENU in 北京烤鸭 佛跳墙 小龙虾 羊蝎子 火锅 点菜结束;docase $REPLY in1) echo $MENU 价格是 100 let sum+=100 ;;2) echo $MENU 价格是 88 let sum+=88 ;;3) echo $MENU价格是 66 let sum+=66 ;;4) echo $MENU 价格是 166 let sum+=166 ;;5) echo $MENU 价格是 200 let sum+=200 ;;6) echo "点菜结束,退出" break ;;*) echo "点菜错误,重新选择" ;;esacdoneecho "总价格是: $sum"
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)