我是靠谱客的博主 踏实橘子,最近开发中收集的这篇文章主要介绍shell中的判断与循环shell中的判断与循环,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

shell中的判断与循环

1.if语句

  • shell中的if语句结构如下,它通过判断command1的返回值,若0(即命令成功执行)则执行command2、command3;若1则不执行
复制代码
1
2
3
4
5
6
7
8
9
10
11
if commandA then command1 command2 fi #另一种风格的写法 if commandA ; then command1 command2 fi
  • 当然shell中也有else,还有elseif,用法分别如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
if commandA ; then command1 else command2 fi if commandA ; then command1 elif commanB ; then command2 elif commandC ; then command3 fi
  • 当需要多次判断时,也可用switch case来替代if else
复制代码
1
2
3
4
5
6
7
8
9
10
11
case $USR in root) echo root echo oh!;; jack) echo jack;; peter | ben) #满足jack或ben echo hah! hah!;; *) #星号代表默认情况 echo error;; esac

2.test语句

  • test命令是if语句的好伴侣,常用来判断条件是否满足,满足返回0,不满足返回1;test可以用来比较:数值、字符串、文件/路径。常见用法为:
复制代码
1
2
3
4
5
6
7
8
if test condition ; then commands fi #bash支持的另一种格式,本质也是调用了test,千万要注意在condition和方括号之间加空格 if [ condition ] ; then commands fi
  • 当test用于数值比较时,基本格式为var1 参数 var2,如下,具体参数有很多,可以上网查
复制代码
1
2
if [ $var1 -eq $var2 ] #判断var1和var2变量值是否相等 if [ $var1 -gt 2 ] #判断var1的变量值是否大于2
  • 当test用于字符串比较时,基本格式也为var1 符号 var2,此外还可以使用[[ ]]来使用正则匹配
复制代码
1
2
3
if [ $string1 = $string2 ] #判断变量string1和string2值是否相等 if [ $USR = !root ] #判断变量USR值是否不等于root if [[ $USR == r* ]] #判断变量USR值是否以字母r开头
  • 当test用于判断文件和目录的状态时,基本格式为参数 filepath如下,具体参数有很多,可以上网查
复制代码
1
2
3
4
if [ -d $MYPATH ] #判断位于$MYPATH的文件是否存在,并且是个目录 if [ -e $MYPATH ] #判断位于$MYPATH的文件是否存在 if [ -r $MYPATH ] #判断位于$MYPATH的文件是否可读 if [ -x $MYPATH ] #判断位于$MYPATH的文件是否可执行
  • test 还可以判断一个变量是否有值
复制代码
1
2
if [ -z "$USR" ] #判断变量USR长度是否为零 if [ -n "$USR" ] #判断变量USR长度是否非零
  • 对于复合判断语句,shell中使用&&||来表示,尤其需要注意的是,shell中以命令返回0为真,1位假,故&&||操作以逻辑真假为准,不再以数值上的0和1为准
复制代码
1
2
if [ condition1 ] && [ condition2 ] if [ condition1 ] || [ condition2 ]
  • 此外&&还能用来作为简易版本的if语句,左边的命令返回真(即返回0),右边的命令才被执行
复制代码
1
[ $? -ne 0 ] && mk_error "build rootfs Failed" && return 1

3.for语句

  • shell中for语句的基本用法是,每次循环,变量就套用列表中的元素值,循环至列表结束为止
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#for语句假定列表元素之间以空格分割,若元素内部包含空格,则用双引号包围即可 for var in shanghai beijing "new york" guangzhou ; do command done #for语句也可以将变量的内容作为列表值 list='shanghai beijing guangzhou' for var in $list ; do ... #列表值的来源也可以是指令的输出,for将以空格来分割指令的输出,当输出结束时循环也结束 for var in `cat $file` ; do #此处从一个文件中读取内容,以此作为列表值 ... #然而更多的时候是以数组变量作为列表值 platforms=( "android" "linux" ) for platform in ${platforms[@]} ; do ... #最常见的用法,下面的for语句会让i从0自动增加至1000,不需要手动i++ for i in `seq 1000` ; do command done
  • 现在来系统的讨论一下,for语句会将哪些字符作为列表元素的分割符?默认为空格、换行、制表符。我们可以通过变量IFS来指定分隔符,这是极为便利的一种机制
复制代码
1
2
3
4
5
OLDIFS=$IFS #先备份原本的IFS值 IFS=$'n:;' #指定分隔符为换行符、冒号、分号 #这里可以进行各种操作了 IFS=$OLDIFS #还原IFS值
  • for语句还有一种强大的用法,即用通配符获取文件/目录
复制代码
1
2
3
4
5
#这里将会遍历所有满足条件的目录,并将其作为列表值,每次循环赋给变量file for file in /home/root/.b* /home/root/test do if [ -d $file ] .....

4.while语句

  • while语句的基本用法是判断commandA的返回值,若真(0)则循环,若假(1)则跳出
复制代码
1
2
3
4
5
6
7
8
9
10
while commandA ; do commands done #最常见的用法是和test语句组合使用 while [ $var1 -gt 0 ] ; do #当然组合命令也是必不可少的 while [ condition1 ] && [ condition2 ] ; do while [ condition1 ] || [ condition2 ] ; do
  • until语句具有与while语句相反的功能,若假(1)则循环,若真(0)则跳出。它们用法的格式完全相同

5.循环控制语句

  • break语句可以打断并跳出循环,默认往外跳出一层,当然我们也能指定往外跳出多少层,如:
复制代码
1
2
3
4
5
6
7
8
9
for i in `seq 1000` ; do for j in `seq 1000` ; do .... if [ .... ];then #若条件满足,则跳出2层循环 echo "error" break 2 #若直接使用break,就跳出1层循环 fi done done
  • continue语句可以跳过循环体剩余的部分,默认重新进入一次循环,当然我们也能指定重新进入往外哪一层循环,如:
复制代码
1
2
3
4
5
6
7
8
9
for i in `seq 1000` ; do for j in `seq 1000` ; do .... if [ .... ];then #若条件满足,则重新进入最外层循环 echo "error" continue 2 #直接使用continue,就重新进入当前层循环 fi done done

最后

以上就是踏实橘子为你收集整理的shell中的判断与循环shell中的判断与循环的全部内容,希望文章能够帮你解决shell中的判断与循环shell中的判断与循环所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部