`
DiaoCow
  • 浏览: 244886 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Shell脚本基本流程控制语句总结

 
阅读更多
通常我们将一些命令写在一个文件中就算是一个shell脚本了,但是如果需要执行更复杂的逻辑判断,我们就需要流程控制语句来支持。现在我就总结一下shell流程控制语句语法以及常用形式(我一直觉得没有必要什么都学,而是用自己擅长的方式去解决所有遇到的问题)

1.if条件
if 条件; then
	#statements1
else
	#statements2
fi

这里的条件通常是一个命令,当命令的退出状态码返回0,表示条件为真,这时候执行statements1,否则执行statements2

我们看一个例子(判断字符串中是否包含指定字符):

str="hello world";

if echo "$str" | grep -q "ll" ; then   #grep 中的-q参数表示silent模式--禁止输出
	echo "$str contains ll"
else
	echo "$str doesn't contain ll"
fi

我们看下执行结果:


[ ]命令通常是if语句中最常用的命令(条件测试命令),我们使用它可以做一些文件,字符串或者是数值的判断,下面我们看一个例子:

if [ -e "/etc/passwd" ]; then
	size=`ls -l -h /etc/passwd | awk '{print $5}'`
	echo "/etc/passwd file is exised, and it's size is $size"
fi

str1="nanjing"
str2="beijing"

if [ "$str1" = "$str2" ]; then
	echo "$str1 equals to $str2"
else
	echo "$str1 doesn't equals to $str2"
fi

num1=100
num2=105

if [ "$num1" -gt "$num2" ]; then
	echo "$num1 is greater than $num2"
else
	echo "$num1 is not greater than $num2"
fi

执行结果如图:


关于[ ]命令(实际上就是test命令的另一种形式)更多参数说明,可以参看我之前写的一篇文章:http://diaocow.iteye.com/blog/1629868

另外还有一点需要补充的是:
1. test, [ ], /usr/bin/test, 和 /usr/bin/[ 都是等价命令;

2. 其中test 和 [ ] 是bash的内建命令,而/usr/bin/test 和 /usr/bin/[ 是一个外部命令;

3. 在Bash脚本中, test命令不会调用外部的/usr/bin/test命令, 它调用的是sh-utils工具包中内建test命令. 同样的, [ 也并不会调用 /usr/bin/[


2.for循环
通常for循环有3种常用的形式:
for i in 列表; do   #两边没有括号,请记住
	#statements
done

在循环的每次执行中, i将顺序的访问列表中列出的变量,我们看一个例子

city="nanjing shanghai hangzhou beijing"

for city in $city; do
	echo $city
done

执行结果如图:


日常生活中,我们通常会有遍历某个目录下所有文件的需求,我们可以这样做
for file in `ls`; do
	echo $file
done

或者

for file in *; do
	echo $file
done

运行结果如图:


如果我们只是希望简单的控制循环次数,我们可以使用下面这种形式

for i in $(seq 5); do   #个人更喜欢这种形式,$(...)是bash的变量替换
	echo $i
done

如果你是一个C程序员,我想下面的形式,你会更加喜欢:

for (( i = 0; i < 10; i++ )); do
	#statements
done

使用这种格式的for循环,在(( ))中引用的shell变量不需要使用$,eg:

LIMIT=10
for (( i = 0; i < LIMIT; i++ )); do
	echo $i
done

注意,我在ubuntu12.04运行这个脚本的时候,出现了Bad for loop variable错误,解决方法也很简单:http://blog.sina.com.cn/s/blog_985bedb401015vrl.html


3.while循环
while 条件; do
	#statements
done

同if条件语句一样,这里的条件通常是一个命令,当命令的退出状态码返回0,表示条件为真,这时候执行statements,直到条件为假(命令返回非0)

while循环我用的比较少,通常是用来循环读取一个一个文件

cat $file | while read line ; do
	echo $line
done



4.[[ ]] 与 (( ))

[[ ]] 是一个扩展命令(bash内建命令),它基本上与[ ]用法一致,并且更强大也更符合程序员的使用习惯;

a.当我们使用[ ]来测试两个并列条件,我们有两种做法:[ 条件1 -a 条件2 ]  或者 [ 条件1 ] && [ 条件2 ] 但使用[[]]我们可以这样做:[[ 条件1 && 条件2 ]] 

b.[[ ]] 支持更多的操作符(不许要额外的转义并且语法上更符合一般的程序设计语言),譬如比较数字[ ]中使用的是类似-eq, -gt等操作符,而[[ ]]直接支持>, <等操作符更详细的文档说明:http://www.tsnc.edu.cn/default/tsnc_wgrj/doc/abs-3.9.1_cn/html/comparison-ops.html


(( ))是 一个算术运算命令(不是一个真的命令,感觉像是一个bash关键字),有了它, 我们基本可以废弃expr命令的使用,并且大大提高了脚本的执行效率,我们具体看几个例子(它的语法和C语言很像):
a=$(( 100 + 1 ))
echo $a
a=$(( a++ ))
echo $a
a=$(( 100 / 3 ))
echo $a
a=$(( 100 * 2 ))
echo $a

我们看下执行结果:

似乎有一个不成文的约定,字符串比较使用[[ ]] ,数值比较使用(( ))

5.学习资料
高级Bash脚本编程指南(这几天我突然发现原先的在线版连接已经不可用了,现附上另一个:http://leedd.com/html/abs-3.9.1/)
http://www.tsnc.edu.cn/default/tsnc_wgrj/doc/abs-3.9.1_cn/html/tests.html
http://www.tsnc.edu.cn/default/tsnc_wgrj/doc/abs-3.9.1_cn/html/loops.html

由于文档中的代码都携带行号,所以复制完后又要一个个删除,很是麻烦,于是我写了个命令,这样就简单多了:

sed -i 's/ *[0-9][0-9]* //' test.sh
  • 大小: 9.6 KB
  • 大小: 19.3 KB
  • 大小: 14.3 KB
  • 大小: 11.6 KB
  • 大小: 14.7 KB
  • 大小: 9.1 KB
  • 大小: 36.6 KB
分享到:
评论

相关推荐

    shell脚本入门-流程控制-Shell脚本中常用流程控制机制及其应用介绍

    本文介绍了Shell脚本中几种常用的流程控制结构,包括if语句、case语句、for循环、while循环以及until循环,每种结构都给出了具体的使用场景和实例说明,旨在帮助初学者快速掌握Shell脚本的基本流程控制方法。...

    shell 流程控制语句

    shell 流程控制语句 shell 流程控制语句是 shell 编程中非常重要的组成部分,它们允许用户根据不同的条件和情况执行不同的命令或...只有熟练地掌握 shell 流程控制语句,才能写出更加灵活、更加高效的 shell 脚本。

    Shell脚本流程控制详解与实战

    内容概要:本文详细介绍了Shell脚本的流程控制结构,包括条件判断、循环控制和跳转控制。条件判断主要讲解了if语句及其变种形式(如if-else、if-elif-else),并讨论了各种条件表达式的使用方法。循环控制部分涵盖了...

    Shell脚本学习教程PDF版

    在“Shell脚本学习教程PDF版”中,你将深入理解Shell脚本的基本概念、语法结构以及高级特性。 首先,Shell脚本的基础包括变量、条件语句、循环结构和函数。变量是存储数据的地方,可以是文本、数字或者其他类型。在...

    250个shell脚本

    通过学习和实践这些脚本,你可以深入理解Shell脚本的基本语法、变量、函数、流程控制结构,以及如何调用系统命令。 Shell编程的核心知识点包括: - 命令行参数:如$0, $1, $@等,用于接收脚本执行时传递的参数。 - ...

    shell编程 创建shell脚本 shell 基础语法 shell流程控制语法 shell函数

    下面将详细介绍创建 Shell 脚本、Shell 基础语法、流程控制语法以及如何定义和使用 Shell 函数。 首先,让我们理解一下 Shell 编程的基础。Shell 是操作系统提供的一种命令解释器,用户通过 Shell 与操作系统进行...

    Shell脚本编程100例

    以上这些例子涵盖了基本的Shell脚本操作,如变量使用、条件判断、流程控制、系统命令调用以及定时任务设置等。通过学习和实践这些脚本,可以深入了解Shell脚本编程,提升系统管理能力。对于Linux系统管理员、开发者...

    linux下批量执行oracle脚本的shell脚本

    在shell脚本中,这些步骤可以通过调用相应的Oracle管理工具(如`sqlplus`或`dbca`)来实现,并通过逻辑控制结构(如if、for循环)确保按顺序执行。 `createTable.sql` 文件很可能是包含创建数据库表结构的SQL脚本。...

    Shell脚本-从入门到精通.ppt

    shell脚本编程基础知识点 shell脚本是Linux操作...本资源摘要信息提供了shell脚本编程的基础知识点,包括shell脚本的基本结构、编写、执行、控制结构、调试、应用、优点、举例、注意事项和高级应用等方面的知识点。

    LINUX SHELL 脚本攻略

    Shell脚本的基本构成包括:变量、环境变量、命令执行、流程控制(如if语句、for循环、while循环等)、函数定义和使用、输入输出处理等。掌握这些基本元素对于编写有效、高效的Shell脚本至关重要。 1. 变量和环境...

    shell脚本大全

    在IT领域,Shell脚本是Linux和Unix操作系统中不可或缺的一部分,它是一种强大的自动化工具,能够帮助用户执行一系列命令,简化日常任务。"shell脚本大全"这个资源可能包含了大量的示例脚本,涵盖了各种用途和场景,...

    Shell脚本中执行sql语句操作mysql的5种方法

    其基本思路是将需要执行的SQL语句直接写入Shell脚本中,并通过`mysql`命令来执行这些语句。下面是一个具体的示例: ```bash #!/bin/bash # 定义日志 TIMESTAMP=$(date +%Y%m%d%H%M%S) LOG="call_sql_${TIMESTAMP}....

    shell脚本培训视频.rar

    5. **Shell剑客**(上下):这部分可能是一个系列教程,重点讲解了Shell脚本的高级技巧和实战应用,如条件表达式、正则表达式、函数、错误处理、流程控制等,帮助用户提升Shell脚本的编写能力。 6. **编辑器使用**...

    Shell 脚本语言入门

    这些命令可以执行系统操作、控制流程、处理文本等任务。Shell脚本的强大之处在于它能够无缝地集成系统命令,使得复杂的任务变得简单易行。 #### Shell脚本的基本构成 1. **变量**:用于存储数据,如字符串、数值等...

    shell脚本.pdf

    对于初学者来说,掌握Shell脚本可以极大地提高工作效率,尤其在日常系统管理、数据处理和自动化流程中。这份"shell脚本.pdf"书籍显然是为初学者设计的,提供了一系列基础概念和实例,帮助读者快速入门。 1. **基础...

    shell脚本语言.pdf

    "shell脚本语言" Shell 简介: Shell 是一种命令语言和程序设计语言,用户可以通过 Shell 完成大部分工作。Shell 既可以交互式地解释和执行用户输入的命令,也可以定义各种变量和参数,提供了许多控制结构,包括...

    shell脚本学习指南

    2. **脚本结构**:一个基本的Shell脚本通常包含以下部分:Shebang(#!/bin/bash),用于指定解释器;变量声明;命令及逻辑结构。 3. **执行脚本**:要运行Shell脚本,需赋予脚本执行权限(`chmod +x scriptname.sh`...

    shell脚本学习指南pdf

    **Shell脚本学习指南** Shell脚本是一种在Unix/Linux操作系统中使用的编程语言,它允许用户通过命令行界面执行一系列操作,实现自动化任务处理。作为学习Shell脚本的指南,这本书籍旨在帮助读者深入理解Shell脚本...

Global site tag (gtag.js) - Google Analytics