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. 自定义日志注解 + AOP实现记录操作日志

      需求:系统中经常需要记录员工的操作日志和用户的活动日志,简单的做法在每个需要的方法中进行日志保存操作, 但这样对业务代码入侵性太大,下面就结合AOP和自定义日志注解实现更方便的日志记录   首先看 ...

  2. Flink 实战:如何解决生产环境中的技术难题?

    大数据作为未来技术的基石已成为国家基础性战略资源,挖掘数据无穷潜力,将算力推至极致是整个社会面临的挑战与难题. Apache Flink 作为业界公认为最好的流计算引擎,不仅仅局限于做流处理,而是一套 ...

  3. TextView控件常用属性

    常用属性 android:id——控件ID android:layout_width——控件宽度 android:layout_height——控件高度 android:text——文本内容 andr ...

  4. c# 生成文件目录树

    class Program { //遍历目录名含有M00到M11的目录 //生成文件目录树(去除文件名中含有scc\Designer\designer\resx的文件) //生成的文件保存在D:\\a ...

  5. [USACO17JAN]Balanced Photo平衡的照片 (树状数组)

    题目链接 Solution 先离散化,然后开一个大小为 \(100000\) 的树状数组记录前面出现过的数. 然后查询 \((h[i],n]\) 即可. 还要前后各做一遍. Code #include ...

  6. js点击获取—通过JS获取图片的相对坐标位置

    一.通过JS获取鼠标点击时图片的相对坐标位置 源代码如下所示: <!DOCTYPE html> <html lang="en"> <head> ...

  7. digits 2

    digits 2 震惊了== 我还交的表,发现直接输出n个n就行=== #include<bits/stdc++.h> using namespace std; ]={ ", & ...

  8. [CSP-S模拟测试]:传递(暴力+bitset)

    题目描述 我们称一个有向图$G$是传递的,当且仅当对于图$G$的三个不同顶点$a,b,c$,若图$G$中有一条边从$a$到$b$且有一条边从$b$到$c$,那么图中也有一条边从$a$到$c$.我们称一 ...

  9. [CSP-S模拟测试]:太阳神(莫比乌斯反演)

    题目描述 太阳神拉很喜欢最小公倍数,有一天他想到了一个关于最小公倍数的题目.求满足如下条件的数对$(a,b)$对数:$a,b$均为正整数且$a,b\leqslant n$而$lcm(a,b)>n ...

  10. .Net服务组件(ServicedComponent)简介及其使用

    .NET Enterprise Services 为企业应用程序提供重要的基础结构.COM+ 为企业环境中部署的组件编程模型提供服务结构.System.EnterpriseServices命名空间向 ...