Shell 脚本编写.docx

上传人:b****6 文档编号:7806819 上传时间:2023-01-26 格式:DOCX 页数:38 大小:49.13KB
下载 相关 举报
Shell 脚本编写.docx_第1页
第1页 / 共38页
Shell 脚本编写.docx_第2页
第2页 / 共38页
Shell 脚本编写.docx_第3页
第3页 / 共38页
Shell 脚本编写.docx_第4页
第4页 / 共38页
Shell 脚本编写.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

Shell 脚本编写.docx

《Shell 脚本编写.docx》由会员分享,可在线阅读,更多相关《Shell 脚本编写.docx(38页珍藏版)》请在冰豆网上搜索。

Shell 脚本编写.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1