循环的含义

将代码重复运行多次,通常有进入循环的条件和退出循环的条件

重复运行次数

循环次数事先已知 或者 循环次数事先位置

常见的循环指令有:for 、while 、 until

循环语句for

(读取不同的变量值,用来追个执行同一组命令)

遍历结构:

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

for语句结构.png

小总结:for语句的开头有哪几种赋值方法

1、 for i in {1..100}
....................

2、for ((i=1; i<=100;i++))
i++先赋值,再+1

3、for $X in {1..100}
X和Y都是定义的变量值

while循环

(一种迭代的循环,迭代需要手动去设置)

重复测试某个条件,只要条件成立就反复执行

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

while的示意图.png

until循环

重复测试某个条件,只要条件不成立就反复运行

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

until示意图.png


拓展:echo的常用选项!

从结尾开始,匹配到第一个","结束。匹配的内容全删echo -n 表示不换行输出

echo -e 表示输出转义字符。将转义的内容输出到屏幕上

常见的转义字符如下:(得加上-e选项才能生效)

\b ;转义后相当于按退格按键,但是前提是"\b"后面存在字符,"\b\b"表示删除前面两个字符

\c ;不换行输出,在"\c"后面不存在字符的情况下。作用相当于echo -n ;但是当"\c"后面任然存在字符时候,"\c"后面的字符将不会被输出。

\n 换行,被输出的字符从"\n"处开始另起一行(换行带有回车的功能)

\f 换行,但是换行后的新行的开头位置连接着

\v 换行,与/f相同

/t 转义后插入tab,就是横向制表符(解释:水平空出几个格)

\r 光标移动到行首,但是不换行,相当于使用"\r"的名字以后面的字符覆盖"\r"之前等同长度的字符号。但是当"\r"后面不存在任何字符的时候,"\r"前面那的字符不会被覆盖
\\ 表示插入"\"本身


i=`echo "11,22,33,44" `
echo ${i%,*}
11,22,33
//从最后倒数到最短的匹配部分(%)后面的逗号的地方被删除

echo ${i%%,*}
11
//从最后倒数到最长的匹配部分(%%)后面的逗号的地方都删除掉!

echo ${i#*,}
22,33,44
//从开头到最短的匹配部分(#)后面的逗号的地方被删除

echo ${i##*,}
44
//从开头到最后的匹配部分(##)后面的逗号的地方被删除

总结:
${i%,*}从结尾开始,匹配到第一个","结束。匹配的内容全删
${i%%,*}从结尾开始,匹配到最后一个","结束。匹配的内容全删
${i#*,}从开头开始,匹配到第一个","结束。匹配的内容全删
${i#*,}从开头开始,匹配到最后一个","结束。匹配的内容全删
","是分割变量值的符号,也可以是";"":"等很多种形式

脚本实验

1、用递减的方式来将十进制转换成二进制

#!/bin/bash
read -p "请输入一个(0-255)的整数:" NUM
a=256
#因为是用递减法的的,又规定了网段0-255,所以从2^8  256开始减。就是NUM-256、128、64。。。。。能减的取1,不能减的取0.
for i in {1..8}
do
  a=$[$a / 2 ]
  num=$[$NUM - $a]
  if [ $num -lt 0 ]
  then
    echo -n 0
  else
    echo -n 1+
  RE=$[$NUM - $a]
  fi
done
echo "二进制是:$RE"

2、用while批量创建pei{1-20}的二十个账户

#!/bin/bash
name=1
while [ $name -gt 0 -a $name -le 20 ] 
do
   echo "正在创建用户...."
   useradd per$name
   echo 123456 | passwd --stdin per$name
   let name++
done

3、输密码,输错3次就报警

#!/bin/bash
read -p "请输入你的密码:" passwd

for i in {1..3}
do
   if [ $passwd = 666666 ]
   then
     echo "欢迎回来"
     exit 0
   elif [ $i -eq 3 ]
   then
    echo "已达到上限,请联系管理员"
    exit 1
   elif [ $passwd != 666666 ]
    then
    echo -n "输入错误,请重新输入:" 
    read passwd
  fi
done
#使用for循环写
#!/bin/bash
read -p "输入你的密码:" passwd
a=1
while [ $a -ge 1 -a $a -le 3 ]
do
   if [ $passwd = 123456 ]
   then
       echo "欢迎回来"
       exit
   elif [ $a -eq 3 ]
   then
       echo "错误3次,已经达到上限,请联系管理员!"
       exit 1
   elif [ $passwd != 123456 ]
   then
       echo "密码输入错误,清重新输入:";read passwd
       let a++
   fi
done
#使用while循环写

4、使用while来写一个随机价格竞猜商品

#!/bin/bash
true=$[RANDOM % 100 ]
#随机一个正真的商品价格
i=1
nu=0
#i用于设置死循环,nu是设置竞猜次数
while [ $i -eq 1 ]
#设置死循环,无限竞猜,只能猜对或者CTRL+C解除
do
   read -p "输入你竞猜的价格(0-100整数):" price
   if [ $price -gt $true ]
   then
       echo "猜高了,再来一次"
       let nu++
   elif [ $price -lt $true ]
   then
       echo "猜低了,再来一次"
       let nu++
   elif [ $price -eq $true ]
   then
       let nu++
       echo "恭喜你猜对了,你本次竞猜猜了 $nu 次,正确的价格是 $true"  
       exit
   fi
done