循环语句与函数
echo简述循环语句for循环语句表达式一表达式二表达式三(变量值的迭代方式)表达式四批量添加用户且密码均为111222批量检测指定ip地址连通性while循环语句例一例二untli循环语句示例breakcontinueIFS字段分隔符echo简述
echo -n:表示不转行输出echo -e:输出转义符,将转义后的内容输出到屏幕上常用的转义符循环语句
for循环语句
for循环操作也统称遍历操作读取不同的变量值,用来逐个执行同一组命令逻辑图释表达式一
[root@localhost ~]# for a in {1..5}; do echo $a; done 12345【使用for循环语句输出1到5并赋值给变量a】[root@localhost ~]# for i in {1..5..2}> do> echo $i> done135【使用for循环语句每次间隔2输出1到5并赋值给变量i】
表达式二
[root@localhost ~]# seq 1 3 1014710【使用seq每次间隔3从1到10开始赋值,seq仅仅执行数值的连续操作】[root@localhost ~]# for a in $(seq 1 5) > do> echo "$(($a*2))"> done246810【提取seq连续操作值后赋值给变量a的值,并将此变量*2】
表达式三(变量值的迭代方式)
[root@localhost ~]# for ((i=1;i<5;i++)) > do> echo $i> done1234【使用for语句进行循环操作,且需赋值的变量1=i<5且每次i自加1】[root@localhost ~]# for ((i=1;i<8;i+=3)); do echo $i; done147【使用for语句进行循环操作,且需赋值的变量1=i<8且每次+3进行赋值】
表达式四
[root@localhost ~]# for ((i=0; i<=8; i+=2))> do> echo "$[$i+$i+$i]"> done06121824【使用for语句进行循环操作,且需赋值的变量1=i<8且每次+2进行赋值,echo输出的是变量i+变量i+变量i的值】
批量添加用户且密码均为111222
[root@localhost ~]# vim name1.txt[root@localhost ~]# vim dome.sh #!/bin/bashq=$(cat name1.txt)for i in $qdouseradd $iecho "$111222" | passwd --stdin $i【通过管道符号把111222输出给pasww $1】#echo -e "111222\n111222\n" | passwd $i【通过转义符-n的换行回车进行秘密的确认,从而实现变量i的密码输入】done[root@localhost ~]# chmod +x dome.sh [root@localhost ~]# ./dome.sh 更改用户 qq 的密码 。passwd:所有的身份验证令牌已经成功更新。更改用户 ww 的密码 。passwd:所有的身份验证令牌已经成功更新。更改用户 ee 的密码 。passwd:所有的身份验证令牌已经成功更新。更改用户 rr 的密码 。passwd:所有的身份验证令牌已经成功更新。更改用户 tt 的密码 。passwd:所有的身份验证令牌已经成功更新。
批量检测指定ip地址连通性
[root@localhost ~]# for i in 192.168.1.{0..5}; do ping -c 3 -i 0.5 -W 3 $i &> /dev/null && echo "$i 在线" || echo "$i 不在线";done192.168.1.0 不在线192.168.1.1 在线192.168.1.2 不在线192.168.1.3 不在线192.168.1.4 在线192.168.1.5 不在线【使用for语句进行192.168.1.{0-5}网段的ping操作(共3个包,每次间隔0.5秒,3秒后超时)并赋值给i,并将变量i的值丢到黑洞文件。最终判断条件是否成立,成立则输出变量i在线,不成立则输出变量i不在线】
while循环语句
重复测试某个条件,只要条件成立则立刻反复执行赋完初始值后需要自己加入迭代方式,否则将陷入死循环逻辑图释[root@localhost ~]# vim text1.sh#!/bin/bashi=0 【定义变量i=0】while [ $i -le 4 ] 【测试条件i小于等于4】do echo $i 【输出i的值】let i++ 【自定义1个迭代方式】【输出的值和迭代方式这两行如果放错位置,那么最终输出的结果也将不同】done[root@localhost ~]# chmod +x text1.sh [root@localhost ~]# ./text1.sh 01234
例一
批量添加用户 用户名称以qzqz开头,按数字顺序进行编号共添加5个用户,初始密码均设为111222[root@localhost ~]# vim text2.sh #!/bin/bashi=1while [ $i -le 5 ]douseradd qzqz$iecho "111222" | passwd --stdin qzqz$i &> /dev/null【将执行完的提示丢进黑洞文件】i=$[$i+1] 【变量叠加方式为每次+1】done[root@localhost ~]# chmod +x text2.sh [root@localhost ~]# ./text2.sh
例二
随机猜测水果价格 通过变量RANDOM获得随机数提示用户猜测并记录猜测的次数,当用户猜中后则退出循环价格区间在0-99[root@localhost ~]# vim text3.sh[root@localhost ~]# chmod +x text3.sh[root@localhost ~]# vim text3.sh#!/bin/basha=$[$RANDOM % 100]【通过取余的方式将RANDOM随机值定义在0-99之间,RANDOM上限为99999】 b=0d=0echo "猜一猜该水果的价格:" while [ $b -eq 0 ]【当变量值b等于0时执行while语句操作】dolet d++ 【每执行一次语句操作次数+1,并赋予变量名d,以便最终输出共猜测了几次】read -p "输入你猜测的价格:" c【提示用户输入猜测的价格并赋予变量c】if [ $c -eq $a ];then 【如果用户输入的变量c等于RANDOM随机出来的数字】echo "你猜对了!"b=1 【因为变量b等于0时才执行while语句,所以这里b=1用于跳出while循环】elif [ $c -gt $a ];thenecho "你猜多了!"elif [ $c -lt $a ];thenecho "你猜少了!" fidoneecho "你总共猜了 $d 次。" :wq[root@localhost ~]# ./text3.sh 猜一猜该水果的价格:输入你猜测的价格:50你猜少了!输入你猜测的价格:65你猜多了!输入你猜测的价格:57你猜少了!输入你猜测的价格:63你猜少了!输入你猜测的价格:64你猜对了!你总共猜了 5 次。
untli循环语句
重复测试某个条件,只要条件不成立则反复执行逻辑图释[root@localhost ~]# vim text5.sh#!/bin/basha=0until [ $a -gt 5 ]【定义条件为a>5时untile语句不生效】doecho $a let a++done[root@localhost ~]# chmod +x text5.sh [root@localhost ~]# ./text5.sh 012345
示例
通过循环累加的方式计算1-35的和值[root@localhost ~]# vim text5.sh#!/bin/basha=0sum=0until [ $a -gt 35 ]【定义条件为a>35时untile语句不生效】dosum=$[$sum + $a] let a++doneecho $sum:wq[root@localhost ~]# ./text5.sh 630
break
break可以跳出单个循环[root@localhost ~]# vim text6.sh#!/bin/bashfor ((b=1;b<=3;b++))doecho "外层循环为$b"for ((c=1;c<=3;c++))doecho "内存循环为$c"donedone[root@localhost ~]# chmod +x text6.sh [root@localhost ~]# ./text6.sh 外层循环为1内存循环为1内存循环为2内存循环为3外层循环为2内存循环为1内存循环为2内存循环为3外层循环为3内存循环为1内存循环为2内存循环为3[root@localhost ~]# vim text6.sh#!/bin/bashfor ((b=1;b<=3;b++))doecho "外层循环为$b"for ((c=1;c<=3;c++))doecho "内存循环为$c"if [ $c -eq 2 ];then 【当变量c等于2时执行break操作,如果break 2则代表跳出2层循环】breakfidonedone[root@localhost ~]# ./text6.sh 外层循环为1内存循环为1内存循环为2外层循环为2内存循环为1内存循环为2外层循环为3内存循环为1内存循环为2
continue
continue中止某次循环中的命令,但不会完全中止整个命令[root@localhost ~]# vim text6.sh#!/bin/bashfor ((b=1;b<=5;b++))doecho "外层循环为$b"if [ $b -gt 2 -a $b -lt 4 ];then 【当变量值b大于2且小于4时执行continue操作】continuefiecho $[$b *2] done[root@localhost ~]# ./text6.sh 外层循环为12外层循环为24外层循环为3【因为当执行到3时满足变量值b大于2且小于4的条件,所以执行continue操作,中止当前一次循环命令】外层循环为48外层循环为510
IFS字段分隔符
[root@localhost ~]# set | grep IFSIFS=$' \t\n'【默认包含“空格,制表符,换行符”】...略...local IFS='[root@localhost ~]# oldifs=$IFS【修改前先赋值给oldifs。以便使用完后好修改回初始值】[root@localhost ~]# IFS=$'\n' 【修改成只换行】[root@localhost ~]# set | grep IFSIFS=$'\n'local option option2 i IFS=' ...略...local IFS='[root@localhost ~]# IFS=$oldifs【修改回初始值】[root@localhost ~]# set | grep IFSIFS=$' \t\n'...略...local IFS='