循环的含义
将代码重复运行多次,通常有进入循环的条件和退出循环的条件
重复运行次数
循环次数事先已知 或者 循环次数事先位置
常见的循环指令有:for 、while 、 until
循环语句for
(读取不同的变量值,用来追个执行同一组命令)
遍历结构:
for 变量名 in 取值列表
do
命令
done
小总结: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
until循环
重复测试某个条件,只要条件不成立就反复运行
until 条件测试操作
do
命令序列
done
拓展: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