shell 循环语句[通俗易懂]

shell 循环语句[通俗易懂]循环语句:for语法结构:1、列表循环forvariablein{list}docommand…doneforvariableinvar1var2var3..docommand…done2、非列表循环forvariabledocommand..done3、类C风

大家好,又见面了,我是你们的朋友全栈君。

循环语句:
for 语法结构:
1、列表循环
for variable in {list}
do
command...
done
for variable in var1 var2 var3..
do
command...
done
2、非列表循环
for variable
do
command..
done
3、类C风格
for ((expr1;expr2;expr3))
do
command...
done
expr1:定义一个变量并且给初始值
expr2:根据某个条件决定循环的次数
expr3:变量以什么样的方式去改变
循环列表:
1030  for i in {
1..10};do echo $i;done
1031  for i in;do echo $i;done 1 2 3 
1032  for ((i=1;i<=50;i++));do echo $i;done
1033  for ((i=50;i<=100;i++));do echo $i;done
1034  for i in {
50..100};do echo $i;done
1035  for i in {
1..100..2};do echo $i;done
1036  for i in {
0..100..2};do echo $i;done
1037  for i in {
0..100..3};do echo $i;done
1038  for i in {
100..50..5};do echo $i;done
1039  for i in `seq 10`;do echo $i;done
1040  for i in $(seq 10);do echo $i;done
1041  for i in $(seq 1 2 10);do echo $i;done
for ((i=1;i<=10;i+=2));do echo $i;done
demo1:计算1-100之间的奇数之和
方法1#!/bin/bash
sum=0
for ((i=1;i<=100;i+=2))
do
sum=$[$sum+$i]
done
echo "1-100之间的奇数和为:$sum"
方法2#!/bin/bash
sum=0
for i in {
1..100..2}
do
#sum=$[$sum+$i]
let sum=$sum+$i
done
echo "1-100之间的奇数和为:$sum"
方法3#!/bin/bash
sum=0
for i in `seq 1 100`
do
[ $[$i%2] -ne 0 ] && sum=$[$sum+$i]
done
echo "1-100之间的奇数和为:$sum"
方法4#!/bin/bash
sum=0
for i in `seq 1 100`
do
if [ $[$i%2] -eq 0 ];then
continue
else
sum=$[$sum+$i]
fi
done
echo "1-100之间的奇数和为:$sum"
计算1-50之间的偶数之和
循环控制:
continue:重新开始下一次循环,继续。
break:打断,马上停止此次循环,执行循环体外的代码
exit:退出,退出循环
demo2:输入一个正整数,判断其是不是质数(素数)
质数:能被1和它自己本身整除的数
2 3 5 7 11 13 17...
思路:
1、如果所输入的整数能被其他整数整除,它就不是质数 $num%$i=0
2、根据上面的方法需要排除12
3、测试变量i的取值范围2开始到num-1
#!/bin/bash
read -p "请输入你要判断的正整数:" num
if [ $num -eq 1 ];then
echo "$num不是质数";exit
elif [ $num -eq 2 ];then
echo "$num是质数";exit
fi
for i in `seq 2 $[$num-1]`
do
if [ $[$num%$i] -eq 0 ];then
echo "$num不是质数";exit
fi
done
echo "$num是质数"
课堂练习:
1、批量添加3个用户,以u1-u3命名,并且同一加一个新组class,密码都为123
2、写一个脚本,局域网内,把能ping通的ip和不能ping通的ip分类,并保存到两个不同的文件中。IP范围(10.1.1.1010.1.1.20)
参考1#!/bin/bash
group=class
grep -w $group /etc/group &>/dev/null
[ $? -ne 0 ] && groupadd $group 
for i in 1 2 3
do
useradd -G class u$i
echo 123|passwd --stdin u$i &>/dev/null
done
参考2for ((i=10;i<=20;i++))
do
ping -c 1 10.1.1.$i &>/dev/null
[ $? -eq 0 ] && echo "the IP 10.1.1.$i is ok" >> /tmp/ip_ok.log || echo "the IP 10.1.1.$i is not ok" >> /tmp/ip_notok.log
done
until 循环: 条件为真退出循环;条件为假进入循环
语法:
until expr
do
command...
done
#!/bin/bash
i=1
until [ $i -gt 5 ]
do
echo $i
let i=$i+1
done
#!/bin/bash
i=5
until (( $i <1 ))
do
echo $i
let i=$i-1
done
demo1:批量创建用户stu1~stu3,家目录为/rhome/stuX,密码为123
#!/bin/bash
dir=/rhome
[ ! -d $dir ] && mkdir -p $dir
i=1
until [ $i -gt 3 ]
do
useradd -d $dir/stu$i stu$i
echo 123|passwd --stdin stu$i
let i=$i+1
done
while 循环:条件为假退出循环;条件为真进入循环
语法:
while expr
do
command
done
#!/bin/bash
i=1
while [ $i -le 5 ]
do
echo $i
let i=$i+1
done
#!/bin/bash
i=5
while (( $i >= 1 ))
do
echo $i
let i=$i-1
done
思考:
i=1while打印5 4 3 2 1
demo1:
写一个30s同步一次时间服务器10.1.1.254的脚本,如果同步失败,则邮件报警,每次失败都报警;如果同步成功,也需要邮件通知,但是成功100次才通知一次
思路:
1、该脚本应该是一个死循环在后台执行
2、怎么样去同步时间 (命令)
3、根据命令所执行的结果判断是否成功;
4、如果失败直接发邮件;如果成功,统计成功次数,到100才发邮件
#!/bin/bash
ip=10.1.1.254
count=0
while true
do
ntpdate $ip &>/dev/null
if [ $? -ne 0 ];then
echo ntpdate failed |mail -s "Check system date" root
else
let count++
if [ $count -eq 100 ];then
echo ntpdate successed |mail -s "Check system date" root
count=0
fi
fi
sleep 30
done
#!/bin/bash
ip=10.1.1.254
count=0
while true
do
ntpdate $ip &>/dev/null
[ $? -ne 0 ] && echo ntpdate failed |mail -s "Check system date" root
let count++
[ $[$count%100] -eq 0 ] && echo ntpdate successed |mail -s "Check system date" root
sleep 30
done
以上脚本有问题,自己去完善
#!/bin/bash
ip=10.1.1.254
count=0
while true
do
ntpdate $ip &>/dev/null
if [ $? -ne 0 ];then
echo ntpdate failed |mail -s "Check system date" root
else
let count++
[$[$count%100] -eq 0 ] && echo ntpdate successed |mail -s "Check system date" root
fi
fi
sleep 30
done
总结:
12345
54321
for
for ((i=1;i<=5;i++))
do
echo -n $i
done
for i in 1 2 3 4 5
do
echo -n $i
done
for i in {
1..5}
do
echo -n $i
done
for i in `seq 5`
do
echo -n $i
done
for i
do
echo -n $i
done
./for1.sh 1 2 3 4 5
until
i=1
until [ $i -gt 5 ]
do
echo -n $i
let i++
done
i=5
until (( $i < 1 ))
do
echo -n $i
let i--
done
while
i=1
while [ $i -le 5 ]
do
echo -n $i
let i++
done
echo
i=5
while (( $i -ge 1 ))
do
echo -n $i
let i--
done
echo
随机数:
bash默认有一个RANDOM,它是产生随机数的一个变量,032767
$[$RANDOM%2] 0~1
$[$RANDOM%3] 0~2
$[$RANDOM%6] 0~5
$[$RANDOM%10] 0~9
$[$RANDOM%100]   0~99
$[$RANDOM%51+50] 50~100
$[$RANDOM%900+100] 产生三位随机数
demo1:写一个脚本,产生一个phonenum.txt,保存1000个以139开头电话号码
#!/bin/bash
for i in {
1..1000}
do
n1=$[$RANDOM%10]
n2=$[$RANDOM%10]
n3=$[$RANDOM%10]
n4=$[$RANDOM%10]
n5=$[$RANDOM%10]
n6=$[$RANDOM%10]
n7=$[$RANDOM%10]
n8=$[$RANDOM%10]
echo "139$n1$n2$n3$n4$n5$n6$n7$n8" >> /tmp/phonenum.txt
done
demo2:从1000个电话号码中,抽取出5个幸运观众
#!/bin/bash
file=/tmp/phonenum.txt
for i in `seq 5`
do
line=`cat $file |wc -l`
luckline=$[$RANDOM%$line+1]
luckwho=cat $file|head -n $luckline|tail -1
echo "幸运观众是:${luckwho:0:3}****${luckwho:7:4}"
done
抽法2:如果一次被抽到,那么将该观众从文件中删除
#!/bin/bash
file=/tmp/phonenum.txt
for i in `seq 5`
do
line=`cat $file |wc -l`
luckline=$[$RANDOM%$line+1]
luckwho=cat $file|head -n $luckline|tail -1
sed -i "/$luckwho/d" $file
echo "幸运观众是:${luckwho:0:3}****${luckwho:7:4}"
done
嵌套循环:
1
12
123
1234
12345
#!/bin/bash
for ((y=1;y<=5;y++))
do
for ((x=1;x<=$y;x++))
do
echo -n $x
done
echo
done
y=1
until [ $y -gt 5 ]
do
x=1
until [ $x -lt $y ]
do
echo -n $x
let x++
done
echo
let y++
done
5
54
543
5432
54321
作业:
1、将/etc/passwd里的用户进行分类,分为管理员,系统用户,普通用户保存到不同的文件中
2、写一个倒计时脚本,要求显示里2017530日(端午节)的凌晨0点,还有多少天,多少时,多少分,多少秒
3、写一个脚本把一个目录内的所有空文件都删除,最后输出删除文件的个数
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/163943.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 十进制小数分数与二进制的转换

    十进制小数分数与二进制的转换十进制分数转换为二进制数使用短除法。例如将十进制分数11/28转换为二进制数,过程如下:1、首先将分子分母分别转换成二进制(11)10=(1011)2(28)10=(11100)22、使用短除,借位时是借2,商只能是0或1所以:11/28=1011/11100=0.01100100…十进制小数转换为二进制小数十进制数的整数位是二进制数的整数位,…

  • spdlog linux编译出错,spdlog「建议收藏」

    spdlog linux编译出错,spdlog「建议收藏」#include#include”spdlog/spdlog.h”intmain(int,char*[]){namespacespd=spdlog;try{//consolelogger(multithreadedandwithcolor)autoconsole=spd::stdout_logger_mt(“console”,true);console-&gt…

  • OleDbCommand与OleDbCommandBuilder、OleDbDataAdapter、OleDbDataReader的关系

    OleDbCommand与OleDbCommandBuilder、OleDbDataAdapter、OleDbDataReader的关系OleDbCommand属于DBcommand(还包括odbcCommand\OracleCommand\SqlCommand)类派生,DBcommand的作用是:当建立与数据源的连接后,可以使用DBCommand对象来执行命令并从数据源中返回结果;OleDbCommand就是在建立OleDBConnection之后,可以从数据源中返回数据结果,如sql查询结果,具体见下面说明

  • JAVA实现DAO基本层CRUD操作

    JAVA实现DAO基本层CRUD操作

  • Java面试题大全带答案「建议收藏」

    Java面试题大全带答案「建议收藏」本人发现网上虽然有不少Java相关的面试题,但第一未必全,第二未必有答案,第三虽然有答案,但未必能在面试中说,所以在本文里,会不断收集各种面试题,并站在面试官的立场上,给出我自己的答案。第一部分、Java基础1.JDK和JRE有什么区别?JDK是java的开发工具包,有JDK8,9甚至到14的差别,安装以后,不仅包含了java的开发环境,比如java.exe,还包含了运行环境(jre)相关包。 JRE是java运行环境,一般装好JDK后,系统里会有对应的JRE环境。2..

  • [转载]interp1「建议收藏」

    [转载]interp1「建议收藏」MATLAB中的插值函数为interp1,其调用格式为:yi=interp1(x,y,xi,’method’)其中x,y为插值点,yi为在被插值点xi处的插值结果;x,y为向量,’method’表示采用的插值方法,MATLAB提供的插值方法有几种:’method’是最邻近插值,’linear’线性插值;’spline’三次样条插值;’cub…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号