第9章shell编程_第1页
第9章shell编程_第2页
第9章shell编程_第3页
第9章shell编程_第4页
第9章shell编程_第5页
已阅读5页,还剩108页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第9章章 shell编程编程 9.1 shell概述概述 9.2 shell的基本功能的基本功能 9.3 shell启动及其命令启动及其命令 9.4 shell命令的集成命令的集成 9.5 shell变量变量 9.6 shell的控制结构的控制结构 9.7 shell的运行环境的运行环境 9.8 shell应用实例应用实例 9.9 小结小结 习题习题 shell是一种命令语言,同时又是一种程序设计语言。是一种命令语言,同时又是一种程序设计语言。 shell的语言处理能力,使得用户能够方便地定义各的语言处理能力,使得用户能够方便地定义各 种变量、参数,并使用各种控制语句编写复杂的命种变量、参数

2、,并使用各种控制语句编写复杂的命 令程序完成多种工作。本章介绍令程序完成多种工作。本章介绍shell、shell程序设程序设 计语言、计语言、shell的运行环境及的运行环境及shell程序的调试。程序的调试。 9.1 shell概述概述 9.1.1 什么是什么是shell shell是一种命令解释程序是一种命令解释程序(命令解释器命令解释器),shell解释用解释用 户输入的命令行,提交系统内核处理,并将结果返户输入的命令行,提交系统内核处理,并将结果返 回给用户。与回给用户。与linux命令一样都是实用程序,但两命令一样都是实用程序,但两 者又有区别。一旦用户注册到系统后,者又有区别。一旦

3、用户注册到系统后,shell就被系就被系 统装入内存,并一直运行到用户退出系统之止;而统装入内存,并一直运行到用户退出系统之止;而 一般命令仅当被调用时,才由系统装入内存执行。一般命令仅当被调用时,才由系统装入内存执行。 shell本身也是一种可编程的程序设计语言。用本身也是一种可编程的程序设计语言。用shell写写 的程序的程序(shell脚本脚本)相当于相当于dos/windows下的批处理文下的批处理文 件,它可以简单到只有一条命令,也可以复杂到包件,它可以简单到只有一条命令,也可以复杂到包 括大量循环、条件语句、数学运算、控制结构,也括大量循环、条件语句、数学运算、控制结构,也 可以是

4、介于两者之间的程序。可以是介于两者之间的程序。 9.1.2 shell程序语言的特点程序语言的特点 shell允许通过编程来完成复杂的功能处理,但其作允许通过编程来完成复杂的功能处理,但其作 为语言与高级语言相比较具有不同的特点:为语言与高级语言相比较具有不同的特点: (1) shell是解释性的,多数高级语言是编译性的;是解释性的,多数高级语言是编译性的; (2) shell语言与高级语言处理的对象不同;语言与高级语言处理的对象不同; (3) shell与系统有密切的关系;与系统有密切的关系; (4) shell易编写、调试、灵活性较强,但速度低;易编写、调试、灵活性较强,但速度低; (5)

5、 shell作为命令级语言,命令组合功能很强。作为命令级语言,命令组合功能很强。 9.1.3 shell的版本的版本 shell有两种主要语法类型:有两种主要语法类型: bourne shell和和c shell, 彼此不兼容。彼此不兼容。bourne shell家族:家族:sh ksh bash psh zsh;c shell家族:家族:csh tcsh。 其中其中bash和和 zsh在不同程度上支持在不同程度上支持 csh 的语法。的语法。 这里,我们再着重介绍一下这里,我们再着重介绍一下bash的特点:的特点: (1) 自动补全功能自动补全功能 假设要输入的命令很长,或者命令后面要给的文

6、件假设要输入的命令很长,或者命令后面要给的文件 名很长。这个时候只要按一个名很长。这个时候只要按一个tab键,键,bash就会在就会在 可能的命令或文件名里面找寻匹配的命令,找到的可能的命令或文件名里面找寻匹配的命令,找到的 话就会自动帮你补齐。话就会自动帮你补齐。 (2) 命令行编辑程序命令行编辑程序 bash的命令行编辑是在提示符下,可对未执行的命的命令行编辑是在提示符下,可对未执行的命 令字符任意地修改。令字符任意地修改。 (3) 命令历史命令历史(command history) 所谓的命令历史就是把曾经输入过的命令记录起来,所谓的命令历史就是把曾经输入过的命令记录起来, 方便日后的查

7、询与使用。只要按向上键就可以调出方便日后的查询与使用。只要按向上键就可以调出 前一个命令,再按一次向上键就可以调出更前一个前一个命令,再按一次向上键就可以调出更前一个 命令,依此类推,用向下键可以回到下个命令,所命令,依此类推,用向下键可以回到下个命令,所 以用上、下键就可以选择以前输入过的命令。以用上、下键就可以选择以前输入过的命令。 9.2 shell的基本功能的基本功能 9.2.1 程序的运行程序的运行 当用户输入一行命令后,当用户输入一行命令后,shell负责解释、分析输入负责解释、分析输入 的内容,并且决定做什么,同时替系统内核删除命的内容,并且决定做什么,同时替系统内核删除命 令行

8、中不必要的信息。命令是一个可执行的令行中不必要的信息。命令是一个可执行的linux 命令、程序、工具或命令、程序、工具或shell脚本。脚本。 例例1: ls -l file1 file2 file3 例例2: echo welcome to tsinghua university. 例例3: echo welcome to tsinghua university. 注意注意: 例例2和例和例3的结果是完全一样的。的结果是完全一样的。 9.2.2 使用保留字和元字符使用保留字和元字符 shell有一些具有特殊意义的字有一些具有特殊意义的字(保留字保留字) ,如在,如在shell脚脚 本中,像本

9、中,像do、done、for、while等保留字控制循环等保留字控制循环 操作,操作,if、then、else等保留字进行条件控制。保留等保留字进行条件控制。保留 字随字随shell的不同而不同。的不同而不同。 在在linux系统里,有一组特殊意义字符,这就是所谓系统里,有一组特殊意义字符,这就是所谓 的元字符的元字符(通配符通配符)。 现在列出一些常用的通配符的意义,供参考。现在列出一些常用的通配符的意义,供参考。 . 上一层目录,与上一层目录,与cd命令配合用得比较多命令配合用得比较多 . 目前工作的目录目前工作的目录 * 任意长度的字符任意长度的字符 ? 长度为一个的任意字符长度为一个的

10、任意字符 . 括号内的一个字符括号内的一个字符 m 等于某个通配符,如等于某个通配符,如*、?等、?等 a-z* 小写字母开头的所有字符串小写字母开头的所有字符串 转义符号,用以解除特殊字符的特殊意义转义符号,用以解除特殊字符的特殊意义 用户目录用户目录 ; 分隔符,当命令行有多个命令时,做分隔用分隔符,当命令行有多个命令时,做分隔用 bourneshell的提示符,同时也作为的提示符,同时也作为shell语言语言 的位置变量参数的位置变量参数 # 做注释用做注释用 | 建立一个管道,使一命令的输出作为另一个建立一个管道,使一命令的输出作为另一个 命令的输入命令的输入 表示按顺序执行管道线;表

11、示按顺序执行管道线; ; pattern2) command . command; . patternn) command . command; esac 9.6.4 for结构结构 格式为,格式为, for variable in arg1 arg2 . argn do command . command done 9.6.5 while结构结构 格式为,格式为, while command do command . command done 9.6.6 until结构结构 格式为,格式为, until command do command . command done 9.6.7 循环体中

12、其他命令循环体中其他命令 1. break命令命令 格式为,格式为, break或或break n break是是shell的内部命令,用于在循环体中根据命令的内部命令,用于在循环体中根据命令 运行的返回条件,直接终止循环体内命令的执行。运行的返回条件,直接终止循环体内命令的执行。 当执行当执行break命令时,控制流从循环体中转移到命令时,控制流从循环体中转移到 done之后的第一条命令上。当执行之后的第一条命令上。当执行break n命令时,命令时, 则终止最内层的则终止最内层的n个循环的执行。个循环的执行。 2. continue 命令命令 格式为,格式为, continue或或cont

13、inue n continue是是shell的内部命令,用于在循环体中根据命的内部命令,用于在循环体中根据命 令运行的返回条件,直接进入下一次循环命令的执令运行的返回条件,直接进入下一次循环命令的执 行。当执行行。当执行continue命令时,控制流直接转到本循命令时,控制流直接转到本循 环体中第一条命令上。当执行环体中第一条命令上。当执行continue n命令时,命令时, 则跳过最里层的则跳过最里层的 n次循环体的执行,即开始第次循环体的执行,即开始第n个个 (从内向外数从内向外数) 循环的下一个循环过程。循环的下一个循环过程。 3. 循环中的输入输出改向循环中的输入输出改向 对整个循环命

14、令也可实施对整个循环命令也可实施shell命令的输入输出改向。命令的输入输出改向。 循环输入的改向将作用于循环体中从标准输入读数循环输入的改向将作用于循环体中从标准输入读数 据的所有命令;而循环输出改向将作用于循环体中据的所有命令;而循环输出改向将作用于循环体中 向标准输出写数据的所有命令。在循环体内也可以向标准输出写数据的所有命令。在循环体内也可以 进行输入输出改向,且这种改向独立于整个循环体进行输入输出改向,且这种改向独立于整个循环体 命令的输入输出改向。命令的输入输出改向。 例:例: while test count -lt 20 do . echo error: count . ech

15、o right: count /dev/tty . done 2 error.out 4. 循环体与管道循环体与管道 循环命令也能通过管道与其他的循环命令也能通过管道与其他的shell命令联接在一命令联接在一 起使用。一个命令的输出通过管道可以作为循环命起使用。一个命令的输出通过管道可以作为循环命 令的输入,而整个循环命令的输出也可以通过管道令的输入,而整个循环命令的输出也可以通过管道 作为另一个命令的输入。作为另一个命令的输入。 例:例: for i in a b c d do echo i done|wc -l 4 9.6.8 函数的定义和使用函数的定义和使用 函数实际上是由若干函数实际上

16、是由若干shell命令组成,因此它与命令组成,因此它与shell的的 命令文件形式上是相似的。不同的只是命令文件形式上是相似的。不同的只是shell函数常函数常 驻于内存之中。它们不再是一个单独的进程,而是驻于内存之中。它们不再是一个单独的进程,而是 成了成了shell的一部分。的一部分。 格式为,格式为, function name() command command 函数仅存在于定义它的函数仅存在于定义它的shell环境中,不能把它们传环境中,不能把它们传 递给子递给子shell。函数是在当前。函数是在当前shell中被执行的,在函中被执行的,在函 数体中变量值和当前工作目录的改变,将影响

17、当前数体中变量值和当前工作目录的改变,将影响当前 shell的运行环境。函数一旦定义就被存入内存,的运行环境。函数一旦定义就被存入内存, shell执行函数时不需要在磁盘中进行查找,所以执执行函数时不需要在磁盘中进行查找,所以执 行速度要比把函数中的命令放入到一个文件中的执行速度要比把函数中的命令放入到一个文件中的执 行要快。使用函数时,命令行中列在函数名后的自行要快。使用函数时,命令行中列在函数名后的自 变量传递给函数体中的位置参数。函数执行返回时变量传递给函数体中的位置参数。函数执行返回时 也有一个出口状态。函数体内执行也有一个出口状态。函数体内执行exit命令将结束命令将结束 函数的执行

18、,同时也结束调用函数的函数的执行,同时也结束调用函数的shell程序的运程序的运 行。而行。而return命令用于结束函数的执行,如省略命令用于结束函数的执行,如省略 return时,则以最后一条命令的出口状态作为函数时,则以最后一条命令的出口状态作为函数 的出口状态。的出口状态。 例:例: # the test codes for function definition getyesorno() while echo *(y/n)? c ; nn)return 1 ; *)echo please enter y or n ! ; esac done 执行执行 getyesorno do yo

19、u wish to continue | exit 显示显示do you wish to continue(y/ n)? 9.7 shell的运行环境的运行环境 9.7.1 局部变量局部变量 当用户注册之后,用户就拥有了注册当用户注册之后,用户就拥有了注册shell的运行环的运行环 境,其运行环境主要由境,其运行环境主要由shell变量值决定。注册变量值决定。注册shell 在接受到用户输入的命令在接受到用户输入的命令(非内部命令非内部命令)后,通常派后,通常派 生出一个子生出一个子shell,由此子,由此子shell负责解释执行该命令。负责解释执行该命令。 子子shell有自己的运行环境和局

20、部变量,局部变量仅有自己的运行环境和局部变量,局部变量仅 在特定的环境下才能使用。在特定的环境下才能使用。shell的运行环境是可以的运行环境是可以 改变的,但子改变的,但子shell不能存取由父不能存取由父shell设置的局部变设置的局部变 量,也不能改变父量,也不能改变父shell的变量值。的变量值。 例例1: cat var-test echo :x: x=100 var-test : 例例2: cat var-test2 x=60 echo :x: x=10 var-test2 :60: echo x 10 9.7.2 全局变量全局变量 全局变量是一种特殊的变量,可以被任何运行的子全局

21、变量是一种特殊的变量,可以被任何运行的子 shell来引用。全局变量通过来引用。全局变量通过export命令来定义,格命令来定义,格 式如下:式如下: export variables 其中其中 variables 是定义全局变量的变量表名。是定义全局变量的变量表名。 一旦变量被定义为全局变量,则对于以后的所有子一旦变量被定义为全局变量,则对于以后的所有子 shell来说这些都是全局变量。子来说这些都是全局变量。子shell中无法改变全中无法改变全 局变量的值。若在子局变量的值。若在子shell中改变全局变量的值,实中改变全局变量的值,实 际是对全局变量的副本进行更改,不影响全局变量际是对全局

22、变量的副本进行更改,不影响全局变量 值。子值。子shell中局部变量的使用优先于全局变量。中局部变量的使用优先于全局变量。 例:例: export g-var g-var=global cat test-var export g-var l-var g-var=sub-shell:g-var l-var=sub-shell:l-var echo g-var l-var test-var sub-shell:g-var sub-shell:l-var echo g-var :l-var: global : 9.7.3 局部变量和全局变量作用域局部变量和全局变量作用域 任何没有用任何没有用expo

23、rt命令定义过的变量是局部变量,子命令定义过的变量是局部变量,子 shell不能存取父不能存取父shell的局部变量。子的局部变量。子shell中可以存中可以存 取和修改父取和修改父shell的全局变量,但这种修改对于父的全局变量,但这种修改对于父 shell全局变量没有任何影响。在子全局变量没有任何影响。在子shell中用中用export 命令定义的全局变量和对此变量的修改对父命令定义的全局变量和对此变量的修改对父shell变变 量没有影响。全局变量保持它的全局性,不仅能直量没有影响。全局变量保持它的全局性,不仅能直 接传递给它的子接传递给它的子shell,而且子,而且子shell还能将它传

24、递给还能将它传递给 子子shell的子的子shell。在对变量赋值之前和之后的任何。在对变量赋值之前和之后的任何 时候可以将该变量转换成全局变量。时候可以将该变量转换成全局变量。 9.7.4 程序调试程序调试 shell提供了多种工具以便在调试提供了多种工具以便在调试shell程序时使用,这程序时使用,这 些工具允许观察一个些工具允许观察一个shell程序的执行,还允许观察程序的执行,还允许观察 一个程序在不做任何实际处理的情况下是如何被一个程序在不做任何实际处理的情况下是如何被 “执行执行”的。提供的测试方式有:的。提供的测试方式有: 1. shell程序的详细跟踪程序的详细跟踪 shell

25、提供的详细跟踪特性允许用户观察一个提供的详细跟踪特性允许用户观察一个shell程序程序 的读入和执行,如果在读入命令行时发现语法错误,的读入和执行,如果在读入命令行时发现语法错误, 则终止程序的执行。命令行被读入后,则终止程序的执行。命令行被读入后,shell按读入按读入 时的形式在标准错误输出中显示该命令行,然后执时的形式在标准错误输出中显示该命令行,然后执 行命令行。详细跟踪行命令行。详细跟踪shell程序的执行有两种方式:程序的执行有两种方式: 整个程序的详细跟踪和局部程序的详细跟踪。整个程序的详细跟踪和局部程序的详细跟踪。 整个程序的跟踪执行格式整个程序的跟踪执行格式: sh -v 文

26、件名用来实现对整个文件的脚本进行跟踪。文件名用来实现对整个文件的脚本进行跟踪。 局部程序的跟踪执行格式局部程序的跟踪执行格式:set -v设置跟踪标志设置跟踪标志 set +v关闭跟踪标志用来实现对文件中的部分脚关闭跟踪标志用来实现对文件中的部分脚 本进行跟踪。本进行跟踪。 例:例: cat traced date echo path|wc -c traced 1998年年 11月月 05日日 星期四星期四 17时时 29分分 59秒秒 cst 45 sh -v traced date 1998年年 11月月 05日日 星期四星期四 17时时 30分分 08秒秒 cst echo path|w

27、c -c 45 2. shell程序的跟踪执行程序的跟踪执行 此功能允许用户观察一个此功能允许用户观察一个shell程序的执行,它使命程序的执行,它使命 令行在执行前完成所有替换之后,在标准错误输出令行在执行前完成所有替换之后,在标准错误输出 中显示每一个被替换后的命令行,并且在行前加上中显示每一个被替换后的命令行,并且在行前加上 前缀符号前缀符号“+”(但变量赋值语句不加但变量赋值语句不加“+”符号符号),然,然 后执行命令。对后执行命令。对shell程序的跟踪执行也有两种方式:程序的跟踪执行也有两种方式: 整个程序的跟踪执行和局部程序的跟踪执行。整个程序的跟踪执行和局部程序的跟踪执行。 整

28、个程序的跟踪执行格式为,整个程序的跟踪执行格式为, sh -x 文件名文件名 用来实现对整个文件脚本的跟踪执行。用来实现对整个文件脚本的跟踪执行。 局部程序的跟踪执行格式为,局部程序的跟踪执行格式为, set -x设置跟踪标志设置跟踪标志 set +x关闭跟踪标志关闭跟踪标志 用来实现对文件中部分脚本的跟踪执行。用来实现对文件中部分脚本的跟踪执行。 例:例: cat traced date echo path|wc -c sh -x traced +date 1998年年 11月月 05日日 星期四星期四 17时时 30分分 08秒秒 cst +echo /bin:/usr/bin:/usr/

29、fk/bin /bin:/usr/bin:/usr/fk/bin +wc -c 25 3. 详细跟踪与跟踪执行的组合详细跟踪与跟踪执行的组合 整个程序的跟踪执行格式为,整个程序的跟踪执行格式为, sh -vx 文件名文件名 局部程序的跟踪执行格式为,局部程序的跟踪执行格式为, set -vx设置跟踪标志设置跟踪标志 set +vx关闭跟踪标志关闭跟踪标志 详细跟踪与跟踪执行的区别在于在执行命令行之前,详细跟踪与跟踪执行的区别在于在执行命令行之前, 详细跟踪打印出命令行的原始内容,而跟踪执行却详细跟踪打印出命令行的原始内容,而跟踪执行却 打印出经过替换后的命令行内容,循环结构和管道打印出经过替换

30、后的命令行内容,循环结构和管道 线在两种跟踪方式中是根本不同的。由于线在两种跟踪方式中是根本不同的。由于shell对这对这 些结构只读取一次,因此,详细跟踪方式也仅显示些结构只读取一次,因此,详细跟踪方式也仅显示 它们一次。但这类结构的命令行可能要被重复执行它们一次。但这类结构的命令行可能要被重复执行 多次,所以,跟踪执行方式就可能将同样的命令行多次,所以,跟踪执行方式就可能将同样的命令行 显示一次以上。显示一次以上。 4. 非执行跟踪非执行跟踪 shell的非执行任选项提供的功能允许用户观察一个的非执行任选项提供的功能允许用户观察一个 shell程序,而程序中的命令行不被执行。非执行通程序,

31、而程序中的命令行不被执行。非执行通 常与详细跟踪结合使用,查看在不实际执行一个常与详细跟踪结合使用,查看在不实际执行一个 shell程序时,程序是如何被程序时,程序是如何被“执行执行”的。其格式为,的。其格式为, sh -n 文件名文件名 或或 set -n 5. 未置变量退出跟踪未置变量退出跟踪 shell的未置变量退出特性允许对所有的变量进行检的未置变量退出特性允许对所有的变量进行检 查,如果引用了一个未赋值的变量就终止查,如果引用了一个未赋值的变量就终止shell程序程序 执行。执行。shell通常允许未置变量的使用,在此种情况通常允许未置变量的使用,在此种情况 下,变量的值为空。但如果

32、设置了未置变量退出的下,变量的值为空。但如果设置了未置变量退出的 任选项,则一旦使用了未置的变量就显示出错信息,任选项,则一旦使用了未置的变量就显示出错信息, 并终止程序的运行。其格式为,并终止程序的运行。其格式为, sh -u 文件名文件名 或或 set -u设置标志设置标志 set +u清除标志清除标志 6. 立即退出跟踪立即退出跟踪 shell的立即退出特性允许在程序内的任何命令以非的立即退出特性允许在程序内的任何命令以非 零状态退出时,立即终止程序的运行。其格式为,零状态退出时,立即终止程序的运行。其格式为, sh -e 文件名文件名 或或 set -e设置标志设置标志 set +e清

33、除标志清除标志 9.7.5 shell程序的应用程序的应用 1. shell程序的定义程序的定义 若一个文件包含了一串简单命令串时,称为命令文若一个文件包含了一串简单命令串时,称为命令文 件;若一个文件包含了一组更为复杂的命令组合件;若一个文件包含了一组更为复杂的命令组合 (常常使用了常常使用了shell的条件命令、控制结构和其他高的条件命令、控制结构和其他高 级特性级特性)时,就称之为时,就称之为shell程序程序(或称或称shell过程过程)。通。通 常情况下,两者的称呼并没有明确的区别。常情况下,两者的称呼并没有明确的区别。 在在shell程序设计语言里的基本操作是程序设计语言里的基本操

34、作是linux系统命令,系统命令, 它是它是linux系统中最有生气的部分,而且对于系统中最有生气的部分,而且对于linux 系统的使用极为重要。系统的使用极为重要。 2. 何时使用何时使用shell程序设计语言程序设计语言 当一个问题的解决方法需要使用多个当一个问题的解决方法需要使用多个linux系统的标系统的标 准命令时,可使用准命令时,可使用shell命令文件。如果处理的问题命令文件。如果处理的问题 比较复杂,可以使用比较复杂,可以使用shell程序设计语言,即在命令程序设计语言,即在命令 文件中定义各种参数和变量,使用文件中定义各种参数和变量,使用shell的条件命令、的条件命令、 控

35、制结构和其他高级特性。控制结构和其他高级特性。 9.8 shell应用实例应用实例 下面这段程序取自下面这段程序取自/etc/rc.d/rc.sysinit文件中的一部分,文件中的一部分, /etc/rc.d/rc.sysinit文件是文件是linux系统启动过程中需要系统启动过程中需要 执行的执行的shell程序。这段程序的功能主要是配置网络程序。这段程序的功能主要是配置网络 环境、检查文件系统和加载应用模块。要注意,在环境、检查文件系统和加载应用模块。要注意,在 shell程序中注释语句是以程序中注释语句是以#开头,但以开头,但以#!开头的语!开头的语 句并不是注释语句。如果想执行该程序,

36、可以用一句并不是注释语句。如果想执行该程序,可以用一 般用户登录系统后,直接执行般用户登录系统后,直接执行/etc/rc.d/rc.sysinit。 # 第一条语句先指定本第一条语句先指定本shell程序采用哪个程序采用哪个shell执行。执行。 #! /bin/sh # 以以#开始的语句是注释行。开始的语句是注释行。 # /etc/rc.d/rc.sysinit - run once at boot time # # taken in part from miquel van smoorenburgs bcheckrc. # # 下面语句是定义变量下面语句是定义变量path,并把,并把pat

37、h变量声明为全局变量。变量声明为全局变量。 # set the path path=/bin:/sbin:/usr/bin:/usr/sbin export path # 下面命令读取配置数据,这里用到一个简单的下面命令读取配置数据,这里用到一个简单的if语句。语句。 # 判断判断/etc/sysconfig/network文件存在否,如果该文件存在,就文件存在否,如果该文件存在,就 执行它。执行它。 # 否则,给否则,给networking变量赋值,给变量赋值,给hostname变量赋值。变量赋值。 # read in config data. if -f /etc/sysconfig/ne

38、twork; then . /etc/sysconfig/network else networking=no hostname=localhost fi # 下面语句的功能是启用交换,执行下面语句的功能是启用交换,执行shell命令命令swapon。 # start up swapping. echo activating swap partitions swapon |a # 以下语句设置主机名。以下语句设置主机名。 # 下面语句引用下面语句引用hostname变量,执行变量,执行hostname命令。命令。 # set the hostname. hostname hostname ec

39、ho hostname: hostname # 下面语句设置下面语句设置nis域名,其中引用域名,其中引用nisdomain变量,执变量,执 行行shell命令命令domainname。 # set the nis domain name if -n nisdomain; then domainname nisdomain else domainname fi # 下面是一段简单的下面是一段简单的if语句,判断语句,判断/fsckoptions文件是否存在,文件是否存在, # 并定义并定义fsckoptions 变量。变量。 if -f /fsckoptions; then fsckoptio

40、ns=cat /fsckoptions else fsckoptions= fi # 下面是一段简单的下面是一段简单的if语句,判断语句,判断/fastboot文件是否不存在。文件是否不存在。 # 其中,引用其中,引用fsckoptions 变量,执行变量,执行shell语句语句fsck。 # 并引用系统变量并引用系统变量?,定义变量,定义变量rc,获取上一个,获取上一个shell语句的执行结语句的执行结 果。果。 if ! -f /fastboot; then echo checking root filesystems. fsck -v -a fsckoptions / rc=? # 以下

41、这段语句是检查文件系统的执行结果,以下这段语句是检查文件系统的执行结果, # 如果如果rc 大于大于1,说明文件系统有严重问题,并显示信息。,说明文件系统有严重问题,并显示信息。 # 其中,给环境变量其中,给环境变量ps1赋值,执行赋值,执行shell命令命令sulogin, # 执行执行shell命令命令umount a,执行,执行shell命令命令reboot。 # a return of 2 or higher means there were serious problems. if rc -gt 1; then echo echo echo * an error occurred d

42、uring the file system check. echo * dropping you to a shell; the system will reboot echo * when you leave the shell. ps1=(repair filesystem) #; export ps1 sulogin echo unmounting file systems umount a mount -n -o remount, ro/ echo automatic reboot in progress. reboot # 下面语句是嵌套的复合条件下面语句是嵌套的复合条件if语句,执

43、行语句,执行shell命令命令quotacheck elif rc=1 -a -x/sbin/quotacheck; then echo checking root filesystem quotas /sbin/quotacheck -v/ fi fi # 下面语句对根系统实行磁盘空间限定,执行下面语句对根系统实行磁盘空间限定,执行shell命令命令quotaon。 if -x/sbin/quotaon; then echo turning on user and group quotas for root filesystem /sbin/quotaon/ fi # 下面命令是设置下面命令

44、是设置pnp,首先检查参数,执行,首先检查参数,执行shell命令命令mount。 # 在在if语句中采用输出重定向,定义变量语句中采用输出重定向,定义变量pnp。 # check for arguments mount -t proc/proc/proc if grep -i nopnp/proc/cmdline/dev/null; then pnp= else pnp=yes fi # 以下语句设置以下语句设置pnp, 先使用一个简单先使用一个简单if语句语句,复合条件,并引用变复合条件,并引用变 量量pnp。 # 执行执行shell命令命令isapnp。 # set up pnp if

45、-x /sbin/isapnp -a -f /etc/isapnp.conf; then if -n pnp; then echo setting up isa pnp devices /sbin/isapnp/etc/isapnp.conf else echo skipping isa pnp configuration at users request fi fi # 下面命令重新下面命令重新mount根文件系统,执行根文件系统,执行shell命令命令mount # 如果如果/etc/hostname不存在,则把不存在,则把hostname变量变量 的值输出到的值输出到/etc/hostn

46、ame文件中。文件中。 # remount the root filesystem read-write. echo remounting root filesystem in read-write mode. mount -n -o remount,rw / if ! -f /etc/hostname; then echo hostname /etc/hostname fi # 清空清空/ etc/mtab文件文件 # clear mtab /etc/mtab # 执行执行shell命令,把命令,把/和和/proc文件系统加载上。文件系统加载上。 # enter root and /proc

47、 into mtab. mount -f / mount -f /proc # 如果如果/proc/ksyms文件存在文件存在, 定义变量定义变量usemodules为为y。 if -f /proc/ksyms; then usemodules=y else usemodules= fi # 下面命令是获取要执行的模块。下面命令是获取要执行的模块。 # 先执行先执行shell命令命令rm删除文件删除文件, 引用变量引用变量usemodules, # 并用并用set给位置变量强制赋值,引用系统变量给位置变量强制赋值,引用系统变量#,引用位置,引用位置 变量变量1, # 在在if语句中使用管道命令语句中使用管道命令,使用输出重定向。使用输出重定向。 # get the modules ready to go - we use awk here as cut is in /usr/bin rm -f /lib/modules/preferred if -n usemodules; then set cat /proc/cmdline while # -gt 0; do if echo 1|grep boot-image= /dev/null ; then # # # 中间略去部分语句中间略去部分语句 # # 下面语句初始化串口下面语句初始

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论