通常我们将一些命令写在一个文件中就算是一个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脚本shell 基础语法 ①变量②变量分类与数组③shell传递参数④基本运算符shell流程控制语法 ①if else条件判断②for循环③while循环④until循环⑤case语句⑥跳出循环...
主要介绍了Shell脚本中执行sql语句操作mysql的5种方法,本文讲解了将SQL语句直接嵌入到shell脚本文件中、命令行调用单独的SQL文件、使用管道符调用SQL文件等方法,需要的朋友可以参考下
在Linux的系统Shell脚本中使用if语句的方法.docx
脚本只需配置/etl/sql/sql_mb.txt模板中的SQL语句,以及配置/etl/sql/filename.txt文件中对应的文件名称即可将数据卸载到对应文件名称的文本文档中,配置自由。 脚本中包括数据卸载,编码转换(GBK转UTF8),获取...
《Shell脚本专家指南》旨在为Linux、Unix以及OSx系统管理员提供短小精悍且功能强大的shell实现解决方案,教会读者如何使用现有调试器调试shell脚本。全书分为3个部分:脚本技术基础、系统交互和高级技术、有用的脚本...
shell 脚本程序设计
Linux运维-运维系统服务04-Shell脚本d4-Shell循环-05循环控制语句.mp4
shell连接oracle数据库工具脚本:支持select/insert/update/delete 部署位置:/root/sysmonitor db:数据库文件夹 dbconfig.properties:数据库配置文件, dbConnectTest.sh:连接测试文件 dbExecurteSQL.sh:...
编写shell脚本: 格式:vi 脚本文件的名字.sh 脚本第一行: #!/bin/bash #!是为了指明当前脚本文件编写完成后,指定的脚本解析器的解析工作 第一种方式: /bin/bash 脚本文件的名字.sh shell脚本:一个能够被执行...
linux Shell脚本之测试语句.docx
Shell 流程控制 22 1、if else 23 2、for循环 24 3、while语句 24 4、无限循环 24 5、until循环 25 6、case 25 7、跳出循环 26 8、esac 27 Shell函数 27 Shell 输入/输出重定向 30 1、输出重定向 31 2、输入重定向 ...
Shell脚本编程详解 Shell命令行的运行 编写、修改权限和执行Shell程序的步骤 在Shell程序中使用参数和变量 表达式比较、循环结构语句和条件结构语句 在Shell程序中使用函数和调用其他Shell程序
主要介绍了Shell脚本编程之判断语句的相关资料,需要的朋友可以参考下
Linux下shell脚本中if语句使用的注意事项
3. 根据逻辑和语法结构来编写脚本(条件判断或者流程控制) 步骤: vim ping.sh #!/bin/bash # Name:ping.sh # Path:/shell02/ # Usage:/shell02/ping.sh # ... #获取远程主机的IP地址(定义变量让用户自己输入) ...
和Java、PHP等语言不一样,sh的流程控制不可为空,如: 代码如下: <?php if (isset($_GET[“q”])) { search(q); } else { //do nothing } ?> 在sh/bash里可不能这么写,如果else分支没有语句执行,就...
从网上搜集的shell 基本语法 * 1 合理使用注释 * 2 变量赋值和引用 * 3 Shell里的命令 ... * 9 Shell脚本示例 o 9.1 一般编程步骤 o 9.2 二进制到十进制的转换 o 9.3 文件循环拷贝 * 10 脚本调试
这是学习shell脚本的一下基本的命令也是很常用的命令