shell基础及流程控制语句之一while循环
前面写过if条件判断,一般在写shell脚本时可能会用到死循环这时就需要while语句了,它是做死循环最好的方法,在讲while循环之前需要讲文件测试,因为在写脚本时经常会用到。
文件测试:
-e $file:判断是否存在如果存在则为真,不存在则为假
-f $file:判断是否存在并且为普通文件,存在为真,不存在为假
-d $file:判断是否存在并且为目录,存在为真不存在为假
-h $file:判断是否存在并且为符号链接文件(软连接),存在为真,不存在为假
-L $file:与-h一样不做解释
-b $file:判断是否存在并且为块设备文件,存在为真,不存在为假
-c $file:判断是否存在并且为字符设备文件,存在为真,不存在为假
-s $file:判断是否存在并且为套接字文件,存在为真,不存在为假
-p $file:判断是否存在并且为管道文件,存在为真,不存在为假
-r $file:判断当前用户是否对此文件有读取的权限
-w $file:判断当前用户是否对此文件有写权限
-x $file:判断当前用户是否对此文件有执行的权限
-u $file:判断文件是否拥有suid的权限
-g $file:判断文件是否拥有sgid的权限
-k $file:文件是否拥有sticky权限
-O $file:当前用户是否为文件的属主
-G $file:当前用户是否为文件的属组
-N $file:文件自从上一次被读取之后是否被修改过
感觉好多啊。。我现在写脚本还没有全部用过,我全部都做笔记了,因为感觉以后会用到并且如果忘记了不用翻墙上google。
接下来就说一下while循环吧,先将普通循环与for类似。
固定格式为:
while 循环条件;do
循环内容
修正循环变量的表达式
done
之所以会有这个修正循环变量的表达式,是因为在while循环里面如果没有在一次循环结束后重新赋值给这个变量那么这个循环将变成死循环不会退出。必须要将循环条件变为假才可以结束循环。来看个例子吧
我将变量a定义为数值型并且初始值为0,下面的while循环条件是如果$a的值小于100则输出hello我并没有给修正表达式来修正$a的值,所以程序会一直输出hello不会停止。如果要停止则可以按下ctrl+c即可停止脚本
我们来修改一下脚本增加一个修正表达式。我增加了一个 let a++让程序循环一次那么$a的值就加1直到$a的值大于100程序就结束了。
再来看下程序的执行结果吧,正好100行内容因为是0-99,第100次的时候$a的值就不在小于100了就和100相等所以程序结束,所以说这个修正表达式必不可少否则就会陷入死循环,如果想做死循环下面还会讲到一个更简单的办法。
对了,上面列出来的文件测试都是在条件判断里面写的就像[ -f /etc/passwd ] 这样就是判断/etc/passwd是否存在并且为普通文件才往下继续执行。
死循环很简单它的格式为:
while true;do
循环内容
done
如果还用上面的示例的话写出来的内容则为:
while true;do
echo "hello"
done
一般死循环用于与用户交互例如用户输入一个错误的内容程序则一直提示他请输入内容这就用到了死循环。死循环也可以退出,当然是在特定条件下比如用户输入正确的内容后就可以执行下面的内容或者退出脚本。
循环控制命令:break、continue、exit
break:提前退出循环
continue:退出当前循环,直接进入下一次循环
exit:脚本碰到eixt时不管接下来要做什么直接退出脚本
用实例来讲解吧:
0x01:判断某用户是否登陆,如果登陆了则输出用户登陆并且退出脚本,如果没有登陆则进行循环。
$!/bin/bash
while true;do
if who | grep "test" &> /dev/null ;then
echo "user test is logging"
break
fi
done
在这里test用户如果不登陆则程序一直不退出直到test用户登陆后程序返回user test is logging然后退出。
0x02:判断/tmp/root.txt文件是否存在,如果存在则输出"file is found",否则则进行循环直到文件存在
while true;do
if [ -f /tmp/root.txt ];then
echo "file is found"
break
fi
done
与0x01类似主要就是看一下文件测试选项如何使用。这篇就写到这里了,可能内容有点少毕竟这些东西不只是看看就会了,还是希望能多操作
下一篇会讲到case语句一个精简的if语句,使用时经常是case语句中嵌套if语句来使用,当然这些循环控制语句都可以互相嵌套随意调用的(在不出错的情况下)。
本文出自 “Yxn” 博客,请务必保留此出处http://jyxnt.blog.51cto.com/9581167/1587137
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。