在书写正确脚本前,大概讲一下退出状态。任何命令进行时都将返回一个退出状态。如
果要观察其退出状态,使用最后状态命令:

$ echo $?

主要有4种退出状态。前面已经讲到了两种,即最后命令退出状态$ ?和控制次序命令( $ $、

| |)。其余两种是处理s h e l l脚本或s h e l l退出及相应退出状态或函数返回码。在第1 9章讲到函数

时,也将提到其返回码。

要退出当前进程,s h e l l提供命令e x i t,一般格式为:

exit n

其中,n为一数字。

如果只在命令提示符下键入e x i t,假定没有在当前状态创建另一个s h e l l,将退出当前s h e l l。

如果在脚本中键入e x i t,s h e l l将试图(通常是这样)返回上一个命令返回值。有许多退出脚本

值,但其中相对于脚本和一般系统命令最重要的有两种,即:

退出状态0 退出成功,无错误。

退出状态1 退出失败,某处有错误。

可以在s h e l l脚本中加入自己的退出状态(它将退出脚本)。本书鼓励这样做,因为另一个

s h e l l脚本或返回函数可能要从s h e l l脚本中抽取退出脚本。另外,相信加入脚本本身的退出脚

本值是一种好的编程习惯。

如果愿意,用户可以在一个用户输入错误后或一个不可覆盖错误后或正常地处理结束后

退出脚本。

s h e l l会提供一系列命令声明语句等补救措施来帮助你在命令成功或失败时,或需要处
理一个命令清单时采取正确的动作。
这些命令语句大概分两类:
循环和流控制。

i f、t h e n、e l s e语句提供条件测试。测试可以基于各种条件。例如文件的权限、长度、数
值或字符串的比较。这些测试返回值或者为真( 0),或者为假( 1)。基于此结果,可以进行
相关操作。在讲到条件测试时已经涉及了一些测试语法。
c a s e语句允许匹配模式、单词或值。一旦模式或值匹配,就可以基于这个匹配条件作其他
声明。

循环或跳转是一系列命令的重复执行过程,本书提到了3种循环语句:
for 循环每次处理依次列表内信息,直至循环耗尽。
Until 循环此循环语句不常使用, u n t i l循环直至条件为真。条件部分在循环末尾部分。
While 循环w h i l e循环当条件为真时,循环执行,条件部分在循环头。
流控制语句的任何循环均可嵌套使用,例如可以在一个f o r循环中嵌入另一个f o r循环。
现在开始讲解循环和控制流,并举一些脚本实例。

i f语句测试条件,测试条件返回真( 0)或假(1)后,可相应执行一系列语句。i f语句结
构对错误检查非常有用。其格式为:
if 条件1
then 命令1
elif 条件2
then 命令2
else 命令3

f i
让我们来具体讲解i f语句的各部分功能。
If 条件1 如果条件1为真
Then 那么
命令1 执行命令1
elif 条件2 如果条件1不成立
then 那么
命令2 执行命令2
else 如果条件1,2均不成立
命令3 那么执行命令3
fi 完成
i f语句必须以单词f i终止。在i f语句中漏写f i是最一般的错误。我自己有时也是这样。
e l i f和e l s e为可选项,如果语句中没有否则部分,那么就不需要e l i f和e l s e部分。I f语句可以
有许多e l i f部分。最常用的i f语句是if then fi结构。

最普通的i f语句是:
i f条件
then 命令
f i
使用i f语句时,必须将t h e n部分放在新行,否则会产生错误。如果要不分行,必须使用命
令分隔符。本书其余部分将采取这种形式。现在简单i f语句变为:
if 条件;t h e n
命令
f i

[root@localhost huangcd]# sh iftest2 
enter your name:
your did not enter a information
[root@localhost huangcd]# cat iftest2 
#!/bin/bash
echo -n "enter your name:"
read NAME
if [ "$NAME" = "" ];then
        echo "your did not enter a information"
fi

下面测试文件拷贝是否正常,如果c p命令并没有拷贝文件m y f i l e到m y f i l e . b a k,则打印错
误信息。注意错误信息中` basename $0`打印脚本名。
如果脚本错误退出,一个好习惯是显示脚本名并将之定向到标准错误中。用户应该知道
产生错误的脚本名。

[root@localhost huangcd]# cat ifcp
#!/bin/bash
if cp ok1.txt ok.bak;then
    echo "good copy"
else
    echo "`basename $0`:error could not copy the files">&2
fi
[root@localhost huangcd]# ./ifcp
cp: 无法 stat “ok1.txt”: 没有那个文件或目录
ifcp:error could not copy the files

2代表标准出错,如果文件不存在,如果不加上2>&1则会打印出错信息,
加上以后就不会打印了,也进入那个文件了
&1代表标准输出定向到的地方,这句相当于
cat cities > cities.copy 2> cities.copy
或者
cat cities 1> cities.copy 2> cities.copy
或者
cat cities 2> cities.copy 1> &2 0:标准输入,1:标准输出,2:标准出错

当运行一些管理脚本时,可能要在根目录下运行它,特别是移动某种全局文件或进行权
限改变时。一个简单的测试可以获知是否运行在根目录下。下面脚本中变量D I R E C TO RY使用
当前目录的命令替换操作,然后此变量值与" / "字符串比较( /为根目录)。如果变量值与字符
串不等,则用户退出脚本,退出状态为1意味错误信息产生。

[root@localhost huangcd]# ./ifpwd 
you need to be in the root directory.not /home/huangcd 
[root@localhost huangcd]# cat ifpwd 
#!/bin/bash
DIRCTORY=`pwd`
if [ "$DIRCTORY"!="/" ]
    then echo "you need to be in the root directory.not $DIRCTORY ">&2
    exit 1 
fi

i f语句可用来测试传入脚本中参数的个数。使用特定变量$ #,表示调用参数的个数。可以
测试所需参数个数与调用参数个数是否相等。
以下测试确保脚本有三个参数。如果没有,则返回一个可用信息到标准错误,然后代码
退出并显示退出状态。如果参数数目等于3,则显示所有参数。

[root@localhost huangcd]# cat ifpatam 
#!/bin/bash
if [ $# -lt 3 ]
    then echo "Usage:`basename $0` arg1 arg2 arg3" >&2
    exit 1
fi
echo "arg1:$1"
echo "arg2:$2"
echo "arg3:$3"
[root@localhost huangcd]# ./ifpatam cup medal
Usage:ifpatam arg1 arg2 arg3
[root@localhost huangcd]# ./ifpatam cup medal thophy
arg1:cup
arg2:medal
arg3:thophy

下面的例子测试环境变量E D I TO R是否已设置。如果E D I TO R变量为空,将此信息通知用
户。如果已设置,在屏幕上显示编辑类型。

[root@localhost huangcd]# cat ifeditor 
#!/bin/bash
if [-z $EDITORS ]
    then echo  "your EDITOR environment is not set"
else
    echo "Using $EDITOR as the fefault editor"
fi
[root@localhost huangcd]# ./ifeditor 
./ifeditor: line 2: [-z: command not found
Using  as the fefault editor

可以向脚本传递位置参数,然后测试变量。这里,如果用户在脚本名字后键入目录名,
脚本将重设$ 1特殊变量为一更有意义的名字。即D I R E C TO RY。这里需测试目录是否为空,如
果目录为空,ls -A将返回空,然后对此返回一信息。

[root@localhost huangcd]# sh ifdirec 
 is indeed empty
[root@localhost huangcd]# sh ifdirec /home
/home is indeed empty
[root@localhost huangcd]# cat ifdirec 
#!/bin/bash
DIRECTORY=$1
if [ "`ls -A $DIRECTORY`"="" ]
    then echo "$DIRECTORY is indeed empty"
else
    echo "$DIRECTORY is not empty"
fi

linux shell编程指南第十八章------控制流结构的更多相关文章

  1. linux shell编程指南第二十章------向脚本传递参数

    前面已经讲到如何使用特定变量$ 1 . . $ 9向脚本传递参数.$ #用于统计传递参数的个数.可 以创建一个u s a g e语句,需要时可通知用户怎样以适当的调用参数调用脚本或函数. 简单地说,下 ...

  2. linux shell编程指南第十一章------------合并与分割2

    c u t用来从标准输入或文本文件中剪切列或域.剪切文本可以将之粘贴到一个文本文件. 下一节将介绍粘贴用法. c u t一般格式为: cut [options] file1 file2 下面介绍其可用 ...

  3. linux shell编程总结

    linux shell编程总结 本周学习了unix/linux shell编程,参考的是<LINUX与UNIX Shell 编程指南>,David Tansley著:徐焱,张春萌等译,由机 ...

  4. linux shell 编程参考

    #!/bin/bash my_fun() { echo "$#" } echo 'the number of parameter in "$@" is '$(m ...

  5. Linux音频编程指南

    Linux音频编程指南 虽然目前Linux的优势主要体现在网络服务方面,但事实上同样也有着非常丰富的媒体功能,本文就是以多媒体应用中最基本的声音为对象,介绍如何在Linux平台下开发实际的音频应用程序 ...

  6. linux —— shell 编程(文本处理)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed aw ...

  7. linux —— shell 编程(编程语法)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 再识变量 函数 条件语句 循环语句 ...

  8. Linux Shell编程参考大全

    本文记录Linux Shell编程中常用基本知识,方便快速入门以及查询使用. 本文主要分为以下几个部分: 一.Shell中的变量 任何编程语言中,有关变量的定义,作用范围,赋值等都是最最基础的知识. ...

  9. Linux Shell编程中的几个特殊符号命令 & 、&& 、 ||

    https://blog.csdn.net/hack8/article/details/39672145 Linux Shell编程中的几个特殊符号命令 & .&& . || ...

随机推荐

  1. HDU 1025 DP + 二分

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1025 求最长递增子序列,O(n^2)的复杂度超时,需要优化为O(n*logn) f[i]存储长度为i的最小 ...

  2. 详解iOS7升级细节:引领视觉革命

    下星期我们将看到的正式版将和WWDC上看到的大不相同.苹果六月份发布了全新版本的iOS操作系统——这是从2007年首次发布以来的最大的一次调整和改进.这次的改变招致许多批评.许多设计师在网站上晒出了他 ...

  3. POJ Octal Fractions(JAVA水过)

    题目链接:id=1131" target="_blank">CLICK HERE~ 尽管java一下模拟水过,可是我看到别人的一段奇妙代码,贴出和大家共享. imp ...

  4. BON取代半岛电视,美国人要“换口味”了吗?

        记得很久以前唐骏在某高校演讲时,讲了这么一个笑话,他问一位美国最普通的大妈,“请你说出三个印象最深刻的中国城市”,在北京奥运会之前,这位大妈说了如下三个城市:北京.香港.新加坡.很显然,这位大 ...

  5. vim-ctags-taglist-netrw

    vim配置 在~/.vimrc文件里配置例如以下内容.或者在/etc/vim/vimrc中进行全局配置,经常使用配置例如以下: syntax on set tabstop=4 set nu set s ...

  6. PHP - session编码和解码

    <?php //session编码 session_start(); $_SESSION['name'] = 'Jack'; $_SESSION['sex'] = 'men'; $envar = ...

  7. 一天一个类,一点也不累之HashSet

    最近忙着一个小项目结题,故没能按时完成[一天一个类,一点也不累],还好项目优秀,算是对自己一点点的安慰和鼓励.~~~ 今天要说的是HashSet 既然是继承自Set,那么就必须有Set的一些属性,比如 ...

  8. java--异常处理总结

    [在程序中抛出异常] 在程序中抛出异常,一定要使用关键字throw. throw+异常实例对象. public class Demo2 { public static void main(String ...

  9. 08-UIKit(UITableTableViewCell、自定义Cell、xcode调试)

    目录: 1. UITableTableViewCell 2. tag技术 3. 自定义Cell 4. 用nib文件构造自定义的静态表 5. TableView数据模型总结 6. Xcode代码调试 & ...

  10. 总结:js中4类修改样式的方法

    前言 最近在写一个扩展右键菜单的插件,既然是插件,想着一步到位,把相关的style样式设置都丢进js文件中,直接加载一个js文件便可以使用该插件,所以今天就研究了下js批量的插入样式的方法,即addS ...