shell脚本进阶之循环判断

Posted 珂儿吖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本进阶之循环判断相关的知识,希望对你有一定的参考价值。

 

前言···· 2

一、条件选择、判断(ifcase···· 2

1.1 if语句用法及实例···· 2

1.2 case用法及实例···· 5

二、循环语句···· 7

2.1 for循环···· 8

2.2 while循环···· 10

2.3 until循环···· 12

2.4 select循环···· 13

2.5 循环小补充···· 14

2.5.1 循环控制语句 continue&break· 14

2.5.2 循环控制命令shift15

2.5.3 信号捕捉trap·· 16

2.5.4 创建无限循环···· 18

2.5.5 在循环语句中执行并行命令···· 18

三、小补充···· 20

1)打印等腰三角形(带闪烁···· 20

2)打印国际象棋棋盘···· 21

 

 

 

 

前言

在我们使用linux的过程中,脚本可以给我们省很多时间和精力,比如,我们要定期备份一些文件,如果我们纯手工去操作的话,每到一个时间段我们就要去进行备份的操作,如果某一次我们在干其他事情的时候,把这件事情忘了那可怎么办╮(╯这个时候,我们就可以把需要执行的备份命令放在一个脚本里面,通过一些语句去判断是否符合我们执行命令的条件,实现自动化0.0这样不就省时省心很多啦~老板再也不用担心我忘记备份ヽ()那么,接下来,小编就来分享一下脚本的语法及实例。

一、条件选择、判断(ifcase

1.1 if语句用法及实例

当我们在脚本中遇到需要判断的时候,我们就可以用if语句来实现。具体的语法如下:

  •    单分支

    if 判断条件;then

    条件为真的分支代码
  fi

  •    双分支

if 判断条件; then

条件为真的分支代码

else

条件为假的分支代码

fi

  •    多分支

if 判断条件1; then

条件为真的分支代码
elif
判断条件2; then

条件为真的分支代码
elif
判断条件3; then

条件为真的分支代码

else

以上条件都为假的分支代码
fi

在多分支中,系统会逐条判断你写入的条件,第一次遇到条件时,执行该分支,而后结束整个if语句。

注意:1iffi是成对出现的

2if语句可以嵌套。

Example:

1)判断两个数字的大小

 1 #!/bin/bash
 2 #定义变量
 3 read -p "Please input the first num:" num1
 4 read -p "Please input the second num:" num2
 5 #判断数字是否符合标准
 6 if [[ $num1 =~ ^[0-9]+$ && $num2 =~ ^[0-9]+$ ]];then
 7 #    判断两个数字的大小并输出判断结果
 8     if [ $num1 -lt $num2 ];then
 9         echo "The num2 is biger than the num1"
10     elif [ $num1 -eq $num2 ];then
11         echo "Two numbers equal"
12     else 
13         echo "The num1 is biger than the num2"
14     fi
15 else
16     echo "Please enter the correct number"
17 fi
18 
19 #删除变量
20 unset num1 num2

 

 

2编写脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息

 1 #!/bin/bash
 2 #定义变量
 3 read -p "请输入一个用户名:" name
 4 #判断用户名是否存在
 5 if  `id $name &> /dev/null`;then
 6 #    若存在,则输出ID等信息
 7 echo "用户存在,用户的ID信息为:`id $name`"
 8 else
 9 #    若不存在,则添加用户,设置密码为随机8位,下次登录时提示修改密码,同时显示ID等信息
10 passwd=`cat /dev/urandom |tr -cd [:alpha:] |head -c8`
11 `useradd $name &> /dev/null`
12 `echo "$passwd" | passwd --stdin $name &> /dev/null`
13 echo "用户名:$name 密码: $passwd" >> user.txt
14 `chage -d 0 $name`
15 echo "用户已添加,用户的ID信息为:`id $name` 密码为:$passwd"
16 fi
17 
18 #删除变量
19 unset name passwd

 

 

1.2 case用法及实例

当涉及到多个条件匹配的时候,我们用if可能就很麻烦了,这个时候,我们就可以用case来编写这个脚本。case的具体语法如下:

case 变量引用 in

PAT1)

分支1

;;

PAT2)

分支2

;;

...

*)

默认分支

;;

esac

注意:1case每一个分支后,都是以两个“;”结尾的(最后一个可以省略)

      2caseesac是成对出现的

Example

1)编写一个脚本,提示用户输入信息,判断其输入的是yesno或其他信息。

 1 #!/bin/bash
 2 #定义变量
 3 read -p "Yue ma?(yes or no):" ANS 
 4 #把变量中的大写转换为小写
 5 ans=`echo "$ANS" |tr [[:upper:]] [[:lower:]] `
 6 #判断输入的信息是什么并输出结果
 7 case $ans in
 8 yes|y)
 9     echo "see you tonight"
10     ;;  
11 no|n)
12     echo "sorry,I have no time"
13     ;;  
14 *)
15     echo "what’s your means?"
16     ;;  
17 esac
18 
19 #删除变量
20 unset ANS ans

 

 

2)编写脚本/root/bin/filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)

 1 #!/bin/bash
 2 read -p "请输入一个文件路径:" file
 3 #判断文件是否存在
 4 `ls $file &> /dev/null`
 5 #若存在,判断文件类型并输出
 6 if [ $? -eq 0 ];then
 7     style=`ls -ld $file | head -c1`
 8     case $style in
 9     -)  
10         echo "这是一个普通文件"
11         ;;  
12     d)  
13         echo "这是一个目录文件"
14         ;;  
15     l)  
16         echo "这是一个链接文件"
17         ;;
18     *)
19         echo "这是其他类型文件"
20         ;;
21     esac
22 #若不存在,提示并退出
23 else
24     echo "该文件不存在"
25     exit 2
26 fi
27 
28 #删除变量
29 unset file style

 

 

二、循环语句

    在我们的脚本中,肯定也少不了对某一段代码重复运行多次的操作,此时,我们就会用到循环语句。循环语句中,都是有进入条件退出条件的,循环的次数也分为事先已知事先未知(事先已知就是我们知道循环的具体次数,事先未知则是指当满足某一条件就进行循环,但是次数是不确定的。)。接下来,我们就来看看关于循环语句的用法。

2.1 for循环

for循环的执行机制是:一次将列表中的元素赋值给

以上是关于shell脚本进阶之循环判断的主要内容,如果未能解决你的问题,请参考以下文章

SHELL脚本编程进阶

shell脚本进阶篇(上)

SHELL脚本进阶

shell——记录个人脚本的一个进阶

SHELL脚本进阶

shell 编程进阶与自动化脚本expect的运用