Shell脚本的条件控制和循环语句_linux shell

条件判断:if语句

语法格式:

if [ expression ]
then
Statement(s) to be executed if expression is true
fi

注意:expression 和方括号([ ])之间必须有空格,否则会有语法错误。

if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。Shell 有三种 if ... else 语句:

if ... fi 语句
if ... else ... fi 语句
if ... elif ... else ... fi 语句

示例:

#!/bin/bash/
a=10
b=20
if [ $a == $b ]
then
echo "a is equal to b"
elif [ $a -gt $b ]
then
echo "a is greater to b"
else
echo "a is less to b"
fi

if ... else 语句也可以写成一行,以命令的方式来运行:

a=10;b=20;if [ $a == $b ];then echo "a is equal to b";else echo "a is not equal to b";fi;

if ... else 语句也经常与 test 命令结合使用,作用与上面一样:

#!/bin/bash/
a=10
b=20
if test $a == $b
then
echo "a is equal to b"
else
echo "a is not equal to b"
fi

分支控制:case语句

case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构。

示例:

#!/bin/bash/
grade="B"
case $grade in
"A") echo "Very Good!";;
"B") echo "Good!";;
"C") echo "Come On!";;
*)
echo "You Must Try!"
echo "Sorry!";;
esac

转换成C语言是:

#include <stdio.h>
int main(){
char grade = 'B';
switch(grade){
case 'A': printf("Very Good!");break;
case 'B': printf("Very Good!");break;
case 'C': printf("Very Good!");break;
default:
printf("You Must Try!");
printf("Sorry!");
break;
}
return 0;
}

对比看就很容易理解了。很相似,只是格式不一样。

需要注意的是:

取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。

取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

再举一个例子:

#!/bin/bash
option="${1}"
case ${option} in
"-f") FILE="${2}"
echo "File name is $FILE"
;;
"-d") DIR="${2}"
echo "Dir name is $DIR"
;;
*)
echo "`basename ${0}`:usage: [-f file] | [-d directory]"
exit 1 # Command to come out of the program with status 1
;;
esac

运行结果:

$./test.sh
test.sh: usage: [ -f filename ] | [ -d directory ]
./test.sh -f index.html
File name is index.html

这里用到了特殊变量${1},指的是获取命令行的第一个参数。

for循环

shell的for循环与c、php等语言不同,同Python很类似。下面是语法格式:

for 变量 in 列表

do
command1
command2
...
commandN
done

示例:

#!/bin/bash/
for value in 1 2 3 4 5
do
echo "The value is $value"
done

输出:

The value is 1
The value is 2
The value is 3
The value is 4
The value is 5

顺序输出字符串中的字符:

for str in 'This is a string'
do
echo $str
done

运行结果:

This is a string

遍历目录下的文件:

#!/bin/bash
for FILE in *
do
echo $FILE
done

上面的代码将遍历当前目录下所有的文件。在Linux下,可以改为其他目录试试。

遍历文件内容:

city.txt

beijing
tianjin
shanghai
#!/bin/bash
citys=`cat city.txt`
for city in $citys
echo $city
done

输出:

beijing
tianjin
shanghai

while循环

只要while后面的条件满足,就一直执行do里面的代码块。

其格式为:

while command
do
Statement(s) to be executed if command is true
done

命令执行完毕,控制返回循环顶部,从头开始直至测试条件为假。

示例:

#!/bin/bash
c=0;
while [ $c -lt 3 ]
do
echo "Value c is $c"
c=`expr $c + 1`
done

输出:

Value c is 0
Value c is 1
Value c is 2

这里由于shell本身不支持算数运算,所以使用expr命令进行自增。

until循环

until 循环执行一系列命令直至条件为 true 时停止。until 循环与 while 循环在处理方式上刚好相反。一般while循环优于until循环,但在某些时候,也只是极少数情况下,until 循环更加有用。

将上面while循环的例子改改,就能达到一样的效果:

#!/bin/bash
c=0;
until [ $c -eq 3 ]
do
echo "Value c is $c"
c=`expr $c + 1`
done

首先do里面的语句块一直在运行,直到满足了until的条件就停止。

输出:

Value c is 0
Value c is 1
Value c is 2

跳出循环

在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,像大多数编程语言一样,Shell也使用 break 和 continue 来跳出循环。

break

break命令允许跳出所有循环(终止执行后面的所有循环)。

#!/bin/bash
i=0
while [ $i -lt 5 ]
do
i=`expr $i + 1`
if [ $i == 3 ]
then
break
fi
echo -e $i
done

运行结果:

1
2

在嵌套循环中,break 命令后面还可以跟一个整数,表示跳出第几层循环。例如:

break n

表示跳出第 n 层循环。

continue

continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。

#!/bin/bash
i=0
while [ $i -lt 5 ]
do
i=`expr $i + 1`
if [ $i == 3 ]
then
continue
fi
echo -e $i
done

运行结果:

1
2
4
5

以上内容是小编给大家介绍的Shell脚本的条件控制和循环语句的相关知识,希望对大家有所帮助!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索shell脚本条件控制
shell循环语句
shell脚本循环语句、shell脚本中循环语句、shell脚本死循环语句、linux shell脚本 循环、shell脚本if语句,以便于您获取更多的相关知识。

时间: 2024-10-03 11:43:09

Shell脚本的条件控制和循环语句_linux shell的相关文章

shell脚本编程之循环语句_linux shell

在运行脚本时重复执行一系列的命令是很常见的,这时我们就需要使用循环语句来达到这个目的. 一.for命令 格式:for 变量 in 列表:do 循环体 done for命令会遍历列表中的每一个值,并且在遍历完成后退出循环. 列表形式有以下几种: 1.在命令中定义的一系列的值: 2.变量: 3.命令: 4.目录: 5.文件. 实例1: 上例中使用{初始值..结束值}格式来表示一个区间的数值. 实例2:以变量作为列表: 实例3:用命令生成列表: 上例中使用seq命令来生成列表,seq命令的格式为:se

关于Shell脚本效率优化的一些个人想法_linux shell

一.先说一下Shell脚本语言自身的局限性 作为解释型的脚本语言,天生就有效率上边的缺陷.尽管它调用的其他命令可能效率上是不错的. Shell脚本程序的执行是顺序执行,而非并行执行的.这很大程度上浪费了可能能利用上的系统资源. Shell每执行一个命令就创建一个新的进程,如果脚本编写者没有这方面意识,编写脚本不当的话,是非常浪费系统资源的. 二.我们在Shell脚本语言的局限性上尽可能的通过我们有经验的编码来提高脚本的效率. 1.比如我想做一个循环处理数据,可能是简单的处理一下数据,这样会让人比

linux shell脚本学习xargs命令使用详解_linux shell

xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理.通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从文件的输出中读取数据.xargs的默认命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代. xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令,下面是一些如何有效使用xargs 的实用例子. 1.

Shell脚本实现监视指定进程的运行状态_linux shell

在之前的博客中,曾经写了自动化测试程序的实现方法,现在开发者需要知道被测试的进程(在此指运行在LINUX上的主进程的)在异常退出之前的进程的运行状态,例如内存的使用率.CPU的使用率等. 现用shell脚本实现指定进程的运行状态.直接上代码. #!/bin/sh echo "`date`" echo "Start $0---------" echo "" #每十秒监视一下 sec=10 #取得指定进程名为mainAPP,内存的使用率,进程运行状态

shell脚本中取消重定向的方法实例_linux shell

在上一篇关于shell编程的例子中,有讲到把shell脚本进行扩展之后重定向到一个文件中,以便进行查看和调试http://www.jb51.net/article/62435.htm.但是,若是有另一种情况:只是在某些地方进行重定向,而其他地方不进行重定向.那么我们就来修改一下上一篇中的例子来进行这种需求的满足: 复制代码 代码如下: #!/bin/bash function setlogfile {     if ! [ -z "$1" ]; then         echo &q

Shell脚本中获取进程ID的方法_linux shell

提问: 我想要知道运行中脚本子shell的进程id.我该如何在shell脚本中得到PID. 当我在执行shell脚本时,它会启动一个叫子shell的进程.作为主shell的子进程,子shell将shell脚本中的命令作为批处理运行(因此称为"批处理进程"). 在某些情况下,你也许想要知道运行中的子shell的PID.这个PID信息可以在不同的情况下使用.比如,你可以使用shell脚本的PID在/tmp下创建一个唯一的临时文件.有时侯脚本需要检测所有运行的进程,它可以从进程列表中排除自身

Shell脚本实现获取网页快照并生成缩略图_linux shell

获取网页快照并生成缩略图可分两步进行: 1.获取网页快照 2.生成缩略图 获取网页快照 这里我们用 phantomjs 来实现.关于 phantomjs 的详细用法可参考官方网站.http://phantomjs.org/ 1.安装 我的环境是CentOS6.5,安装时直接下载 tarball 然后解压即可. 复制代码 代码如下: # wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-i686.t

Shell脚本实现递归删除空文件夹_linux shell

有时我们需要递归删除空文件夹,网上找了一下,没有发现比较好的Shell脚本,于是自己动手写了一个 脚本 复制代码 代码如下: #!/bin/bash # author: 十年后的卢哥哥 # des: delete empty directories recursive deleteempty() {   find ${1:-.} -mindepth 1 -maxdepth 1 -type d | while read -r dir   do     if [[ -z "$(find "

Shell脚本实现的猜数字小游戏_linux shell

生成的密码和用户输入可以接受重复数字. 所以相对一般规则的猜数字可能难度要大不少. 本版本规则: A--数字对,位置也对 B--排除A的结果后,数字对,但位置不对 开始后,系统化初始化一个4位可重复数字,如"1223".假设用户第一次输入"1234",那么系统将提示"2A1B",前两位数字"12"相同并且位置也相同,为"2A".后两位数字中,用户输入的"3"与密文中"3&quo