Shell 脚本编写.docx
- 文档编号:7806819
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:38
- 大小:49.13KB
Shell 脚本编写.docx
《Shell 脚本编写.docx》由会员分享,可在线阅读,更多相关《Shell 脚本编写.docx(38页珍藏版)》请在冰豆网上搜索。
Shell脚本编写
Shell脚本编写
===========================================================
Shell
至操作系统的接口称为shell。
shell是操作系统的最外层。
shell合并编程语言以控制进程和文件,
以及启动和控制其它程序。
shell通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的
任何结果输出来管理您与操作系统之间的交互。
shell向您提供了与操作系统通信的方式。
此通信以交互的方式(来自键盘的输入立即操作)或作为一
个shell脚本执行。
shell脚本是shell和操作系统命令的序列,它存储在文件中。
当您登录到系统中时,系统定位要执行的shell的名称。
在它执行之后,shell显示一个命令提示符。
此提示符通常是一个$(美元符)。
当您在提示符下输入命令并按下Enter键时,shell对命令进行求
值,并尝试执行它。
取决于您的命令说明,shell将命令输出写到屏幕或重定向到输出。
然后它返回命
令提示符,并等待您输入另一个命令。
命令行是您输入所在的行。
它包含shell提示符。
每行的基本格式如下:
$命令参数(一个或多个)
shell视命令行的第一个字(直到第一个空白空格)为命令,所有后继字为自变量。
本章讨论以下内容:
?
shell功能
?
Kornshell或POSIXshell命令
?
Kornshell或POSIXshell中的引证
?
Kornshell或POSIXshell中的保留字
?
Kornshell或POSIXshell中的命令别名创建
?
Kornshell或POSIXshell中的参数替换
?
Kornshell或POSIXshell中的命令替换
?
Kornshell或POSIXshell中的算术求值
?
Kornshell或POSIXshell中的字段分割
?
Kornshell或POSIXshell中的文件名替换
?
Kornshell或POSIXshell中的输入和输出重定向
?
Kornshell或POSIXshell中的退出状态
?
Kornshell或POSIXshell命令
?
Kornshell或POSIXshell内置命令
?
Kornshell或POSIXshell的条件表达式
?
Kornshell或POSIXshell中的作业控制
?
Kornshell或POSIXshell中的直接插入编辑
?
Kornshell或POSIXshell内置命令的列表
?
Bourneshell内置命令的列表
?
Cshell内置命令的列表
?
Bourneshell
?
Cshell
?
Bourneshell
?
受限shell
?
Bourneshell命令
?
Bourneshell中的变量和文件名替换
?
Bourneshell中的输入和输出重定向
?
Cshell
?
Cshell命令
?
Cshell中的历史替换
?
Cshell中的别名替换
?
Cshell中的变量和文件名替换
?
Cshell中的环境变量
?
Cshell中的输入和输出重定向
?
Cshell中的作业控制
shell功能
通过shell与系统交互的主要优点如下:
?
文件名中的通配符替换(模式匹配)
通过指定要匹配的模式(而不是实际的文件名)对一组文件执行命令。
有关更多信息,请参阅以下内容:
oKornshell或POSIXshell中的文件名替换
oBourneshell中的文件名替换
oCshell中的文件名替换
?
后台处理
设置运行时间很长的任务在后台运行,以释放终端用于并行交互式处理。
有关更多信息,请参阅以下章节中的bg命令:
oKornshell或POSIXshell中的作业控制
oCshell内置命令
注:
Bourneshell不支持作业控制。
?
命令别名创建
给命令或短语一个别名。
当shell在命令行上或shell脚本中遇到别名时,它替换别名引用的文本。
有关更多信息,请参阅以下内容:
oKornshell或POSIXshell中的命令别名创建
oCshell中的别名替换
注:
Bourneshell不支持命令别名创建。
?
命令历史
将您输入的命令记录在历史文件中。
可以使用此文件来轻松地访问、修改和重新发出任何列出的命令。
有关更多信息,请参阅以下章节中的history命令:
oKornshell或POSIXshell命令历史
oCshell内置命令
oCshell中的历史替换
注:
Bourneshell不支持命令历史。
?
文件名替换
使用模式匹配字符在命令行上自动产生文件名的列表。
有关更多信息,请参阅以下内容:
oKornshell或POSIXshell中的文件名替换
oBourneshell中的文件名替换
oCshell中的文件名替换
?
输入和输出重定向
重定向输入,使不从键盘输入;重定向输出到一个文件或除终端外的设备。
例如,程序的输入可以从文
件提供,并重定向到打印机或另一个文件。
有关更多信息,请参阅以下内容:
oKornshell或POSIXshell中的输入和输出重定向
oBourneshell中的输入和输出重定向
oCshell中的输入和输出重定向
?
管道
将任何数目的命令链接在一起以形成复杂的程序。
一个程序的标准输出成为下一个程序的标准输入。
有关更多信息,请参阅shell术语中的流水线定义。
?
shell变量替换
存储用户定义的变量和预定义的shell变量中的数据。
有关更多信息,请参阅以下内容:
oKornshell或POSIXshell中的参数替换
oBourneshell中的变量替换
oCshell中的变量替换
可用的shell
操作系统提供了以下shell:
?
Kornshell(用ksh命令启动)
?
Bourneshell(用bsh命令启动)
?
受限shell(Bourneshell的受限版本,用Rsh命令启动)
?
POSIXshell(也称为Kornshell,并用psh命令启动)
?
缺省shell(用sh命令启动)
?
Cshell(用csh命令启动)
?
可信shell(Kornshell的受限版本,用tsh命令启动)
?
远程shell(用rsh命令启动)
登录shell指当您登录到计算机系统时装入的shell。
您的登录shell在/etc/passwd文件中设置。
Kornshell是标准操作系统登录shell,并向后与Bourneshell兼容(请参阅Bourneshell)。
缺省或标准shell指链接到和用/usr/bin/sh命令启动的shell。
设置Bourneshell为缺省shell,
且它是Kornshell的子集。
/usr/bin/sh驻留为Kornshell的副本,它是/usr/bin/ksh。
因此,可
以替换Kornshell作为缺省shell。
POSIXshell,由/usr/bin/psh命令调用,驻留为到
/usr/bin/sh命令的链接。
shell术语
以下定义在理解shell时有帮助:
空白空白是在LC_CTYPE类别中定义的空白字符类中的一个字符。
在POSIXshell中,空白是
制表符或空格。
内置命令shell执行的命令,不对其进行搜索和创建一个独立的进程。
命令shell语言语法中的字符序列。
shell读每个命令,并直接地或通过调用独立的实用程序
来执行期望的操作。
注释任何以磅符号(#)开始的字。
该字和所有它后面的字符,直到下一个换行字符,都被忽略
。
标识可移植字符集中的字母、数字或下划线序列,以字母或下划线开始。
标识的第一个字符绝
不能是数字。
标识用作别名、函数和命名参数的名称。
列表通过以下符号之一分隔的一个或多个流水线的序列:
分号(;)、和符号(&)、双和符号
(&&)或双栏(||)。
列表可选地以下列某一符号结束:
分号(;)、和符号(&)或栏和符号(|&)。
;
顺序地处理前面的流水线。
shell依次执行每个命令,并等待最近一个命令完成。
&
异步地处理前面的流水线。
shell依次执行每个命令,在后台处理流水线而不等待它完成。
|&
异步地处理前面的流水线,并建立到父shell的双向管道。
shell依次执行每个命令,在后台处理流水
线而不等待它完成。
父shell可以是通过使用read-p和print-p命令从产生的命令的标准输入读
取或写入其标准输出。
在任何给定时刻,只能有一个这样的命令活动。
&&
仅当前面的流水线返回出口值零(0)时,才处理跟在此符号后的列表。
||
仅当前面的流水线返回非零出口值时,才处理跟在此符号后的列表。
分号(;)、和符号(&)和栏和符号(|&)的优先级比双和符号(&&)和双栏(||)低。
;、&和|&符
号之间的优先级相等。
&&和||符号的优先级相等。
可使用一个或多个换行字符而非分号来定界列表中
的两个命令。
注:
|&符号仅在Kornshell中有效。
元字符每个元字符都对shell有特殊的含义,并导致字终止,除非引证它。
元字符是:
管道(
|)、和符号(&)、分号(;)、小于号(<)、大于号(>;)、左大括号(()、右大括号())、美元
符($)、反引号(`)、反斜杠()、右引号(')、双引号(")、换行字符、空格字符和制表符。
所
有圈起在单引号之间的字符都认为是引证的,并被shell逐字地解释。
如果没有引证,则将保留元字符
的特殊含义。
(元字符在Cshell中也称为解析器元字符。
)
参数赋值列表包含一个或多个Identifier=Value格式的字,其中等号(=)左右的空格必须平
衡。
即,必须使用前导空白和末尾空白或无空白。
注:
在Cshell中,参数赋值列表的格式为setIdentifier=Value。
需要在等号(=)左右有空格。
流水线用管道(|)分隔的一个或多个命令的序列。
流水线中的每个命令(最后一个命令可能除
外),作为独立的进程运行。
但是,通过管道连接的每个命令的标准输出成为序列中下一个命令的标准
输入。
如果列表用圆括号圈起,则它作为在一个独立的子shell中操作的简单命令执行。
如果保留字!
不加在流水线前,则退出状态将为流水线中指定的最后一个命令的退出状态。
否则,退出
状态是最后一个命令的退出状态的逻辑“非”。
换句话说,如果最后一个命令返回零,则退出状态将为
1。
如果最后一个命令返回大于零,则退出状态将为零。
流水线的格式如下:
[!
]command1[|command2...]
注:
Bourneshell的早期版本使用插入符(^)来表明管道。
shell变量将值指定给其的名称或参数。
通过输入变量名、等号(=),然后输入值来指定一
个变量。
通过在变量名前加美元符($)来使其可替换指定的值。
在为长路径名创建短标志法时变量特别
有用,如$HOME表示主目录。
预定义的变量是其值由shell指定的变量。
用户定义的变量是其值由用
户指定的变量。
简单命令任何顺序的可选参数赋值列表和重定向的序列。
可选地,后跟命令、字和重定向。
它
们由;、|、&、||、&&、|&或换行字符终止。
命令名作为参数0传递(当由exec子例程定义时)。
简单命令的值是它的退出状态零(如果它正常终止)或非零(如果它异常终止)。
AIX5LVersion5.2
TechnicalReference:
BaseOperatingSystemandExtensionsVolume2中的sigaction、sigvec
或signal子例程包含信号退出状态值的列表。
子shell作为登录shell或当前shell的子shell运行的shell。
通配符也称为模式匹配字符。
shell将它们与指定的值关联。
基本通配符是?
*,[set]和
[!
set].通配符在执行文件名替换时特别有用。
字不包含任何空白的字符序列。
字用一个或多个元字符分隔。
创建和运行shell脚本
shell脚本提供简单的方法来执行单调的命令、大的或复杂序列的命令和例程任务。
shell脚本是包含
一个或多个命令的文件。
当您输入shell脚本文件的名称时,系统执行文件包含的命令序列。
可以使用文本编辑器创建一个shell脚本。
您的脚本可以同时包含操作系统命令和shell内置命令。
以下步骤是写shell脚本的一般准则:
1.使用文本编辑器,创建和保存文件。
可以在shell脚本文件中包含任何shell和操作系统
命令的组合。
按照约定,不为许多用户设置使用的shell脚本存储在$HOME/bin目录中。
注:
操作系统不支持shell脚本中的setuid或setgid子例程。
2.使用chmod命令仅允许所有者运行(或执行)该文件。
例如,如果将您的文件名为script1
,请输入:
chmodu=rwxscript1
按下Enter键。
3.在命令行上输入脚本名称以运行shell脚本。
要运行script1shell脚本,请输入:
script1
按下Enter键。
注:
如果在命令行上在shell脚本文件名前输入shell命令(ksh、bsh或csh),可以不使用shell
脚本可执行就能运行它。
例如,要在Kornshell的控制下运行名为script1的非可执行文件,请输入
:
kshscript1
指定脚本文件的shell
当您在Korn(POSIXshell)或Bourneshell中运行可执行文件shell脚本时,脚本中的命令在当前
shell(启动脚本的shell)控制下执行,除非您指定不同的shell。
当您在Cshell中运行可执行文
件的shell脚本时,脚本中的命令在Bourneshell(/usr/bin/bsh)的控制下执行,除非您指定不同
的shell。
通过将shell包含在shell脚本中,可以在特定shell中运行shell脚本。
要在特定shell下运行一个可执行文件shell脚本,在shell脚本的第一行上输入#!
Path,并按下
Enter键。
#!
字符标识文件类型。
Path变量指定运行shell脚本的shell的路径名。
例如,要在Bourneshell中运行bsh脚本,请输入:
#!
/usr/bin/bsh
按下Enter键。
当您在shell脚本文件名前输入一个shell命令,则在命令行上指定的shell将覆盖在脚本文件本身
中指定的任何shell。
因此,请输入kshmyfile并按下Enter键在Kornshell控制下运行名为
myfile的文件,即使myfile的第一行是#!
/usr/bin/csh。
Kornshell或POSIXshell命令
Kornshell是一个交互式命令解释器和命令编程语言。
它符合计算机环境的可移植操作系统接口
(POSIX),一种操作系统的国际标准。
POSIX不是一个操作系统,而是一种标准,它针对源代码级别的
、很多系统间的应用程序的可移植性。
POSIX功能构建在Kornshell之上。
Kornshell(也称为
POSIXshell)提供很多与Bourneshell和Cshell相同的功能,如I/O重定向能力、变量替换以及
文件名替换。
它还包含几个其它命令和编程语言功能:
算术求值Kornshell或POSIXshell可以通过使用内置let命令(使用任何从2到36的
基数)执行整数算术。
Kornshell或POSIXshell中的算术求值进一步描述此功能。
命令历史Kornshell或POSIXshell存储记录您输入的所有命令的文件。
可以使用文本编辑
器来改变此历史文件中的命令,然后重新发出该命令。
有关命令历史功能的更多信息,请参阅Korn
shell或POSIXshell命令历史。
联合进程设施使您能在后台运行程序,并发送信息到这些后台进程,及从这些后台进程接收信
息。
有关更多信息,请参阅联合进程设施。
编辑Kornshell或POSIXshell提供直接插入编辑选项,使您能编辑命令行。
类似emacs、
gmacs和vi的编辑器是可用的。
Kornshell或POSIXshell中的直接插入编辑进一步描述此功能。
Kornshell命令是以下之一:
?
简单命令
?
流水线
?
列表
?
复合命令
?
函数
当您在Kornshell或POSIXshell中发出命令时,shell对命令求值,并执行以下操作:
?
进行所有指示的替换。
?
确定命令是否包含/。
如果是,则shell运行由指定的路径名指定的程序。
如果命令不包含/,则Kornshell或POSIXshell继续以下操作:
?
确定命令是否是特殊内置命令。
如果是,则shell在当前shell进程中运行命令。
有关特殊内置命令的信息,请参阅“Kornshell或POSIXshell内置命令”。
?
将命令与用户定义的函数作比较。
如果命令与用户定义的函数匹配,则保存位置参数,然后复
位为函数调用的自变量。
当函数完成或发出返回时,位置参数列表恢复,并且执行函数中EXIT上设置
的任何陷阱。
函数的值是上次执行命令的值。
函数在当前shell进程中执行。
?
如果命令名匹配常规内置命令的名称,则将调用该常规内置命令。
有关常规内置命令的信息,请参阅“Kornshell或POSIXshell内置命令”。
?
创建进程并尝试通过使用exec命令执行命令(如果命令既不是内置命令也不是用户定义的函
数)。
Kornshell或POSIXshell搜索指定路径中的每个目录,以查找可执行文件。
PATHshell变量定义包
含命令的目录的搜索路径。
备用目录名称使用:
分隔。
缺省路径是/usr/bin:
(指定/usr/bin目录和
当前目录,以该顺序)。
当前目录由两个或多个相邻的冒号,或在路径列表的开始或结尾的冒号指定。
如果文件具有执行许可权,但不是目录或a.out文件,则shell假定它包含shell命令。
当前shell
进程产生一个子shell来读文件。
所有非导出的别名、函数和指定的参数从文件中除去。
如果shell
命令文件有读许可权,或者如果已在文件上设置了setuid或setgid位,则shell运行代理程序,该
代理程序设置许可权并且使用向下传递为打开文件的shell命令文件执行shell。
加圆括号的命令在子
shell中运行,而不除去非导出的数量。
本节讨论以下内容:
?
Kornshell复合命令
?
Kornshell函数
?
Kornshell或POSIXshell内置命令
?
Kornshell或POSIXshell的条件表达式
Kornshell复合命令
复合命令可以是简单命令和流水线的列表,或者它可以用保留字开始。
大多数时候,将在编写shell脚
本时使用复合命令,如if、while和for。
Kornshell或POSIXshell复合命令的列表
forIdentifier[inWord...];doList;done
每次执行for命令时,Identifier参数设置为下一个取自inWord...列表的字。
如果省略inWord
...命令,则for命令对于每个设置的位置参数执行一次doList命令。
当列表中不再有字时执行结
束。
有关位置参数的更多信息,请参阅“Kornshell或POSIXshell中的参数替换”。
selectIdentifier[inWord...];doList;done
select命令将指定的字集合打印在标准错误(文件描述符2)上,每个字前有一个数字。
如果省略in
Word...命令,则改为使用位置参数。
打印PS3提示符,并从标准输入读取行。
如果此行由一个列出
的字的编号组成,则Identifier参数的值设置为对应于此编号的字。
如果从标准输入读取的行是空的,则再次打印选择列表。
否则,Identifier参数的值设置为空
。
从标准输入读取的行的内容保存在REPLY参数中。
为每个选择执行List参数,直到遇到中断或文件
结束符字符。
有关位置参数的更多信息,请参阅“Kornshell或POSIXshell中的参数替换”。
caseWordin[[(]Pattern[|Pattern]...)List;;]...esaccase命令执行与匹配
Word参数的第一个Pattern参数关联的List参数。
模式的格式与用于文件名替换的格式相同。
ifList;thenList[elifList;thenList]...[;elseList];fiList参数指定要运行的
命令列表。
shell首先执行ifList命令。
如果返回零退出状态,则执行thenList命令。
否则,执
行由跟在elif命令后的List参数指定的命令。
如果由elifList命令中最后一个命令返回的值是零,则执行thenList命令。
如果由then
List命令中最后一个命令返回的值是零,则执行elseList命令。
如果没有由List参数指定的命令
为else或then命令执行,则if命令返回零退出状态。
whileList;doList;done
untilList;doList;doneList参数指定要运行的命令列表。
while命令重复地执行由List
参数指定的命令。
如果whi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Shell 脚本编写 脚本 编写