Shell04---循环语句

1. 循环语句for基本概述

01. for循环基础语法

for   变量名    in    [ 取值列表 ]
do
循环体
done



02. for循环基本使用示例

#取值列表有多种取值方式,可以直接读取in后面的值,默认以空格做分割符
[root@gjy /scripts]# cat for-1.sh
#!/bin/bash
for var in file1 file2 file3
do
echo "The text is $var"
done [root@gjy /scripts]# sh for-1.sh
The text is file1
The text is file2
The text is file3

03. for循环基本使用示例,列表中的复杂值,可以使用引号或转义字符"\"来加以约束

[root@gjy /scripts]# cat for-2.sh
#!/bin/bash
for var in file1 "file2 hello" file3
do
echo "The text is $var"
done [root@gjy /scripts]# sh for-2.sh
The text is file1
The text is file2 hello
The text is file3 #转义字符
[root@gjy /scripts]# cat for-3.sh
#!/bin/bash
for var in file1 file \'2
do
echo "The text is $var"
done [root@gjy /scripts]# sh for-3.sh
The text is file1
The text is file
The text is '2

04. for循环基本使用示例,从变量中取值

[root@gjy /scripts]# cat for-4.sh
#!/bin/bash
list="file1 file2 file3"
for var in $list
do
echo $var
done [root@gjy /scripts]# sh for-4.sh
file1
file2
file3

05. for循环基本使用示例,从命令中取值

[root@gjy /scripts]# cat for-5.sh
#!/bin/bash
for var in `cat /etc/hosts`
do
echo $var
done [root@gjy /scripts]# sh for-5.sh
127.0.0.1
localhost
localhost.localdomain
localhost4
localhost4.localdomain4
::1
localhost
localhost.localdomain
localhost6
localhost6.localdomain6

06. for循环基本使用示例,自定义Shell分隔符。默认情况以空格为分隔符。通过IFS来自定义分隔符

#以冒号做分隔符                         IFS=:
#以冒号,分号和双引号作为字段分隔符 IFS=:;"
#以换行符作为字段分隔符 IFS=$'\n' #以回车为换行符
[root@gjy /scripts]# cat for-6.sh
#!/bin/bash
IFS=$'\n'
for var in `cat /etc/hosts`
do
echo $var
done [root@gjy /scripts]# sh for-6.sh
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 #以:为分隔符
[root@gjy /scripts]# cat for-7.sh
#!/bin/bash
IFS=:
list=`head -1 /etc/passwd`
for var in $list
do
echo $var
done [root@gjy /scripts]# sh for-7.sh
root
x
0
0
root
/root
/bin/bash

07. for循环基本使用示例,C语言风格的for

#语法格式
for ((i=0;i<10;i++))
do
commands
done #例1,单个变量,输出1到10之间的数字
[root@gjy /scripts]# cat for-8.sh
#!/bin/bash
for ((i=0;i<10;i++))
do
echo num is $i
done [root@gjy /scripts]# sh for-8.sh
num is 0
num is 1
num is 2
num is 3
num is 4
num is 5
num is 6
num is 7
num is 8
num is 9 #例2,多个变量,同时输出1-9的升序和降序
#解法一:
[root@gjy /scripts]# cat for-9.sh
#!/bin/bash
for ((a=1,b=9;a<10;a++,b--))
do
echo num is $a $b
done [root@gjy /scripts]# sh for-9.sh
num is 1 9
num is 2 8
num is 3 7
num is 4 6
num is 5 5
num is 6 4
num is 7 3
num is 8 2
num is 9 1 #解法二:
[root@gjy /scripts]# cat for-10.sh
#!/bin/bash
a=0
b=10
for i in {1..9}
do
let a++;
let b--;
echo num is $a $b
done [root@gjy /scripts]# sh for-10.sh
num is 1 9
num is 2 8
num is 3 7
num is 4 6
num is 5 5
num is 6 4
num is 7 3
num is 8 2
num is 9 1

2. 循环语句for场景示例

01. for循环场景示例一:通过读入文件中的用户,进行批量添加用户。

[root@gjy /scripts]# cat for-11.sh
#!/usr/bin/bash
for i in $(cat user.txt)
do
useradd $i &>/dev/null
if [ $? -eq 0 ];then
echo $i 用户创建成功
else
echo $i 用户已存在
fi
done [root@gjy /scripts]# sh for-11.sh
tt1 用户创建成功
tt2 用户创建成功
tt3 用户创建成功
tt4 用户创建成功
tt5 用户创建成功
tt6 用户创建成功
tt7 用户创建成功
tt8 用户创建成功
tt9 用户创建成功
tt10 用户创建成功

02. for循环场景示例二:通过读入文件中的用户:密码,进行批量添加用户。

[root@gjy /scripts]# cat user.txt
user01:suibian
user02:suibian2
user03:suibian3 [root@gjy /scripts]# cat for-12.sh
#!/usr/bin/bash
for i in $(cat user.txt)
do
#1.取出来的行,使用awk进行分隔,然后分别赋值给user和pass两个变量
user=$(echo $i|awk -F ":" '{print $1}')
pass=$(echo $i|awk -F ":" '{print $2}')
#2.判断用户是否存在
id $user &>/dev/null
#3.用户存在则提示已存在,否则添加用户,然后使用pass变量设定对应的密码
if [ $? -eq 0 ];then
echo "$user 已存在"
else
useradd $user
echo "$pass" | passwd --stdin $user &>/dev/null
echo "用户$user 创建成功!"
fi
done [root@gjy /scripts]# sh for-12.sh
用户user1 创建成功!
用户user2 创建成功!
用户user3 创建成功!

03. for循环场景示例三:批量创建用户脚本,需要用户输入创建的用户数量,以及需要用户输入创建的前缀。

[root@gjy /scripts]# cat for-13.sh
#!/usr/bin/bash
read -p "请输入你要创建的用户前缀: " user_qz
read -p "请输入你要创建的用户数量: " user_num
echo "你创建的用户是 ${user_qz}1 ..${user_qz}${user_num}"
read -p "你确定要创建以上用户吗?[ y/n ] " readly
case $readly in
y)
for i in $(seq $user_num)
do
user=${user_qz}${i}
id $user &>/dev/null
if [ $? -eq 0 ];then
echo "useradd: user $user already exists"
else
useradd $user
echo "useradd: user $user add successfully."
fi
done
;;
n)
echo "你想好了再创建......"
exit
;;
*)
echo "请不要乱输入...."
exit 1
esac [root@gjy /scripts]# sh for-13.sh
请输入你要创建的用户前缀: qiu
请输入你要创建的用户数量: 5
你创建的用户是 qiu1 ..qiu5
你确定要创建以上用户吗?[ y/n ] n
你想好了再创建...... [root@gjy /scripts]# sh for-13.sh
请输入你要创建的用户前缀: qiu
请输入你要创建的用户数量: 5
你创建的用户是 qiu1 ..qiu5
你确定要创建以上用户吗?[ y/n ] q
请不要乱输入.... [root@gjy /scripts]# sh for-13.sh
请输入你要创建的用户前缀: qiu
请输入你要创建的用户数量: 5
你创建的用户是 qiu1 ..qiu5
你确定要创建以上用户吗?[ y/n ] y
useradd: user qiu1 add successfully.
useradd: user qiu2 add successfully.
useradd: user qiu3 add successfully.
useradd: user qiu4 add successfully.
useradd: user qiu5 add successfully.

04. for循环场景示例四:批量创建用户脚本,需要用户输入创建的用户数量(必须是整数),同时还需要用户输入前缀(前缀不能为空)。例如:前缀qls,个数10,代表创建qls1~qls10,总共10个用户。注意:此脚本仅root可执行,其他人无权限执行。

[root@gjy /scripts]# cat for-14.sh
#!/usr/bin/bash
if [ ! $UID -eq 0 ] && [ ! $USER == "root" ];then
echo "无权限执行......"
exit
fi read -p "请输入你要创建的用户前缀: " user_qz
if [ -z $user_qz ];then
echo "请输入有效的值....."
exit
fi read -p "请输入你要创建的用户数量: " user_num
if [[ ! $user_num =~ ^[0-9]+$ ]];then
echo "请输入整数"
exit
fi echo "你创建的用户是 ${user_qz}1 ..${user_qz}${user_num}"
read -p "你确定要创建以上用户吗?[ y/n ] " readly
case $readly in
y|yes|YES)
for i in $(seq $user_num)
do
user=${user_qz}${i}
id $user &>/dev/null
if [ $? -eq 0 ];then
echo "useradd: user $user already exists"
else
useradd $user
echo "useradd: user $user add successfully."
fi
done
;;
n|no|NO)
echo "你想好了再创建......"
exit
;;
*)
echo "请不要乱输!"
exit
esac

05. for循环场景示例五:批量创建用户脚本,需要用户输入创建的用户数量(必须是整数),同时还需要用户输入前缀(前缀不能为空)。例如:前缀qls,个数10,代表创建qls1~qls10,总共10个用户。注意:此脚本仅root可执行,其他人无权限执行。用户的密码使用随机密码,并保存到某一个指定的文件中。

[root@gjy /scripts]# cat for-15.sh
#!/usr/bin/bash
if [ ! $UID -eq 0 ] && [ ! $USER == "root" ];then
echo "无权限执行......"
exit
fi read -p "请输入你要创建的用户前缀: " user_qz
if [ -z $user_qz ];then
echo "请输入有效的值....."
exit
fi read -p "请输入你要创建的用户数量: " user_num
if [[ ! $user_num =~ ^[0-9]+$ ]];then
echo "请输入整数"
exit
fi echo "你创建的用户是 ${user_qz}1 ..${user_qz}${user_num}"
read -p "你确定要创建以上用户吗?[ y/n ] " readly
case $readly in
y|yes|YES)
for i in $(seq $user_num)
do
user=${user_qz}${i}
id $user &>/dev/null
if [ $? -eq 0 ];then
echo "useradd: user $user already exists"
else
user_pass=$(echo $((RANDOM))|md5sum |cut -c 2-10)
useradd $user
echo "$user_pass" | passwd --stdin $user &>/dev/null
echo "用户: $user 密码: $user_pass" >> /tmp/user.log
echo "useradd: user $user add successfully. cat /tmp/user.log"
fi
done
;;
n|no|NO)
echo "你想好了再创建......"
exit
;;
*)
echo "请不要乱输!"
exit
esac

06. for循环场景示例六:批量删除(用户需要输入用户前缀及数字),有就删除,没有就提示没有该用户。

[root@gjy /scripts]# cat for-16.sh
#!/usr/bin/bash
if [ ! $UID -eq 0 ] && [ ! $USER == "root" ];then
echo "无权限执行......"
exit
fi read -p "请输入你要删除的用户前缀: " del_qz
if [ -z $del_qz ];then
echo "请输入有效的值....."
exit
fi read -p "请输入你要删除的用户数量: " user_num
if [[ ! $user_num =~ ^[0-9]+$ ]];then
echo "请输入整数"
exit
fi echo "你删除的用户是 ${del_qz}1 ..${del_qz}${user_num}"
read -p "你确定要删除以上用户吗?[ y/n ] " readly
case $readly in
y|yes|YES)
for i in $(seq $user_num)
do
user=${del_qz}${i}
id $user &>/dev/null
if [ $? -eq 0 ];then
userdel -r $user
echo "$user 用户删除成功....."
else
echo "$user 用户不存在..."
fi
done
;;
n|no|NO)
echo "你想好了再删除......"
exit
;;
*)
echo "请不要乱输!"
exit
esac [root@gjy /scripts]# sh for-16.sh
请输入你要删除的用户前缀: qiu
请输入你要删除的用户数量: 5
你删除的用户是 qiu1 ..qiu5
你确定要删除以上用户吗?[ y/n ] y
qiu1 用户删除成功.....
qiu2 用户删除成功.....
qiu3 用户删除成功.....
qiu4 用户删除成功.....
qiu5 用户删除成功.....

07. for循环场景示例七:批量探测主机存活状态及22端口状态

1)需要用循环,循环254次

2)探测主机使用ping命令

[root@gjy /scripts]# cat for-17.sh
#!/usr/bin/bash
> /tmp/ip.log
for i in {1..254}
do
{
ip=172.16.1.$i
ping -c 1 -W 1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ip is ok"
echo "$ip is ok" >>/tmp/ip.log
else
echo "$ip is down"
fi
} &
done
wait
echo "Sao Miao IP is Done"
echo "Test SSH Port Starting......"
IFS=$'\n'
for i in $(cat /tmp/ip.log)
do
port_ip=$(echo $i |awk '{print $1}')
nmap $port_ip |grep "22" &>/dev/null
if [ $? -eq 0 ];then
echo "$port_ip 22 is ok!!"
echo "$port_ip 22 is ok!!" >> /tmp/port.log
fi
done

08. for循环场景示例八:编写一个上课随机点名脚本。

1.需要有名字

2.需要循环的打印这些名单

3.随机挑选一个数字进行打印

[root@gjy /scripts]# cat for-18.sh
#!/usr/bin/bash
#1.统计文件的行数
number=$(wc -l /root/student.txt|awk '{print $1}')
#2.整个循环20次
for i in {1..20}
do
#3.通过random取随机数,但不超过文件的行数
stu_num=$((RANDOM % $number + 1 ))
#4.循环一次打印一次随机的名
sed -n "${stu_num}p" /root/student.txt
#5.等待0.1s之后再循环下一次
sleep 0.10
done
#6.将最后一次循环提取的人名赋值给name_stu
name_stu=$(sed -n "${stu_num}p" /root/student.txt)
#7.自定义输出人名,外加颜色,好看。
echo -e "天选子: \033[32m ${name_stu}....\033[0m"

09. for循环场景示例九:使用for循环实现数据库的分库分表备份。

1.怎么备份数据库

 mysqldump -uroot -p123.com --single-transaction -B world > world_database.sql

2.怎么备份数据库的表

mysqldump -uroot -p123.com --single-transaction world city > world_city_tables.sql

3.备份到哪儿

/mysql_dump/oldboy/city_2019_07_16.sql
#!/usr/bin/bash
db_name=$(mysql -uroot -p123.com -e "show databases;"|sed 1d |grep -v ".*_schema")_
DB_User=root
DB_Pass=123.com
Date=$(date +%F)
for database_name in $db_name
do
#1.准备每个库的目录
DB_Path=/mysql_dump/$database_name
if [ ! -d $DB_Path ];then
mkdir -p $DB_Path
fi
#2.备份数据库
mysqldump -u$DB_User -p$DB_Pass --single-transaction \
-B $database_name > $DB_Path/${database_name}_${Date}.sql
echo -e "\033[31m $database_name 数据库已经备份完成..... \033[0m"
#3.备份数据库的每一个表
tb_name=$(mysql -u$DB_User -p$DB_Pass -e "use ${database_name};show tables;"|sed 1d)
#4.批量的备份数据库的表
for table_name in $tb_name
do
#5.备份数据库的表数据
mysqldump -u$DB_User -p$DB_Pass --single-transaction \
$database_name $table_name > $DB_Path/${database_name}_${table_name}_tables_${Date}.sql
echo -e "\033[32m 备份$database_name 的数据库中的 $table_name 数据表,备份成功 \033[0m"
done
done

10. for循环场景示例十:用于判断mysql数据库主从的脚本,需要邮件通知。

1.判断io线程和sql线程是否都为yes,如果是则成功。

2.如果io线程失败,则直接邮件通知,如果sql线程失败,则检查是什么错误状态码,根据状态码修复。

3.无法修复,或任何错误代码太复杂建议,直接发邮件通知管理员。

[root@gjy /scripts]# cat for-20.sh
#!/usr/bin/bash
IO_Status=$(mysql -uroot -p123.com -e "show slave status\G"|awk '/Slave_IO_Running/ {print $2}')
SQL_Status=$(mysql -uroot -p123.com -e "show slave status\G"|awk '/Slave_SQL_Running/ {print $2}')
slave_sql_error_message(){
mysql -uroot -p123.com -e "show slave status\G"|grep "Last_SQL" > /tmp/sql_err.log
mail -s "MySQL Master SLave SQL Error $(date +%F)" 1176494252@qq.com < /tmp/sql_err.log
echo "邮件通知成功......"
} slave_io_error_message(){
mysql -uroot -p123.com -e "show slave status\G"|grep "Last_IO" > /tmp/io_err.log
mail -s "MySQL Master SLave IO Error $(date +%F)" 1176494252@qq.com < /tmp/io_err.log
echo "邮件通知成功......"
} if [ $IO_Status == "Yes" ] && [ $SQL_Status == "Yes" ];then
echo "MySQL主从正常"
else
#1.判断IO异常
if [ ! $IO_Status == "Yes" ];then
slave_io_error_message
exit
fi
#2.判断SQL异常
if [ ! $SQL_Status == "Yes" ];then
SQL_Err=$(mysql -uroot -p123.com -e "show slave status\G"|awk '/Last_SQL_Errno/ {print $2}')
#3.精细化判断主从不同步的问题
case $SQL_Err in
1007)
echo "主从的SQL出现问题,尝试使用set global sql_slave_skip_counter=1; 跳过错误"
sleep 2
mysql -uroot -p123.com -e "stop slave;set global sql_slave_skip_counter=1;start slave;"
SQL_Err_1=$(mysql -uroot -p123.com -e "show slave status\G"|awk '/Last_SQL_Errno/ {print $2}')
if [ $SQL_Err_1 -eq 0 ];then
echo "尝试跳过了一次,恢复MySQL数据库成功"
else
slave_sql_error_message
fi
;;
1032)
slave_sql_error_message
;;
*)
slave_sql_error_message
esac
fi
fi

3. 循环语句while基本概述

while循环语句,只要条件成立就反复执行对应的命令操作,直到命令不成立或为假

01. while循环基础语法

#当条件测试成立(条件测试为真),执行循环体
while 条件测试
do 循环体
done



02. while循环基本使用示例,降序输出10到1的数字

[root@gjy /scripts]# cat while-1.sh
#!/bin/bash
var=10
while [ $var -gt 0 ]
do
echo $var
var=$[$var-1]
done #简单加法表
[root@gjy /scripts]# cat while-2.sh
#!/usr/bin/bash
a=1
b=10
while [ $a -le 10 ]
do
sum=$(( $a + $b ))
echo $a + $b = $sum
let a++
let b--
done

03. while循环基本使用示例,输出如下图,两数相乘。

#自增
[root@gjy /scripts]# cat while-3.sh
#!/bin/bash
num=9
while [ $num -ge 1 ]
do
sum=$(( $num * $num ))
echo "$num * $num = $sum"
num=$[$num-1]
done #自减
[root@gjy /scripts]# cat while-4.sh
#!/bin/bash
num=1
while [ $num -le 9 ]
do
sum=$(( $num * $num ))
echo "$num * $num = $sum"
num=$[$num+1]
done

4. 循环语句while场景示例

01. 使用while读入文件方式,批量创建用户,while默认按行取值

[root@gjy /scripts]# cat while-5.sh
#!/usr/bin/bash
while read line
do
#1.判断用户是否存在
id $line &>/dev/null
if [ $? -eq 0 ];then
echo "User: $line already exists"
else
useradd $line &>/dev/null
echo "User: $line Create Ok"
fi
done<user.txt [root@gjy /scripts]# cat user.txt
ttt1
ttt2
ttt3
ttt4
ttt5

02. 使用while读入文件方式,批量创建用户以及密码[user:passwd]

[root@gjy /scripts]# cat while-6.sh
#!/usr/bin/bash
while read line
do
user=$(echo $line |awk -F ':' '{print $1}')
pass=$(echo $line |awk -F ':' '{print $2}')
id $user &>/dev/null
if [ $? -eq 0 ];then
echo "用户已存在"
else
useradd $user && \
echo $pass |passwd --stdin $user &>/dev/null
echo "用户: $user is ok 密码: $pass "
fi
done<user.txt [root@gjy /scripts]# cat user.txt
tttt1:ggdfg
tttt2:fbthb
tttt3:fbtbht
tttt4:bthht
tttt5:frgt

03. 使用while读入文件方式,批量创建用户,并赋予一个随机密码

[root@gjy /scripts]# cat while-7.sh
#!/usr/bin/bash
while read line
do
pass=$(echo $RANDOM |md5sum |cut -c1-10)
id $line &>/dev/null
if [ $? -eq 0 ];then
echo "用户已存在"
else
useradd $line && \
echo $pass |passwd --stdin $line &>/dev/null
echo "用户: $line is ok 密码: $pass "
fi
done<user.txt

04. while循环场景示例:完成如下猜数字游戏

  1. 随机输出一个1-100的数字 echo $((RANDOM % 100 + 1 ))

  2. 要求用户输入的必须是数字(数字处加判断)

  3. 如果比随机数小则提示比随机数小了

    大则提示比随机数大了

  4. 正确则退出

    错误则继续死循环

  5. 最后统计总共猜了多少次(成功多少次,失败多少次)

#!/usr/bin/bash
sj=$(echo $((RANDOM % 100 + 1 )))
i=0
while true
do
read -p "请输入一个你需要猜的数字: " cc
if [[ ! $cc =~ ^[0-9]+$ ]];then
echo "请输入整数"
continue
fi
#将用户的输入的数字与随机数进行比较
if [ $cc -gt $sj ];then
echo "你猜的太大"
elif
[ $cc -lt $sj ];then
echo "你猜的太小,继续加油"
else
echo "猜对了....."
break
fi
#进行数值自增
let i++
done
echo "你总共失败了多少次 $i"
echo "你总共猜了多少次 $(( $i + 1 ))"

05. while循环场景示例:随机点菜脚本

菜单显示以下内容

#!/bin/bash
menu(){
echo -e "*********************************"
echo -e "* 1.青椒土豆丝\t\t*"
echo -e "* 2.麻婆豆腐\t\t*"
echo -e "* 3.红烧大盘鸡\t元\t*"
echo -e "* 4.宫保鸡丁\t\t*"
echo -e "* 5.鱼香肉丝\t\t*"
echo -e "* 6.西红柿鸡蛋\t\t*"
echo -e "* 7.红烧肉\t\t*"
echo -e "* 8.酸菜鱼\t元\t*"
echo -e "* 9.结束点菜\t\t*"
echo -e "*********************************"
} num=`echo $((RANDOM%9+1))`
while true
do
menu
read -p "请开始点菜:" num
case $num in
1)
echo "您点了青椒土豆丝"
;;
2)
echo "您点了麻婆豆腐"
;;
3)
echo "您点了红烧大盘鸡"
;;
4)
echo "您点了宫保鸡丁"
;;
5)
echo "您点了鱼香肉丝"
;;
6)
echo "您点了西红柿鸡蛋"
;;
7)
echo "您点了红烧肉"
;;
8)
echo "您点了酸菜鱼"
;;
9)
echo "稍等,马上上菜!"
exit
esac
done

5. 内置跳出循环语句指令

在我们使用循环语句进行循环的过程中,有时候需要在未达到循环结束条件时强制跳出循环,那么Shell给我们提供了内置方法来实现该功能:exit、break、continue

01. exit,退出整个程序

[root@gjy /scripts]# cat for-exit.sh
#!/bin/bash
for i in {1..3}
do
echo "123"
exit
echo "456"
done
echo "done ......" #执行结果
[root@gjy /scripts]# sh for-exit.sh
123

02. break,结束当前循环,或跳出本层循环

[root@gjy /scripts]# cat for-break.sh
#!/bin/bash
for i in {1..3}
do
echo "123"
break
echo "456"
done
echo "done ......" #执行结果
[root@gjy /scripts]# sh for-break.sh
123
done ......



03. continue,忽略本次循环剩余的代码,直接进行下一次循环。

[root@gjy /scripts]# cat for-continue.sh
#!/bin/bash
for i in {1..3}
do
echo "123"
continue
echo "456"
done
echo "done ......" #执行结果
[root@gjy /scripts]# sh for-continue.sh
123
123
123
done ......



04. 习题:先扫描内网网段所有主机,存活的则下发当前主机的公钥。

[root@gjy /scripts]# cat key.sh
#!/bin/bash
#删除旧的密钥对
rm -f ~/.ssh/id_rsa*
#下载安装包
yum install -y sshpass
#创建密钥对
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N "" &>/dev/null #批量分发公钥的操作
for ip in {2..10}
do
ping -W1 -c1 172.16.1.$ip &>/dev/null
if [ $? -eq 0 ];then
sshpass -p1 ssh-copy-id -p22 -i ~/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no" 172.16.1.$ip &>/dev/null
if [ $? -eq 0 ];then
echo -e "\033[32mhost 172.16.1.$ip Distribution of the secret key Success!!! \033[0m"
echo
else
echo -e "\033[31mhost 172.16.1.$ip Distribution of the secret key Failed !!! \033[0m"
echo
fi
else
echo -e "\033[31mhost 172.16.1.$ip Destination Host Unreachable! \033[0m"
continue
fi
done

点菜菜单

[root@web01 ~]# cat while3.sh
#!/bin/bash
menu() {
cat <<EOF
################################
1. 鱼香肉丝 30元
2. 红烧肉 60元
3. 尖椒炒蛋 20元
4. 清蒸鱼 48元
5. 糖醋排骨 48元
6. 结束点菜
################################
EOF
}
>caidan.txt
echo "欢迎光临,下面进入点菜系统:"
while true
do
menu
read -p "请开始点菜: " cai
case $cai in
1)
echo "你点了一份鱼香肉丝 30 元"
echo " 鱼香肉丝 30 元" >> caidan.txt
;;
2)
echo "你点了一份红烧肉 60 元"
echo "红烧肉 60 元 " >> caidan.txt
;;
3)
echo "你点了一份尖椒炒蛋 20 元"
echo "尖椒炒蛋 20 元 " >> caidan.txt
;;
4)
echo "你点了一份清蒸鱼 48元"
echo "清蒸鱼 48 元" >> caidan.txt
;;
5)
echo "你点了一份糖醋排骨 48元"
echo "糖醋排骨 48元" >> caidan.txt
;;
6)
echo "你结束了点菜,菜品和如下:"
sort caidan.txt | uniq -c |sort -rn |awk '{print "你点了"$2",总共"$1"份"}'
awk '{i+=$2}END{print "总价格为: "i" 元"}' caidan.txt
exit
;;
*)
echo "对不起,你点的菜没有"
continue
;;
esac
done

Shell04--循环语句的更多相关文章

  1. 【python之路4】循环语句之while

    1.while 循环语句 #!/usr/bin/env python # -*- coding:utf-8 -*- import time bol = True while bol: print '1 ...

  2. python之最强王者(3)——变量,条件、循环语句

    1.Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的 ...

  3. #9.5课堂JS总结#循环语句、函数

    一.循环语句 1.for循环 下面是 for 循环的语法: for (语句 1; 语句 2; 语句 3) { 被执行的代码块 } 语句 1 在循环(代码块)开始前执行 语句 2 定义运行循环(代码块) ...

  4. 详解Python中的循环语句的用法

    一.简介 Python的条件和循环语句,决定了程序的控制流程,体现结构的多样性.须重要理解,if.while.for以及与它们相搭配的 else. elif.break.continue和pass语句 ...

  5. 【java开发】分支语句、循环语句学习

    一.Java分支语句类型 if-else 语句 switch 关于if-esle语句可以拆分为三种 if语句 if(条件){语句块;} if-else语句if(条件语句){语句块;} if-else ...

  6. python3循环语句while

    Python的循环语句有for和while语句,这里讲while语句. Python中while语句的一般形式: while 条件判断 : 语句 需要注意冒号和缩进.另外,注意Python中没有do. ...

  7. 20.SqlServer中if跟循环语句

    --if语句declare @i int begin print @i end else --循环语句 declare @i int begin insert into grade(classname ...

  8. Python学习【第五篇】循环语句

    Python循环语句 接下来将介绍Python的循环语句,程序在一般情况下是按顺序执行的. 编程语言提供了各种控制结构,允许更复杂的执行路径. 循环语句允许我们执行一个语句或语句组多次. Python ...

  9. iOS -Swift 3.0 -for(循环语句用法)

    // // ViewController.swift // Swift-循环语句 // // Created by luorende on 16/12/08. // Copyright © 2016年 ...

  10. Python--While循环语句

    Python While循环语句 Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务.其基本形式为: while 判断条件: 执行语句 ...

随机推荐

  1. [LeetCode] 53. Maximum Subarray 最大子数组 --动态规划+分治

    Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...

  2. ChainMap简单示例

    ChainMap是dict的子类,拥有dict的所有功能, 感觉用它的地方吧??? from collections import ChainMap """ 相当于joi ...

  3. AGC040

    AGC040 A 模拟. B 因为顺序无关紧要,所以可以先把区间按右端点排序方便处理. 设第一个区间在\(A\)集合,考虑枚举第一个在\(B\)集合的区间\(i\),这样两个集合的右端点\(\min\ ...

  4. form submission

    https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms This module provides a series of articles ...

  5. isset、empty 误区

    isset()  常用来判定变量是否存在  但是当变量赋值为NUll时候,返回值一样是FALSE  而实际上变量是存在的,与实际情况不符,判定错误. empty() 用来判定变量或者类的属性值是否为等 ...

  6. HDU 5634 Rikka with Phi

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5634 ------------------------------------------------ ...

  7. mysql_DML_select_聚合join

    聚合函数: select avg(salary)//平均值 from wsb; select sum(salary)//总和 from wsb; select max(salary)//最大 from ...

  8. cron 定时任两种配置方式

    第一种:xml文件方式 <bean id="commonTimer" class="com.course.wx.timer.CommonTimer"> ...

  9. Support Vector Machine(1):线性可分集的决策边界

    与Logistuc Regression相比,SVM是一种优化的分类算法,其动机是寻找一个最佳的决策边界,使得从决策边界与各组数据之间存在margin,并且需要使各侧的margin最大化.比较容易理解 ...

  10. 20190825 On Java8 第十二章 集合

    第十二章 集合 java.util 库提供了一套相当完整的集合类(collection classes)来解决这个问题,其中基本的类型有 List . Set . Queue 和 Map. 不要在新代 ...