shell 三种循环(for; while—RANDOM猜价格游戏; until) 及两种中断跳出(break continue)——简单易懂多例子

一、for循环

(一)for循环

for循环,又有人称之为条件循环,或者for i in ,其实就是for循环的特性,次数和给与的条件是成正比的
for语句结构
读取不同的变量值,用来逐个执行同一组命令

for 变量名 in 取值列表
do                   
   命令序列
done

在这里插入图片描述
遍历

for i in {
    
    1..10}      迭代加1       |  {
    
    1..10..2}          迭代,每次循环加2
    或  $(seq 1 10)                |  $(seq 1 2 10)
或for ((i=1; i<=10; i++))          |  ((i=1; i<=10; i+=2))
do
echo $i
done 
#/bin/bash
#1-10
for ((i=1; i<=10; i++))$(seq 1 10)或者for i in {
    
    1..10}
do
 echo $i
done

在这里插入图片描述
在这里插入图片描述

例题1(批量创建用户)

1.创建包含用户名的文件在这里插入图片描述
2.编写脚本

#/bin/bash
#passwd
a=$(cat name.txt)
for i in a
do
 useradd $i
 echo "1234" | passwd --stdin $i
或echo -e "1234\n1234\n" | passwd $i  // 或这使用\n代表回车键
done
                                      

3.验证
在这里插入图片描述

例题二(测试主机连通性)

#!/bin/bash
#ping范围主机
for i in 172.16.100.{
    
    1..20}
do
 ping -c 3 -i 0.5 -W 2 $i &> /dev/null
if [ $? = 0 ]
  then
    echo "$i online"
else
 echo "$i offline"
fi
done

在这里插入图片描述

有多个for例题在之前的文章里有介绍链接

二、while循环

(一)先看例题在学内容

猜价格游戏

方法一:不使用break循环
price=$[$RANDOM % 1000]
a=0
times=0
echo "猜猜商品价格是多少"
while [ $a -eq 0 ]
do
let times++
read -p "请输入你猜的价格:" b
if [ $b -eq $price ];then
  echo "yes!"
  let a++
elif [ $b -gt $price ];then
  echo "你猜大了!"
elif [ $b -lt $price ];then
  echo "你猜小了!"
fi
done
echo "你总共猜了 $times 次"

方法二:
#!/bin/bash
#猜价格
let a=$RANDOM%1000
b=0
d=0
while yes!
do
read -p "输入价格" c
if [ $c = $a ]
  then
    echo "yes"
     break
elif [ $c -lt $a ]
  then
    echo "太低了"
else
    echo "太高了"
fi
let d++
done
echo "你输入多少次 $d"

(二)while循环

只要条件成立,则反复循环,不成立即停止
1、while语句结构

扫描二维码关注公众号,回复: 13014824 查看本文章
while 条件测试操作
do
   命令序列
done

在这里插入图片描述

#/bin/bash                             #/bin/bash                                  
#example                               #example
i=0                         注          i=0 
while (( $i <= 10 ))while [ $i -eq 10 ]
dodo 
echo "$i"let i++
let i++                                echo "$i"
done                                   done

第一个脚本输出0—10的内容,第二个脚本输出1—11的内容
(注意迭代的位置)

(三)例题二

批量添加以stu开头的5个用户;stu1—stu5,初始密码1234

#/bin/bash
#useradd
i=0
while [ $i -le 4 ]
do
let i++
useradd stu$i
echo "1234" | passwd --stdin stu$i
done

三、until(反while循环)

(一)until

重复测试某个条件,只要条件不成立则反复循环
1、until语句结构

until 条件测试操作
do  
   命令序列
done

在这里插入图片描述

显示1—10的整数

i=1
until [ $i -gt 10 ]       //i的值大于等10 不满足i>10的情况下执行循环
do
echo "$i"
let i++
done

(二)例题一

计算1—50的整数和

#/bin/bash
#sum 1-50
i=1
sum=0
until [ $i -gt 50 ]
do
sum=$(($sum+$i))
let i++
done
echo "$sum"

四、两种中断(break和continue)

break跳出单个循环;continue中止某次循环中的命令,但不会完全中止整个命令

for i in {
    
    1..5}
do
echo "外层循环 $i"
   for b in {
    
    1..5}
   do
     if [ $b -eq 3 ]
     then
      break            //break2则也停止外层循环
     fi
     echo "内层循环 $b"
     done
done
 

在这里插入图片描述
continue

for i in {
    
    1..5}
do
echo "外层循环 $i"
   for b in {
    
    1..5}
   do
     if [ $b -eq 3 ]
     then
      continue
     fi
     echo "内层循环 $b"
     done
done

在这里插入图片描述

五、常见的转以字符

cho -n 表示不换行输出
echo -e 输出转义字符,将转义后的内容输出到屏幕上
常用的转义字符如下:

  • \b 转义后相当于按退格键(backspace),但前提是"\b"后面存在字符;"\b"表示删除前一个字符,"\b\b"表示删除前两个字符
  • \c 不换行输出,在"\c"后面不存在字符的情况下,作用相当于 echo -n; 但是当"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出
  • \n 换行,被输出的字符从"\n"处开始另起一行
  • \f 换行,但是换行后的新行的开头位置连接着上一行的行尾
  • \v 与\f相同
  • \t 转以后表示插入tab,即横向制表符
  • \r 光标移至行首,但不换行,相当于使用"\r"以后的字符覆盖"\r"之前同等长度的字符;但是当"\r"后面不存在任何字符时,"\r"前面的字符不会被覆盖
  • \ 表示插入""本身;

六、IFS字段分割符

默认包含空格,制表符,换行符 set | grep IFS

1.修改
IFS=$'\t\n'
修改成只换行
IFS=$'\n'
IFS=':'
IFS=','
2.备份
IFS. OLD=$IFS
IFS=$'\n'
...
IFS=$IFS.OLD

(一)例题

输出环境变量PATH所包含的所有目录以及其中的所有可执行文件

for写法

#/bin/bash
OLDIFS=$IFS      ///备份IFS参数
IFS=':'          ///以:分割的字段输出,这样i就可以按字段取值
 for i in $PATH
 do
   for a in $i/*
   do
    if [ -x $a -a -f $a ];then
      echo "$a 文件有执行权限"
    fi
   done
 done
IFS=$OLDIFS       ///还原IFS默认值

猜你喜欢

转载自blog.csdn.net/weixin_53567573/article/details/114481486
今日推荐