便捷工具

Shell脚本——条件判断和循环

2022-06-29  本文已影响0人  moutory

前言

条件判断和循环是shell脚本的基础,也决定了脚本运行流程,是写shell脚本十分重要的知识准备。本篇文章将对这两大块知识点进行讲解和整理,希望对各位读者有所帮助。

一、条件判断

(一)if关键字

语法如下:

if [ 条件判断式1 ]
    then
        当条件判断式1成立时,执行程序1
    elif [ 条件判断式2 ]
        then
            当条件判断式2成立时,执行程序2
    else
    当所有条件都不成立时,最后执行此程序
fi

同样的,我们用if来做一个小案例,判断a.txt文件是否存在于当前目录,并将结果打印出来

file=/tmp/test_sh/a.txt

if [ -e $file ];then
        echo "a.txt is exist"
else
        echo "a.txt is no exit"
fi

输出结果:

a.txt is exist
(二)case关键字

case语句和if…elif…else语句一样都是多分支条件语句,不过和if多分支条件语句。不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。

语法如下:

case $变量名 in
    "值1")
        程序
    ;;
     "值2")
        程序
    ;;
     ...
    *)
        #如果变量的值都不是以上的值,则执行此程序
         程序
    ;;
esac

我们可以看一下下面这个例子:如果变量a的值为2,则输出结果

a=2
case $a in
 "1")
 echo "the value is 1"
 ;;
 "2")
 echo "the value is 2"
 ;;
 *)
 echo "the value is no in beheind"
esac

输出结果:

the value is 2

二、循环

shell语言的流程控制和大多数编程语言一致,主要依赖逻辑判断(if、case)和循环迭代(for、while、until)。下面就来介绍有关循环迭代的各个关键词语法的使用。

(一)for循环
语法一:for in
for 变量 in 值1 值2 值3…
    do
        程序
    done

我们以下面的脚本作为例子:

for time in morning afrernoon evening
 do
   echo "good $time , sir~"
 done

输出结果如下:

good morning , sir~
good afrernoon , sir~
good evening , sir~
for in的使用细节

我们可以看到,三个字符串都可以被顺利的遍历出来。但是有时候我们并不能实现知道要遍历的对象具体是什么,无法提前把字符串写到for in中,那么此时可以怎么处理呢?这个问题自然也可以用for in来解决,for in可以自动对Linux命令得到的列数据进行识别和迭代,比如下面的这个案例:

我们想要知道当前系统中所有运行java应用的pid是什么

for pid in $(ps -ef | grep java | awk '{print $2}')
 do
  echo "the pid of java application is $pid"
 done

输出结果如下,我们可以看到所有的java应用pid都打印出来了

the pid of java application is 1150
the pid of java application is 19597
the pid of java application is 20725
the pid of java application is 22763
the pid of java application is 23071
the pid of java application is 23390
the pid of java application is 24469
the pid of java application is 36322
语法二:for(( ))
for (( 初始值;循环控制条件;变量变化 ))
    do
     程序
    done    

我们也举一个例子来进行演示:打印从10一直累加到20的总和是多少?

sum=0
for((i=10;i<=15;i++))
  do
    echo "sum=$sum i=$i"
    sum=$(( $sum + $i ))
  done
echo "sum = $sum"

输出的结果如下:

sum=0 i=10
sum=10 i=11
sum=21 i=12
sum=33 i=13
sum=46 i=14
sum=60 i=15
sum = 75
语法三:for in + ${} (数组循环)

这种语法一般用于循环的对象类型是数组,for in${}结合使用

for in ${!arr[@]}
    do
        程序
    done

PS:${!数组[@]} 或者 ${!数组[*]} 可以取到数组的所有下标信息

具体的用法我们看下面的例子:

arr=(morning afrernoon evening)
for i in ${!arr[@]}
  do
    echo "good ${arr[i]}"
  done

输出结果如下:

good morning
good afrernoon
good evening
(二)while循环

当我们明确知道迭代对象为的个数或者其具体元素时,for循环一般是我们首选方案。但是有时候我们想要通过某种条件来启动和结束循环,这个使用while来进行循环会更加符合我们的需要。

while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。

while [ 条件判断式 ]
    do
        程序
    done

用while来举一个例子,我们希望得到10累加到15的结果:

a=10
sum=10
while [ $a -lt 15 ]
  do
    a=$(($a+1 ))
    sum=$(($sum + $a))
    echo "a= $a ,sum = $sum"
  done

输出的结果如下:

a= 11 ,sum = 21
a= 12 ,sum = 33
a= 13 ,sum = 46
a= 14 ,sum = 60
a= 15 ,sum = 75
(三)until循环

until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序。一旦循环条件成立,则终止循环。

until [ 条件判断式 ]
    do
      程序
    done

我们用until来得到10累加到15的结果:

a=10
sum=10
until [ $a -ge 15 ]
  do
    a=$(($a+1));
    sum=$(($a + $sum))
    echo "a = $a , sum = $sum"
  done

输出的结果如下:

a = 11 , sum = 21
a = 12 , sum = 33
a = 13 , sum = 46
a = 14 , sum = 60
a = 15 , sum = 75
上一篇下一篇

猜你喜欢

热点阅读