Shell 脚本编写

Shell

至操作系统的接口称为 shell。shell 是操作系统的最外层。shell 合并编程语言以控制进程和文件,

以及启动和控制其它程序。shell 通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的

任何结果输出来管理您与操作系统之间的交互。
shell 向您提供了与操作系统通信的方式。此通信以交互的方式(来自键盘的输入立即操作)或作为一

个 shell 脚本执行。shell 脚本是 shell 和操作系统命令的序列,它存储在文件中。
当您登录到系统中时,系统定位要执行的 shell 的名称。在它执行之后,shell 显示一个命令提示符。

此提示符通常是一个 $(美元符)。当您在提示符下输入命令并按下 Enter 键时,shell 对命令进行求

值,并尝试执行它。取决于您的命令说明,shell 将命令输出写到屏幕或重定向到输出。然后它返回命

令提示符,并等待您输入另一个命令。
命令行是您输入所在的行。它包含 shell 提示符。每行的基本格式如下:
$ 命令参数(一个或多个)
shell 视命令行的第一个字(直到第一个空白空格)为命令,所有后继字为自变量。
本章讨论以下内容:
? shell 功能
? Korn shell 或 POSIX shell 命令
? Korn shell 或 POSIX shell 中的引证
? Korn shell 或 POSIX shell 中的保留字
? Korn shell 或 POSIX shell 中的命令别名创建
? Korn shell 或 POSIX shell 中的参数替换
? Korn shell 或 POSIX shell 中的命令替换
? Korn shell 或 POSIX shell 中的算术求值
? Korn shell 或 POSIX shell 中的字段分割
? Korn shell 或 POSIX shell 中的文件名替换
? Korn shell 或 POSIX shell 中的输入和输出重定向
? Korn shell 或 POSIX shell 中的退出状态
? Korn shell 或 POSIX shell 命令
? Korn shell 或 POSIX shell 内置命令
? Korn shell 或 POSIX shell 的条件表达式
? Korn shell 或 POSIX shell 中的作业控制
? Korn shell 或 POSIX shell 中的直接插入编辑
? Korn shell 或 POSIX shell 内置命令的列表
? Bourne shell 内置命令的列表
? C shell 内置命令的列表
? Bourne shell
? C shell
? Bourne shell
? 受限 shell
? Bourne shell 命令
? Bourne shell 中的变量和文件名替换
? Bourne shell 中的输入和输出重定向
? C shell
? C shell 命令
? C shell 中的历史替换
? C shell 中的别名替换
? C shell 中的变量和文件名替换
? C shell 中的环境变量
? C shell 中的输入和输出重定向
? C shell 中的作业控制
shell 功能
通过 shell 与系统交互的主要优点如下:
? 文件名中的通配符替换(模式匹配)
通过指定要匹配的模式(而不是实际的文件名)对一组文件执行命令。
有关更多信息,请参阅以下内容:
o Korn shell 或 POSIX shell 中的文件名替换
o Bourne shell 中的文件名替换
o C shell 中的文件名替换
? 后台处理
设置运行时间很长的任务在后台运行,以释放终端用于并行交互式处理。
有关更多信息,请参阅以下章节中的 bg 命令:
o Korn shell 或 POSIX shell 中的作业控制
o C shell 内置命令
注:Bourne shell 不支持作业控制。
? 命令别名创建
给命令或短语一个别名。当 shell 在命令行上或 shell 脚本中遇到别名时,它替换别名引用的文本。
有关更多信息,请参阅以下内容:
o Korn shell 或 POSIX shell 中的命令别名创建
o C shell 中的别名替换
注:Bourne shell 不支持命令别名创建。
? 命令历史
将您输入的命令记录在历史文件中。可以使用此文件来轻松地访问、修改和重新发出任何列出的命令。
有关更多信息,请参阅以下章节中的 history 命令:
o Korn shell 或 POSIX shell 命令历史
o C shell 内置命令
o C shell 中的历史替换
注:Bourne shell 不支持命令历史。
? 文件名替换
使用模式匹配字符在命令行上自动产生文件名的列表。
有关更多信息,请参阅以下内容:
o Korn shell 或 POSIX shell 中的文件名替换
o Bourne shell 中的文件名替换
o C shell 中的文件名替换
? 输入和输出重定向
重定向输入,使不从键盘输入;重定向输出到一个文件或除终端外的设备。例如,程序的输入可以从文

件提供,并重定向到打印机或另一个文件。
有关更多信息,请参阅以下内容:
o Korn shell 或 POSIX shell 中的输入和输出重定向
o Bourne shell 中的输入和输出重定向
o C shell 中的输入和输出重定向
? 管道
将任何数目的命令链接在一起以形成复杂的程序。一个程序的标准输出成为下一个程序的标准输入。
有关更多信息,请参阅shell 术语中的流水线定义。
? shell 变量替换
存储用户定义的变量和预定义的 shell 变量中的数据。
有关更多信息,请参阅以下内容:
o Korn shell 或 POSIX shell 中的参数替换
o Bourne shell 中的变量替换
o C shell 中的变量替换
可用的 shell
操作系统提供了以下 shell:
? Korn shell(用 ksh 命令启动)
? Bourne shell(用 bsh 命令启动)
? 受限 shell(Bourne shell的受限版本,用 Rsh 命令启动)
? POSIX shell(也称为 Korn shell,并用 psh 命令启动)
? 缺省 shell(用 sh 命令启动)
? C shell(用 csh 命令启动)
? 可信 shell(Korn shell 的受限版本,用 tsh 命令启动)
? 远程 shell(用 rsh 命令启动)
登录 shell指当您登录到计算机系统时装入的 shell。您的登录 shell 在 /etc/passwd 文件中设置。

Korn shell是标准操作系统登录 shell,并向后与 Bourne shell 兼容(请参阅Bourne shell)。
缺省或标准 shell指链接到和用 /usr/bin/sh 命令启动的 shell。设置Bourne shell 为缺省 shell,

且它是 Korn shell 的子集。/usr/bin/sh 驻留为 Korn shell 的副本,它是 /usr/bin/ksh。因此,可

以替换 Korn shell 作为缺省 shell。POSIX shell,由 /usr/bin/psh 命令调用,驻留为到

/usr/bin/sh 命令的链接。
shell 术语
以下定义在理解 shell 时有帮助:
空白 空白是在 LC_CTYPE 类别中定义的空白字符类中的一个字符。在 POSIX shell 中,空白是

制表符或空格。
内置命令 shell 执行的命令,不对其进行搜索和创建一个独立的进程。
命令 shell 语言语法中的字符序列。shell 读每个命令,并直接地或通过调用独立的实用程序

来执行期望的操作。
注释 任何以磅符号(#)开始的字。该字和所有它后面的字符,直到下一个换行字符,都被忽略


标识 可移植字符集中的字母、数字或下划线序列,以字母或下划线开始。标识的第一个字符绝

不能是数字。标识用作别名、函数和命名参数的名称。
列表 通过以下符号之一分隔的一个或多个流水线的序列:分号(;)、和符号(&)、双和符号

(&&)或双栏(||)。列表可选地以下列某一符号结束:分号(;)、和符号(&)或栏和符号(| &)。
;
顺序地处理前面的流水线。shell 依次执行每个命令,并等待最近一个命令完成。
&
异步地处理前面的流水线。shell 依次执行每个命令,在后台处理流水线而不等待它完成。
|&
异步地处理前面的流水线,并建立到父 shell 的双向管道。shell 依次执行每个命令,在后台处理流水

线而不等待它完成。父 shell 可以是通过使用 read -p 和 print -p 命令从产生的命令的标准输入读

取或写入其标准输出。在任何给定时刻,只能有一个这样的命令活动。
&&
仅当前面的流水线返回出口值零(0)时,才处理跟在此符号后的列表。
||
仅当前面的流水线返回非零出口值时,才处理跟在此符号后的列表。
分号(;)、和符号(&)和栏和符号(|&)的优先级比双和符号(&&)和双栏(||)低。;、& 和 |& 符

号之间的优先级相等。&& 和 || 符号的优先级相等。可使用一个或多个换行字符而非分号来定界列表中

的两个命令。
注:|& 符号仅在 Korn shell 中有效。
元字符 每个元字符都对 shell 有特殊的含义,并导致字终止,除非引证它。元字符是:管道(

|)、和符号(&)、分号(;)、小于号(;)、左大括号(()、右大括号())、美元

符($)、反引号(`)、反斜杠 ()、右引号(')、双引号(")、换行字符、空格字符和制表符。所

有圈起在单引号之间的字符都认为是引证的,并被 shell 逐字地解释。如果没有引证,则将保留元字符

的特殊含义。(元字符在 C shell 中也称为解析器元字符。)
参数赋值列表 包含一个或多个 Identifier=Value 格式的字,其中等号(=)左右的空格必须平

衡。即,必须使用前导空白和末尾空白或无空白。
注:在 C shell 中,参数赋值列表的格式为 set Identifier = Value。需要在等号(=)左右有空格。
流水线 用管道(|)分隔的一个或多个命令的序列。流水线中的每个命令(最后一个命令可能除

外),作为独立的进程运行。但是,通过管道连接的每个命令的标准输出成为序列中下一个命令的标准

输入。如果列表用圆括号圈起,则它作为在一个独立的子 shell 中操作的简单命令执行。
如果保留字 ! 不加在流水线前,则退出状态将为流水线中指定的最后一个命令的退出状态。否则,退出

状态是最后一个命令的退出状态的逻辑“非”。换句话说,如果最后一个命令返回零,则退出状态将为

1。如果最后一个命令返回大于零,则退出状态将为零。
流水线的格式如下:
[!] command1 [ | command2 ...]
注:Bourne shell 的早期版本使用插入符 (^) 来表明管道。
shell 变量 将值指定给其的名称或参数 。通过输入变量名、等号(=),然后输入值来指定一

个变量。通过在变量名前加美元符($)来使其可替换指定的值。在为长路径名创建短标志法时变量特别

有用,如 $HOME 表示主目录。预定义的变量是其值由 shell 指定的变量。用户定义的变量是其值由用

户指定的变量。
简单命令 任何顺序的可选参数赋值列表和重定向的序列。可选地,后跟命令、字和重定向。它

们由 ;、|、&、| |、&&、|& 或换行字符终止。命令名作为参数 0 传递(当由 exec 子例程定义时)。

简单命令的值是它的退出状态零(如果它正常终止)或非零(如果它异常终止)。AIX 5L Version 5.2

Technical Reference: Base Operating System and Extensions Volume 2 中的 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

,请输入:
chmod u=rwx script1
按下 Enter 键。
3. 在命令行上输入脚本名称以运行 shell 脚本。要运行 script1 shell 脚本,请输入:
script1
按下 Enter 键。
注:如果在命令行上在 shell 脚本文件名前输入 shell 命令(ksh、bsh 或 csh),可以不使用 shell

脚本可执行就能运行它。例如,要在 Korn shell 的控制下运行名为 script1 的非可执行文件,请输入


ksh script1
指定脚本文件的 shell
当您在 Korn(POSIX shell)或 Bourne shell 中运行可执行文件 shell 脚本时,脚本中的命令在当前

shell(启动脚本的 shell)控制下执行,除非您指定不同的 shell。当您在 C shell 中运行可执行文

件的 shell 脚本时,脚本中的命令在 Bourne shell(/usr/bin/bsh)的控制下执行,除非您指定不同

的 shell。
通过将 shell 包含在 shell 脚本中,可以在特定 shell 中运行 shell 脚本。
要在特定 shell 下运行一个可执行文件 shell 脚本,在 shell 脚本的第一行上输入 #!Path,并按下

Enter 键。#! 字符标识文件类型。Path 变量指定运行 shell 脚本的 shell 的路径名。
例如,要在 Bourne shell 中运行 bsh 脚本,请输入:
#!/usr/bin/bsh
按下 Enter 键。
当您在 shell 脚本文件名前输入一个 shell 命令,则在命令行上指定的 shell 将覆盖在脚本文件本身

中指定的任何 shell。因此,请输入 ksh myfile 并按下 Enter 键在 Korn shell 控制下运行名为

myfile 的文件,即使 myfile 的第一行是 #!/usr/bin/csh。
Korn shell 或 POSIX shell 命令
Korn shell 是一个交互式命令解释器和命令编程语言。它符合计算机环境的可移植操作系统接口

(POSIX),一种操作系统的国际标准。POSIX 不是一个操作系统,而是一种标准,它针对源代码级别的

、很多系统间的应用程序的可移植性。POSIX 功能构建在 Korn shell 之上。Korn shell(也称为

POSIX shell)提供很多与 Bourne shell 和 C shell 相同的功能,如 I/O 重定向能力、变量替换以及

文件名替换。它还包含几个其它命令和编程语言功能:
算术求值 Korn shell 或 POSIX shell 可以通过使用内置 let 命令(使用任何从 2 到 36 的

基数)执行整数算术。Korn shell 或 POSIX shell 中的算术求值进一步描述此功能。

命令历史 Korn shell 或 POSIX shell 存储记录您输入的所有命令的文件。可以使用文本编辑

器来改变此历史文件中的命令,然后重新发出该命令。有关命令历史功能的更多信息,请参阅Korn

shell 或 POSIX shell 命令历史。

联合进程设施 使您能在后台运行程序,并发送信息到这些后台进程,及从这些后台进程接收信

息。有关更多信息,请参阅联合进程设施。

编辑 Korn shell 或 POSIX shell 提供直接插入编辑选项,使您能编辑命令行。类似 emacs、

gmacs 和 vi 的编辑器是可用的。Korn shell 或 POSIX shell 中的直接插入编辑进一步描述此功能。
Korn shell 命令是以下之一:
? 简单命令
? 流水线
? 列表
? 复合命令
? 函数
当您在 Korn shell 或 POSIX shell 中发出命令时,shell 对命令求值,并执行以下操作:
? 进行所有指示的替换。
? 确定命令是否包含 /。如果是,则 shell 运行由指定的路径名指定的程序。
如果命令不包含 /,则 Korn shell 或 POSIX shell 继续以下操作:
? 确定命令是否是特殊内置命令。如果是,则 shell 在当前 shell 进程中运行命令。
有关特殊内置命令的信息,请参阅“Korn shell 或 POSIX shell 内置命令”。
? 将命令与用户定义的函数作比较。如果命令与用户定义的函数匹配,则保存位置参数,然后复

位为函数调用的自变量。当函数完成或发出返回时,位置参数列表恢复,并且执行函数中 EXIT 上设置

的任何陷阱。函数的值是上次执行命令的值。函数在当前 shell 进程中执行。
? 如果命令名匹配常规内置命令的名称,则将调用该常规内置命令。
有关常规内置命令的信息,请参阅“Korn shell 或 POSIX shell 内置命令”。
? 创建进程并尝试通过使用 exec 命令执行命令(如果命令既不是内置命令也不是用户定义的函

数)。
Korn shell 或 POSIX shell 搜索指定路径中的每个目录,以查找可执行文件。PATH shell 变量定义包

含命令的目录的搜索路径。备用目录名称使用 : 分隔。缺省路径是 /usr/bin:(指定 /usr/bin 目录和

当前目录,以该顺序)。当前目录由两个或多个相邻的冒号,或在路径列表的开始或结尾的冒号指定。
如果文件具有执行许可权,但不是目录或 a.out 文件,则 shell 假定它包含 shell 命令。当前 shell

进程产生一个子 shell 来读文件。所有非导出的别名、函数和指定的参数从文件中除去。如果 shell

命令文件有读许可权,或者如果已在文件上设置了 setuid 或 setgid 位,则 shell 运行代理程序,该

代理程序设置许可权并且使用向下传递为打开文件的 shell命令文件执行 shell。加圆括号的命令在子

shell 中运行,而不除去非导出的数量。
本节讨论以下内容:
? Korn shell 复合命令
? Korn shell 函数
? Korn shell 或 POSIX shell 内置命令
? Korn shell 或 POSIX shell 的条件表达式
Korn shell 复合命令
复合命令可以是简单命令和流水线的列表,或者它可以用保留字开始。大多数时候,将在编写 shell 脚

本时使用复合命令,如 if、while 和 for。
Korn shell 或 POSIX shell 复合命令的列表
for Identifier [in Word ...] ;do List ;done
每次执行 for 命令时,Identifier 参数设置为下一个取自 in Word ... 列表的字。如果省略 in Word

... 命令,则 for 命令对于每个设置的位置参数执行一次 do List 命令。当列表中不再有字时执行结

束。有关位置参数的更多信息,请参阅“Korn shell 或 POSIX shell 中的参数替换”。

select Identifier [in Word ...] ;do List ;done
select 命令将指定的字集合打印在标准错误(文件描述符 2)上,每个字前有一个数字。如果省略 in

Word ... 命令,则改为使用位置参数。打印 PS3 提示符,并从标准输入读取行。如果此行由一个列出

的字的编号组成,则 Identifier 参数的值设置为对应于此编号的字。
如果从标准输入读取的行是空的,则再次打印选择列表。否则,Identifier 参数的值设置为空

。从标准输入读取的行的内容保存在 REPLY 参数中。为每个选择执行 List 参数,直到遇到中断或文件

结束符字符。有关位置参数的更多信息,请参阅“Korn shell 或 POSIX shell 中的参数替换”。

case Word in [[ ( ] Pattern [ | Pattern] ... ) List ;;] ... esac case 命令执行与匹配

Word 参数的第一个 Pattern 参数关联的 List 参数。模式的格式与用于文件名替换的格式相同。
if List ;then List [elif List ;then List] ... [;else List] ;fi List 参数指定要运行的

命令列表。shell 首先执行 if List 命令。如果返回零退出状态,则执行 then List 命令。否则,执

行由跟在 elif 命令后的 List 参数指定的命令。
如果由 elif List 命令中最后一个命令返回的值是零,则执行 then List 命令。如果由 then

List 命令中最后一个命令返回的值是零,则执行 else List 命令。如果没有由 List 参数指定的命令

为 else 或 then 命令执行,则 if 命令返回零退出状态。
while List ;do List ;done
until List ;do List ;done List 参数指定要运行的命令列表。while 命令重复地执行由 List

参数指定的命令。如果 while List 命令中最后命令的退出状态是零,则执行 do List 命令。如果

while List 命令中最后一个命令的退出状态非零,则循环终止。如果未执行 do List 中的命令,则

while 命令返回零退出状态。可能使用 until 命令代替 while 命令来否定循环终止测试。
( List)
List 参数指定要运行的命令列表。shell 在独立的环境中执行 List 参数。
注:如果需要两个相邻的左圆括号用于嵌套,则必须在它们之间插入一个空格,以区别命令与算术求值


{ List;}
List 参数指定要运行的命令列表。简单地执行 List 参数。
注:不同于元字符 ( ), { } 表示保留字(用于特殊目的,不作为用户声明的标识)。要识别这些保留

字,必须令其出现在一行的开始或在一个 ; 后。
[[Expression]] 求值 Expression 参数。如果表达式为真,则命令返回零退出状态。
function Identifier { List ;} 或 function Identifier () {List ;} 定义由 Identifier

参数引用的函数。函数的主体是由 { } 圈起的指定的命令列表。() 由两个运算符组成,因此将空白字

符与 identifier、( 和 ) 混在一起是允许的,但不是必需的。
time Pipeline
执行 Pipeline 参数。耗用时间、用户时间和系统时间打印到标准错误。
shell 启动
可以使用 ksh 命令、psh 命令(POSIX shell)或 exec 命令启动 Korn shell。
如果 shell 由 exec 命令启动,并且零自变量($0)的第一个字符是连字符(-),则假定该 shell 为

一个登录 shell。 shell 首先从 /etc/profile 文件读取命令,然后从当前目录中的 .profile 文件或

从 $HOME/.profile 文件(如果任一文件存在)读取命令。接下来,shell 从对 ENV 环境的值执行参数

替换所指定的文件(如果文件存在)读取命令。
如果在调用 Korn shell 或 POSIX shell 时指定 File [Parameter] 参数,则 shell 运行由 File 参

数标识的脚本文件,包含任何指定的参数。指定的脚本文件必须具有读许可权;忽略任何 setuid 和

setgid 设置。然后 shell 读取命令。
注:当调用 Korn shell 或 POSIX shell 时,不要使用 -c 或 -s 标志指定脚本文件。
有关位置参数的更多信息,请参阅Korn shell 或 POSIX shell 中的参数替换。
Korn shell 环境
在命令执行的开始时为命令知晓的所有变量(及其关联的值)组成其环境。此环境包含命令从其父进程

继承的变量和在调用命令的命令行上作为关键字参数指定的变量。shell 以几种方法与环境交互。当它

启动时,shell 扫描环境并为每个找到的名称创建参数,给参数相应的值并标记它以用于导出。执行的

命令继承该环境。
如果使用 export 或 typeset -x 命令修改 shell 参数的值或创建新值,则参数成为环境的一部分。因

此任何已执行命令看到的环境由最初由 shell 继承的“名称-值”对(其值可能被当前 shell 修改过)

加上由使用 export 或 typeset -x 命令产生的任何附加值组成。已执行的命令(子 shell)将看到它

对所继承环境变量进行的任何修改,但为了使其子 shell 或进程看到修改的值,子 shell 必须导出这

些变量。
任何简单命令或函数的环境都通过在前面加一个或多个参数赋值来更改。参数赋值自变量是

Identifier=Value 格式的字。因此,以下两个表达式是等价的(就命令的执行而言):
TERM=450 Command arguments
(export TERM; TERM=450; Command arguments)
Korn shell 函数
函数保留字定义 shell 函数。shell 以内部方式读和存储函数。别名在读取函数时解析。shell 以与执

行命令相同的方式执行函数,其中自变量作为位置参数传递。有关位置参数的更多信息,请参阅Korn

shell 或 POSIX shell 中的参数替换。
Korn shell 或 POSIX shell 在函数从中调用的环境中执行函数。所有以下内容由函数和调用脚本共享

,并可产生副作用:
? 变量值和属性(除非您在函数中使用 typeset 命令以声明一个本地变量)
? 工作目录
? 别名、函数定义和属性
? 特殊参数 $
? 打开文件
以下内容不在函数和调用脚本之间共享,并没有副作用:
? 位置参数。
? 特殊参数 #。
? 调用函数时变量赋值列表中的变量。
? 使用 typeset 命令在函数中声明的变量。
? 选项。
? 陷阱。但是,被调用脚本忽略的信号也将被函数忽略。
注:在 Korn shell 的早期版本中,除 EXIT 和 ERR 外的陷阱由函数和调用脚本共享。
如果 0 或 EXIT 上的陷阱在函数的主体内执行,则在函数完成后,在调用函数的环境中执行操作。如果

陷阱在函数的主体外执行,则在从 Korn shell 退出时执行操作。在 Korn shell 的早期版本中,函数

的主体外的 0 或 EXIT 上的陷阱不在从函数退出时执行。
当函数执行时,它有“Korn shell 或 POSIX shell 内置命令”中描述的相同的语法错误和变量赋值属

性。
无论何时将函数名指定为简单命令的名称,请执行复合命令。命令的操作数将在复合命令的执行期间暂

时成为位置参数。特殊参数 # 也将更改以反映操作数的号码。特殊参数 0 将不更改。
return 特殊命令用于从函数调用返回。函数中的错误将控制返回给调用程序。
函数标识使用 typeset 特殊命令的 -f 或 +f 选项列出。-f 选项还列出函数的文本。函数用 unset 特

殊命令的 -f 选项取消定义。
函数一般在 shell 执行 shell 脚本时取消设置。typeset 特殊命令的 -xf 选项允许函数导出到脚本,

这些脚本的执行没有 shell 的独立调用。必须在 shell 的独立调用间定义的函数应该在 ENV 文件中使

用 typeset 特殊命令的 -xf 选项定义。
如果函数没有成功声明,则该函数定义的退出状态为零。否则,它将大于零。函数调用的退出状态是由

函数执行的最近命令的退出状态。
Korn shell 或 POSIX shell 命令历史
Korn shell 或 POSIX shell 将从您的终端设备输入的命令保存到历史文件。如果设置,HISTFILE 变量

值是历史文件的名称。如果 HISTFILE 变量未设置或无法写,则使用的历史文件是 $HOME/.sh_history

。如果历史文件不存在,并且 Korn shell 无法创建它,或者它存在但 Korn shell 不具有附加到它的

许可权,则 Korn shell 使用临时文件作为历史文件。shell 使用具有相应的许可权的同一个历史文件

来访问所有交互式 shell 的命令。
缺省情况下,Korn shell 或 POSIX shell 保存从终端设备输入的最后 128 个命令的文本。历史文件大

小(由 HISTSIZE 变量指定)是没有限制的,尽管非常大的历史文件可能导致 Korn shell 启动很慢。
命令历史替换
使用 fc 内置命令列出或编辑历史文件的某些部分。要选择文件的一部分编辑或列出,请指定命令的号

码、第一个字符或头几个字符。可以指定单个命令或某一范围的命令。
如果不将编辑器程序指定为 fc 常规 shell 内置命令的自变量,则使用由 FCEDIT 变量指定的编辑器。

如果未定义 FCEDIT 变量,则使用 /usr/bin/ed 文件。当您退出编辑器时,已编辑的一个或多个命令打

印并运行。
编辑器名称连字符(-)用于跳过编辑阶段,并再次运行命令。在此情况下,可使用格式为 Old=New 的

替换参数在运行一个命令前修改它。例如,如果 r 是 fc -e - 的别名,则输入 r bad=good c 运行以

字母 c 开始的最近一个命令,并将第一个出现的 bad 字符串替换为 good 字符串。
有关使用历史 shell 命令的更多信息,请参阅列出先前输入的命令(history shell 命令)和《AIX 5L

V5.2 命令参考大全》中的 fc 命令。
Korn shell 或 POSIX shell 中的引证
当想要 Korn shell 或 POSIX shell 将字符作为常规字符(而没有任何通常关联的含义)读时,必须引

证它。要取消元字符的特殊含义,请使用下表的其中一个引证机制。
每个元字符对 shell 都有特殊含义(除非已引证)并导致字终止。Korn shell 或 POSIX shell 认为以

下字符是元字符,并且如果它们代表自己就必须已引证。
? 管道(|)
? 和符号(&)
? 分号(;)
? 小于号($lt;)和大于号(>;)
? 左圆括号(()和右圆括号())
? 美元符($)
? 反引号(`)和单引号(')
? 反斜杠 ()
? 双引号(")
? 换行字符
? 空格字符
? 制表符
引证机制是反斜杠 ()、单引号(')和双引号(")。
反斜杠 不引证的反斜杠 () 保留后面字符的文字值,除换行外。如果换行字符跟着反斜杠,则

shell 将它解释为行继续。
单引号 圈起在单引号( ' ')中的字符保留单引号中的每个字符的文字值。单引号不能出现在

单引号中。
反斜杠不能用于转义在单引号中设置的字符串的单引号。嵌入的引号可通过写创建,例如:'a'''b' 产

生 a'b。
双引号 在双引号(" ")中圈起字符保留双引号中的所有字符的文字值,除美元符、反引号和反

斜杠字符外,如下:
$
美元符保留其特殊含义:引入参数扩展,命令替换的格式和算术扩展。
在引证字符串中也以 $( 和匹配的 ) 圈起的输入字符将不受双引号的影响,但定义当展开字时其输出替

换 $(...) 的命令。
从圈起的 ${ 到匹配的 } 的字符串中,非转义的双引号或单引号必须是偶数个(如果有)。前面的反斜

杠字符必须用于转义文字 { 或 }.
`
反引号保留其特殊含义,引入命令替换的另一格式。引证字符串的一部分,从初始的反引号和字符直到

下一个前面没有反斜杠的反引号,定义当字展开时其输出替换 ` ... ` 的命令。

仅当后跟以下字符之一时,反斜杠保留其特殊含义(作为一个转义字符):$, `, ", 或换行字符。
双引号前必须有一个反斜杠,以包含在双引号中。当您使用双引号时,如果反斜杠后紧跟着将被解释为

有特殊含义的字符,则删除反斜杠,且逐字取后继字符。如果反斜杠不在具有特殊含义的字符之前,则

它保留在适当的位置不更改,且紧跟着它的字符也保留不更改。例如:
"$" ->; $
"a" ->; a
以下条件应用于 Korn 或 POSIX shell 中的元字符和引证字符:
? 当美元符、星号($*)和美元符, @ 符 ($@) 不被引证时,它们的含义在作为参数赋值使用时

或用作文件名时是相同的。
? 当用作命令自变量时,双引号、美元符、星号、双引号("$*")等价于 "$1d$2d...",其中 d

是 IFS 参数的第一个字符。
? 双引号, @ 符, 星号, 双引号("$@")等价于 "$1" "$2" ...。
? 内反斜杠(``)、反斜杠引证字符反斜杠 ()、单引号(')和美元符($)。如果反引号在双

引号(" ")中出现,则反斜杠也引证双引号字符。
? 参数和命令替换发生在双引号(" ")内。
? 通过引证保留字的任何字符除去保留字或别名的特殊含义。不能引证函数名或内置命令名。
Korn shell 或 POSIX shell 中的保留字
以下保留字对 shell 有特殊含义:
! case do
done elif else
esac fi for
function if in
select then time
until while {
} [[ ]]
保留字仅在它们不带引号出现时,以及字用作以下情况时才可识别:
? 命令的第一个字
? 跟在除 case、for 或 in 之外的某一保留字后的第一个字
? case 或 for 命令中的第三个字(在这种情况下,只有 in 有效)
Korn shell 或 POSIX shell 中的命令别名创建
Korn shell 或 POSIX shell 允许您创建别名以定制命令。alias 命令定义 Name=String 格式的字作为

别名。当将别名用作命令行的第一个字时,Korn shell 检查以查看它是否已经正在处理具有相同名称的

别名。如果是这样,Korn shell 不替换别名。如果具有相同名称的别名不在处理中,则 Korn shell 使

用别名的值替换别名。
别名的第一个字符可以是除元字符外的任何可打印字符。其余字符必须与对于有效标识的要求相同。替

换字符串可以包含任何有效的 shell 文本,包括元字符。
如果别名值的最后一个字符是空格,则 shell 还为别名替换检查别名后的字。可以使用别名来重新定义

特殊的内置命令,但不要重新定义保留字。别名定义不在 ksh 的调用间继承。但是,如果指定 alias

-x,则对于根据名称调用和不调用独立 shell 的脚本,别名仍然有效。要导出别名定义并使子进程对其

有访问权,则必须指定 alias -x,以及环境文件中的别名定义。
要创建、列出和导出别名,请使用 alias 命令。要除去别名,请使用 unalias 命令。
创建别名的格式如下:
alias Name=String
其中 Name 参数指定别名的名称,String 参数指定别名的值。
以下导出的别名是 Korn shell 预定义的,但可以取消设置或重新定义。不建议您更改它们,因为这可

能在以后给期望别名以 Korn shell 预定义方式工作的用户造成混淆。
autoload='typeset -fu'
false='let 0'
functions='typeset -f'
hash='alias -t'
history='fc -l'
integer='typeset -i'
nohup='nohup '
r='fc -e -'
true=':'
type='whence -v'
在 Korn shell(ksh)的非交互式调用上不支持别名;例如,在 shell 脚本中,或在 ksh 中使用 -c

选项,如下所示:
ksh -c alias
有关别名创建的更多信息,请参阅创建命令别名(alias shell 命令)和《AIX 5L V5.2 命令参考大全

》中的 alias 命令。
跟踪的别名
别名经常用作全路径名的速记。一个别名创建设施选项允许您将别名的值自动设置为对应命令的全路径

名。这种特殊类型的别名是跟踪的别名。通过省去 shell 搜索 PATH 变量以查找全路径名的需要,磁道

的别名提高了执行速度。
set -h 命令打开命令跟踪,这样每次引用命令,shell 将定义跟踪的别名的值。每次您复位 PATH 变量

,此值取消定义。
这些别名保留跟踪,这样下一个后继引用将重新定义值。几个跟踪的别名编译到 shell 中。
代字号替换
在 shell 执行别名替换后,它检查每个字以查看它是否以非引证的代字号 (~) 开始。如果是,则

shell 检查该字(直到第一个斜杠(/))以查看它是否与 /etc/passwd 文件中的用户名匹配。如果

shell 找到匹配,则它用匹配用户的登录目录替换 ~ 字符和名称。此过程称为代字号替换。
如果 shell 未找到匹配,则不更改原始文本。如果 ~ 字符是字中的唯一字符,或后跟加号(+)或连字

符(-),则 Korn shell 还进行特殊的替换:
~ 由 HOME 变量的值替换。
~+ 由 $PWD 变量(当前目录的全路径名)替换。
~- 由 $OLDPWD 变量(前一目录的全路径名)替换。
此外,当变量赋值参数的值以代字号 ~ 字符开始时,shell 将尝试代字号替换。
Korn shell 或 POSIX shell 中的参数替换
Korn shell 或 POSIX shell 使您能够进行参数替换。
本节讨论以下内容:
? Korn shell 中的参数
? 参数替换
? 预定义的特殊参数
? Korn shell 或 POSIX shell 设置的变量
? Korn shell 或 POSIX shell 使用的变量
Korn shell 中的参数
参数定义为以下:
? 任何字符星号(*), @ 符 (@), 磅符号(#), 问号(?), 连字符(-), 美元符($)和感

叹号(!)的标识。这些称为特殊参数。
? 数(位置参数)指示的自变量
? 标识指示的参数,具有一个值及零个或多个属性(命名的参数/变量)。
typeset 特殊内置命令将值和属性指定给命名参数。使用 typeset 特殊内置命令描述 Korn shell 支持

的属性。导出的参数将值和属性传递到环境。
命名参数的值通过如下指定:
Name=Value [ Name=Value ] ...
如果为 Name 参数设置了 -i 整数属性,则 Value 参数服从于算术求值。有关算术表达式求值的更多信

息,请参阅Korn shell 或 POSIX shell 中的算术求值。
shell 支持一维的数组程序。数组参数的元素通过下标引用。下标由用方括号 ([ ]) 圈起的算术表达式

指示。要将值指定给数组,使用 set -A Name Value ...。所有下标的值必须在 0 到 511 范围内。数

组不需要声明。任何对带有效下标的命名参数的引用都是合法的,且将创建一个数组(如有必要)。引

用没有下标的数组等价于引用元素 0。
用 set 特殊命令为位置参数指定值。当调用 shell 时从自变量 0 设置 $0 参数。$ 字符用于引入可由

数组替换的参数。
参数替换
以下是可替换的参数:
${Parameter} shell 读取从 ${ 到匹配的 } 之间的所有字符,作为同一个字的部分,即使该字

包含大括号或元字符。如果有,替换指定的参数的值。以下情况下大括号是必需的:当 Parameter 参数

后跟一个不被解释为其名称一部分的字母、数字或下划线时,或当一个命名的参数进行下标操作时。
如果指定的参数包含一个或多个数字,则它是一个位置参数。多个数字的位置参数必须圈起在大括号中

。如果变量的值是 * 或 @, 则替换每个以 $1 开始的位置参数(由字段分隔符字符分隔)。如果使用了

一个带下标 * 或 @ 的数组标识,则替换每个元素的值(用字段分隔符字符分隔)。
${#Parameter} 如果 Parameter 参数的值是 * 或 @, 则替换位置参数的数。否则,替换

Parameter 参数指定的长度。
${#Identifier
} 替换 Identifier 参数指定的数组中的元素数。
${Parameter:-Word} 如果设置了 Parameter 参数并且不为空,则替换其值;否则,替换 Word

参数的值。
${Parameter:=Word} 如果未设置 Parameter 参数或其为空,则将它设置为 Word 参数的值。不

能用这种方法指定位置参数。
${ParameterWord} 如果设置了 Parameter 参数并且它不为空,则替换其值。否则,打印 Word

变量的值并从 shell 退出。如果省略 Word 变量,则打印标准消息。
${Parameter:+Word} 如果设置了 Parameter 参数并且它不为空,则替换 Word 变量的值。
${Parameter#Pattern} | ${Parameter##Pattern} 如果指定的 shell Pattern 参数匹配

Parameter 参数的值的开始部分,则此替换的值是 Parameter 参数删除匹配部分后的值。否则,替换

Parameter 参数的值。在第一种格式中,删除最小匹配模式。在第二种格式中,删除最大匹配模式。
${Parameter%Pattern} | ${Parameter%%Pattern} 如果指定的 shell Pattern 匹配 Parameter

变量的值的结束部分,则此替换的值是 Parameter 变量删除匹配部分后的值。否则,替换 Parameter

变量的值。在第一种格式中,删除最小匹配模式;在第二种格式中,删除最大匹配模式。
在先前的表达式中,Word 变量不被求值,除非它用作替换的字符串。这样,在下例中,pwd 命令只在没

有设置 -d 标志或它为空时才执行:
echo ${d:-$(pwd)}
注:如果 : 从先前表达式中省略,则 shell 仅检查是否设置了 Parameter 参数。
预定义的特殊参数
以下参数由 shell 自动设置:
@ 展开位置参数,以 $1 开始。每个参数用一个空格分隔。
如果用 " 圈起 $@, 则 shell 认为每个位置参数是独立的字符串。如果不存在位置参数,则 shell 将

语句展开成没有引号的空字符串。
* 展开位置参数,以 $1 开始。shell 使用 IFS 参数值的第一个字符分隔每个参数。
如果用 " 圈起 $*,则 shell 在双引号中包含位置参数值。每个值由 IFS 参数的第一个字符分隔。
# 指定传递给 shell 的位置参数的数目(十进制),不计数 shell 步骤名称本身。这样 $# 参

数产生设置的最大编号位置参数的数目。此参数的一个主要使用是检查存在需要的自变量数目。
- 调用时或使用 set 命令向 shell 提供标志。
? 指定上次执行命令的出口值。其值是一个十进制字符串。大多数命令返回 0 以表明成功完成

。 shell 自己返回 $? 参数的当前值作为其出口值。
$ 标识 shell 的进程号。由于进程号在所有现有字符串中唯一,所以最多 5 个数字的此字符串

经常用于生成临时文件的唯一名称。
下例说明仅用于该目的的,在目录中创建临时文件的推荐示例:
temp=$HOME/temp/$$
ls >;$temp
.
.
.
rm $temp
! 指定最新调用的后台命令的进程号。
零(0) 展开 shell 或 shell 脚本名称。
Korn shell 或 POSIX shell 设置的变量
以下变量由 shell 设置:
下划线(_) 表示当在环境中传递时所执行的 shell 或脚本的最初绝对路径名。随后,指定前

一命令的最后一个自变量。此参数不为异步命令设置。此参数还用于保留检查邮件时匹配 MAIL 文件的

名称。
ERRNO 指定最新失败的子例程设置的值。此值是系统相关的,并旨在调试目的。
LINENO 指定执行的脚本或函数中的当前行的行号。
OLDPWD 表示 cd 命令设置的前一工作目录。
OPTARG 指定 getopts 常规内置命令处理的最后一个选项自变量的值。
OPTIND 指定 getopts 常规内置命令处理的最后一个选项自变量的索引。
PPID 标识父 shell 的进程号。
PWD 表示 cd 命令设置的当前工作目录。
RANDOM 生成随机整数,均一地分布在 0 和 32767 之间。随机数的序列可由指定数值给 RANDOM

变量初始化。
REPLY 没有提供自变量时,由 select 语句和 read 常规内置命令设置。
SECONDS 指定返回 shell 调用以来的秒数。如果为此变量指定一个值,则返回引用的值将是被

指定的值加指定以来的秒数。
Korn shell 或 POSIX shell 使用的变量
以下变量由 shell 使用:
CDPATH 表示 cd(更改目录)命令的搜索路径。
COLUMNS 为 shell 编辑方式和打印 select 列表定义编辑窗口的宽度。
EDITOR 如果此参数的值以 emacs、gmacs 或 vi 结束,并且 VISUAL 变量不是使用 set 特殊内

置命令设置的,则对应选项打开。
ENV 如果设置了此变量,则对值执行参数替换以生成当调用 shell 时将执行的脚本的路径名。

该文件通常用于别名和函数定义。
FCEDIT 为 fc 常规内置命令指定缺省编辑器名称。
FPATH 指定函数定义的搜索路径。当引用具有 -u 标志的函数时和未找到命令时,将搜索此路径

。如果找到可执行文件,则在读和在当前环境中读和执行它。
HISTFILE 如果在调用 shell 时设置此变量,则值是将用于存储命令历史的文件的路径名。
HISTSIZE 如果在调用 shell 时设置此变量,则先前输入的 shell 可访问的命令的数将大于或

等于该数。缺省值是 128。
HOME 表示您的登录目录的名称,该目录在登录完成后成为当前目录。登录程序初始化此变量。

cd 命令将 $HOME 参数的值用作其缺省值。在 shell 步骤中使用此变量(而非一个显式路径名)允许步

骤从不同的目录运行而无须改动。
IFS 指定 IFS(内部字段分隔符)(通常是空格、制表符和换行),用于分隔由命令替换或参数

替换产生的命令字,及用于分隔常规内置命令 read 使用的字。IFS 参数的第一个字符用于分隔 $* 替

换的自变量。
LANG 为 LC_* 变量提供缺省值。
LC_ALL 重设 LANG 和 LC_* 变量的值。
LC_COLLATE 确定模式匹配中的范围表达式的行为。
LC_CTYPE 定义字符分类、大小写转换和其它字符属性。
LC_MESSAGES 确定写消息的语言。
LINES 确定打印选择列表的列长度。选择垂直打印的列表,直到填充了 LINES 变量指定的约三

分之二行。
MAIL 指定邮件系统用于检测新邮件到达的文件路径名。如果此变量设置为邮件文件的名称并且

MAILPATH 变量未设置,则 shell 通知用户指定文件中的新邮件。
MAILCHECK 指定 shell 多久(以秒计)检查由 MAILPATH 或 MAIL 变量指定的任何文件的修改

时间的更改。缺省值是 600 秒。当时间过去后,shell 在发出下一提示符前检查。
MAILPATH 指定由冒号分隔的文件名的列表。如果设置了此变量,则 shell 通知用户指定文件的

任何修改,该修改发生在由 MAILCHECK 变量指定的周期(以秒计)期间。每个文件名可后跟 ? 和将打

印的消息。消息将经历变量替换,$_ 变量定义为已更改的文件的名称。缺省消息是 you have mail in

$_。
NLSPATH 为处理 LC_MESSAGES 确定消息编目的位置。
PATH 表示命令的搜索路径,它是由冒号分隔的目录路径名的有序列表。当 shell 查找命令时,

它以指定的顺序搜索这些目录。列表中任何位置的空字符串代表当前目录。
PS1 指定用作主系统提示符的字符串。为参数替换展开此参数的值,以定义主提示符字符串,缺

省情况下是 $。主提示符字符串中的 ! 字符由命令号替换。
PS2 指定次提示符字符串的值,缺省情况下是 >;。
PS3 指定 select 循环中使用的选择提示符字符串的值,缺省情况下是 #?。
PS4 为参数替换展开此变量的值,并且它先于执行跟踪的每一行。如果省略,则执行跟踪提示符

是 +。
SHELL 指定保留在环境中的 shell 的路径名。
SHELL PROMPT 当交互地使用时,shell 在读命令前提示 PS1 参数的值。如果任何时候输入新行

并且 shell 需要进一步输入以完成命令,则 shell 发出次提示符(PS2 参数)。
TMOUT 指定在退出前 shell 等待不活动的秒数。如果 TMOUT 变量设置为一个大于零(0)的值

,则在发出 PS1 提示符后未在指示的秒数内输入命令,shell 退出。(请注意,shell 可以使用不能超

过此值的最大边界来编译。)
注:在超时周期到期后,shell 退出前有 60 秒暂停。
VISUAL 如果该变量的值以 emacs、gmacs 或 vi 结束,则打开对应选项。
shell 将缺省值给 PATH、PS1、PS2、MAILCHECK、TMOUT 和 IFS 参数,但是 HOME、SHELL、ENV 和

MAIL 参数不是由 shell 设置的(虽然 HOME 参数是由 login 命令设置的)。
Korn shell 或 POSIX shell 中的命令替换
Korn shell 或 POSIX shell 使您能够进行命令替换。
在命令替换中,shell 在子 shell 环境中执行指定的命令并用其输出替换该命令。要在 Korn shell 或

POSIX shell 中执行命令替换,请执行以下命令:
$(command)
或者,对于反引号的版本,使用:
`command`
注:尽管 ksh 接受反引号的语法,但是 X/Open Portability Guide Issue 4 和 POSIX 标准认为它过

时。这些标准建议可移植应用程序使用 $(command) 语法。
shell 通过在子 shell 环境中执行 command 并用命令的标准输出替换命令替换(command 的文本加圈

起 $( ) 或反引号),在替换的结束除去一个或多个换行字符的序列来展开命令替换。
在下例中,圈起命令的 $( ) 表示 whoami 命令的输出被替换:
echo My name is: $(whoami)
可以使用以下命令执行同一个命令替换:
echo My name is: `whoami`
用户 dee 的两个示例的输出是:
My name is: dee
还可以通过将它们圈起在 ( ) 中替换算术表达式。例如,命令:
echo Each hour contains $((60 * 60)) seconds
产生以下结果:
Each hour contains 3600 seconds
当执行命令替换时,Korn shell 或 POSIX shell 除去所有末尾换行字符。例如,如果您的当前目录包

含 file1、file2 和 file3 文件,则命令是:
echo $(ls)
除去换行字符并产生以下输出:
file1 file2 file3
要保留换行字符,请将替换的命令插入 " " 中:
echo "$(ls)"
Korn shell 或 POSIX shell 中的算术求值
Korn shell 或 POSIX shell 常规内置 let 命令使您能够执行整数算术。常数格式为 [Base]Number。

Base 参数是 2 到 36(包括 2 和 36)之间的十进制数,代表算术基数。Number 参数是以此为基数的

一个数。如果省略 Base 参数,则 shell 使用基数 10。
算术表达式使用与 C 语言相同的语法、优先权和表达式关联性。支持所有的整数运算符,除双加号(++

)、双连字符(--)、问号、冒号(?:)和逗号(,)外。下表以优先权递减顺序列出有效的 Korn

shell 或 POSIX shell 运算符:
运算符 定义
- 一元减号
! 逻辑非
~ 按位非
* 乘法
/ 除法
% 余数
+ 加法
- 减法
<;>; 左移、右移
<=,>;=, <>;, ==, != 比较
& 按位“与”
^ 按位“异”
| 按位“或”
&& 逻辑“与”
|| 逻辑“或”
= *=, /=, &= +=, -=, <<=, >; >;=&=, ^=, |= 赋值
许多算术运算符,如 *、&、< 和 >;,对 Korn shell 或 POSIX shell 有特殊的含义。必须在这些字符

上加引号。例如,要用 5 乘 y 的当前值,并将新值重新指定给 y,请使用表达式:
let "y = y * 5"
用引号圈起表达式将除去 * 字符的特殊含义。
可以在 let 命令表达式中分组操作以强制分组。例如,在表达式中:
let "z = q * (z - 10)"
命令用 z 的减少的值乘 q。
如果只求值一个表达式,则 Korn shell 或 POSIX shell 包含 let 命令的备用格式。shell 将以 ((

)) 圈起的命令作为引证的表达式处理。因此,表达式:
((x = x / 3))
等价于:
let "x = x / 3"
命名的参数在算术表达式中根据名称引用,不使用参数替换语法。当引用命名的参数时,其值求值为一

个算术表达式。
使用 typeset 特殊内置命令的 -i 标志指定命名参数的内部整数表示法。使用 -i 标志,算术求值对每

个对命名参数的赋值的值执行。如果不指定算术基数,则参数的第一个赋值确定算术基数。参数替换发

生时使用此基数。
Korn shell 或 POSIX shell 中的字段分割
在执行命令替换后,Korn shell 扫描替换的结果,以查找在 IFS(内部字段分隔符)变量中找到的那些

字段分隔符字符。在找到这样字符的地方,shell 将替换分割为不同的自变量。shell 保留显式空自变

量("" 或 '')并除去隐式空自变量(由不具有值的参数的产生的自变量)。
? 如果 IFS 的值是空格、制表符和换行字符,或如果未设置,则输入的开始或结束处的任何空

格、制表符和换行字符的序列都将被忽略,并且输入中的那些字符的任何序列都将定界字段。例如,以

下输入产生两个字段,school 和 days:
;;;school;;days;
? 否则,如果 IFS 的值非空,则以下规则应用于序列。IFS 空白用于指在 IFS 值中的空白字符

的任何序列(零个或多个实例)(例如,如果 IFS 包含 space/comma/tab,则任何空格或制表符的序列

都认为是 IFS 空白)。
1. IFS 空白在输入的开始和结束处忽略。
2. 输入中每个非 IFS 空白的 IFS 字符,以及任何相邻的 IFS 空白,定界一个字段。
3. 非零长度 IFS 空白定界字段。
Korn shell 或 POSIX shell 中的文件名替换
Korn shell 或 POSIX shell 扫描由 Word 变量指定的每个命令字对某些字符执行文件名替换。如果命

令字包含 *、? 或 [ 字符,且未设置 -f 标志,则 shell 将字当作模式。shell 用与该模式匹配的文

件名替换字,并根据当前语言环境中的有效整理序列排序。如果 shell 未找到与模式匹配的文件名,则

它不更改字。
当 shell 将一个模式用作文件名替换时,. 和 / 字符必须显式地匹配。
注:Korn shell 在模式匹配的其它实例中不特别地对待这些字符。
这些模式匹配字符表示以下替换:
* 匹配任何字符串,包括空字符串。
? 匹配任何单个字符。
[...] 匹配任一圈起的字符。由 - 分隔的字符对匹配该对包含范围中词典编纂地任何字符,根

据当前语言环境中的有效整理序列。如果跟在开始 [ 后的第一个字符是一个 !,则匹配任何未圈起的字

符。可以通过将 - 置为第一个字符或最后一个字符而使其包含在字符集中。
还可以使用 [] 标志法来匹配指示范围中的文件名。此格式指示系统匹配属于 class 类的任何单个字符

。哪些字符组成一个特定字符类的定义呈现在 setlocale 子例程的 LC_CTYPE 类别中。识别当前语言环

境中指定的所有字符类。
一些字符类的名称如下:
? alnum
? alpha
? cntrl
? digit
? graph
? lower
? print
? punct
? space
? upper
? xdigit
例如, [[]] 匹配任何大写字母。
Korn shell 支持基于整理元素、符号或等价类的文件名扩展。
PatternList 是一个或多个彼此用 | 分隔的模式的列表。组合模式使用以下一个或多个形成:
?(PatternList) 可选地匹配任何一个给定的模式
*(PatternList) 匹配给定模式的零个或多个出现
+(PatternList) 匹配给定模式的一个或多个出现
@(PatternList) 精确地匹配一个给定模式
!(PatternList) 匹配除一个给定模式外的任何模式
模式匹配具有一些限制。如果文件名的第一个字符是点(.),则它只能由也以点开头的模式匹配。例如

,* 匹配文件名 myfile 和 yourfile,而不匹配文件名 .myfile 和 .yourfile。要匹配这些文件,请

使用诸如以下的模式:
.*file
如果模式不匹配任何文件名,则模式本身被作为尝试的匹配的结果返回。
文件和目录不应包含字符 *, ?, -, [ 或 ], 因为它们可以在模式匹配尝试期间导致无限递归(即,无

限循环)。
引证除去
存在于原始字中的引证字符反斜杠 ()、单引号(')和双引号(")将被除去,除非它们本身已引证。
Korn shell 或 POSIX shell 中的输入和输出重定向
Korn shell 在执行命令前,扫描命令行中以查找重定向字符。这些特殊的符号指定 shell 以重定向输

入和输出。重定向字符可以在一个简单命令中的任何位置出现,或者可以出现在命令之前或之后。它们

不传递到调用的命令。
shell 在使用 Word 或 Digit 参数前执行命令和参数替换,除非另有说明。仅当模式与单个文件匹配且

不执行空白解释时,文件名替换才发生。
>;Word 将 Word 参数指定的文件用作标准输出(文件描述符 1)。如果文件不存在,则 shell

将创建它。如果文件存在并且 noclobber 选项打开,则导致错误;否则,文件截断成零长度。
>;|Word 与 >;Word 命令相同,除了该重定向语句覆盖 noclobber 选项。
>; >;Word 使用 Word 参数指定的文件作为标准输出。如果文件当前存在,则 shell 将输出附

加到文件(通过首先查找文件结束符字符)。如果文件不存在,则 shell 将创建它。
<>;Word 打开 Word 参数指定的文件,以作为标准输出读写。
<

行。shell 不对指定的文件执行参数替换、命令替换或文件名替换。结果文档(称为 here 文档)成为

标准输入。有关 here 文档的更多信息,请参阅“使用直接插入输入(Here)文档”。如果 Word 参数

的任何字符已引证,则不对文档的字符执行解释。
here 文档被视为在下一换行字符后开始,一直继续到有仅包含定界符的行的单个字,没有尾部空白字符

。然后下一个 here 文档(如果有)开始。格式如下:
[n]< here document
delimiter
如果引证了 word 中的任何字符,则通过除去 word 上引证字符形成定界符。here 文档行将不展开。否

则,定界符是 word 自身。如果 word 中没有引证字符,则 here 文档的所有行将被展开,以进行参数

扩展、命令替换和算术扩展。
shell 执行重定向数据的参数替换。要防止 shell 解释 , $ 和单引号(')字符以及 Word 参数的第

一个字符,在字符前加一个 字符。
如果附加 - 到 <>;&Digit 在 Digit 参数指定的文件描述符中复制标准输出
>;&- 关闭标准输出
>;&p 将输出从联合进程移动到标准输出
如果这些重定向选项的某一个之前有一个数字,则引用的文件描述符号由数字指定(而不是缺省值 0 或

1)。在下例中,shell 打开文件描述符 2,以写为文件描述符 1 的副本。
... 2>;&1
指定重定向的顺序是有意义的。在求值时,shell 根据 (FileDescriptor, File) 关联求值每个重定向

。例如,在语句中:
... 1>;File 2>;&1
文件描述符 1 与 File 参数指定的文件关联。shell 将文件描述符 2 和与文件描述符 1(File)关联

的文件关联。如果重定向的顺序被反向,则文件描述符 2 将与终端关联(假定文件描述符 1 以前与终

端关联),而文件描述符 1 将与 File 参数指定的文件关联。
如果命令后跟一个和符号(&)且作业控制不活动,则命令的缺省标准输入是空文件 /dev/null。否则,

命令执行的环境包含输入和输出规范所修改的调用 shell 的文件描述符。
有关重定向的更多信息,请参阅输入和输出重定向。
联合进程设施
Korn shell 或 POSIX shell 允许您运行一个或多个命令作为后台进程。这些从 shell 脚本运行的命令

称为联合进程。
通过将 |& 运算符放置在命令后来指定联合进程。命令的标准输入和输出都通过管道传递到您的脚本。
联合进程必须满足以下限制:
? 在每个消息的结尾包含换行字符
? 将每个输出消息发送给标准输出
? 在每个消息后清除其标准输出
下例演示输入如何传递给联合进程和从联合进程返回:
echo "Initial process"
./FileB.sh |&
read -p a b c d
echo "Read from coprocess: $a $b $c $d"
print -p "assed to the coprocess"
read -p a b c d
echo "assed back from coprocess: $a $b $c $d"
FileB.sh
echo "The coprocess is running"
read a b c d
echo $a $b $c $d
结果标准输出如下:
Initial process
Read from coprocess: The coprocess is running
Passed back from coprocess: Passed to the coprocess
要写入联合进程,请使用 print -p 命令。要从联合进程读取,请使用 read -p 命令。
重定向联合进程输入和输出
联合进程的标准输入和输出通过使用 I/O 重定向重新指定给一个带号码的文件描述符。例如,命令:
exec 5>;&p
将联合进程的输入移动到文件描述符 5。
该操作完成之后,可以使用标准重定向语法,将命令输出重定向到联合进程。还可以启动另一个联合进

程。两个联合进程的输出都连接到同一个管道,并使用 read -p 命令读。要停止联合进程,请输入:
read -u5
Korn shell 或 POSIX shell 中的退出状态
shell 检测到的错误(如语法错误)会导致 shell 返回非零退出状态。否则,shell 返回上次命令执行

的退出状态。shell 通过打印命令或函数名和错误情况报告检测到的运行时错误。如果发生错误的行号

大于 1,则行号还打印在命令或函数名后的 [ ](方括号)中。
对于非交互式 shell,特殊内置或其它类型命令遇到的错误将导致 shell 写如以下表中显示的诊断消息


错误 特殊内置 其它实用程序
shell 语言语法错误 将退出 将退出
实用程序语法错误(选项或操作数错误) 将退出 将不退出
重定向错误 将退出 将不退出
变量赋值错误 将退出 将不退出
扩展错误 将退出 将退出
命令未找到 不适用 可能退出
点脚本未找到 将退出 不适用
如果任何显示为“将(可能)退出”的错误在子 shell 中发生,则子 shell 将(可能)退出并有非零

状态,但是包含子 shell 的脚本由于错误将不退出。
在表中显示的所有情况中,交互式 shell 将在不退出的情况下写诊断消息到标准错误。
Korn shell 或 POSIX shell 内置命令
特殊命令内置在 Korn shell 和 POSIX shell 中,并在 shell 进程中执行。除非另有指示,否则输出

被写入文件描述符 1,并且如果命令不包含任何语法错误则退出状态为零(0)。允许输入和输出重定向

。有两种类型的内置命令,特殊内置命令和常规内置命令。
特殊内置命令与常规内置命令的差异如下:
? 特殊内置命令中的语法错误可能导致执行命令的 shell 结束。如果在常规内置命令中有语法

错误则这不会发生。如果特殊内置命令中的语法错误不结束 shell,则出口值为非零。
? 使用特殊内置命令指定的变量赋值在命令完整后保留有效。
? I/O 重定向在参数赋值后处理。
此外,跟在 export、readonly 和 typeset 特殊命令后、采用参数赋值格式的字使用与参数赋值相同的

规则展开。代字号替换在 = 后执行,不执行字分割和文件名替换。
有关这些命令的字母顺序列表,请参考Korn shell 或 POSIX shell 内置命令的列表
特殊内置命令描述
Korn shell 提供以下特殊内置命令:

: eval newgrp shift
. exec readonly times
break exit return trap
continue export set typeset
unset
: [Argument ...] 仅展开自变量。它在需要命令时使用,如在 if 命令的 then 条件中,但命

令不执行任何操作。
. File [Argument ...] 读完整的指定文件,然后执行命令。命令在当前 shell 环境中执行。

由 PATH 变量指定的搜索路径用于查找包含指定文件的目录。如果指定了任何自变量,则它们将成为位

置参数。否则,不更改位置参数。退出状态是最近一条执行的命令的退出状态。有关位置参数的更多信

息,请参考Korn shell 或 POSIX shell 中的参数替换。
注:在执行任何命令前,.File [Argument ...] 命令读整个文件。因此,文件中的 alias 和 unalias

命令不适用于文件中指定的任何函数。
break [n] 从封闭的 for、while、until 或 select 循环退出(如果存在)。如果您指定 n 参

数,则命令中断由 n 参数指定的级别号。n 的值是任何等于或大于 1 的整数。
continue [n] 继续封闭的 for、while 或 until 或 select 循环的下一个迭代。如果您指定 n

变量,则命令在第 n 个封闭循环处继续。n 的值是任何等于或大于 1 的整数。
eval [Argument ...] 将指定的自变量作为输入读入 shell,并执行(一个或多个)结果命令。
exec [Argument ...] 代替此 shell 执行自变量指定的命令(不创建新进程)。输入和输出自

变量可出现并影响当前进程。如果不指定自变量,则 exec 命令修改输入和输出重定向列表所指示的文

件描述符。在这种情况下,使用此机制打开的任何大于 2 的文件描述符号在调用另一个程序时关闭。
exit [n] 退出由 n 参数指定其退出状态的 shell。n 参数必须是范围 0-255 的无符号十进制

整数。如果省略 n 参数,则退出状态是执行最近命令的退出状态。文件结束符字符也退出 shell,除非

set 特殊命令的 ignoreeof 选项打开。

export -p [Name[= Value]] ... 为自动导出到后续执行的命令的环境标记指定的名称。
-p 将所有导出的变量的名称和值以下面的格式写到标准输出:
"export %s= %sn", ; ;
newgrp [Group] 等价于 exec/usr/bin/newgrp [Group] 命令。
注:此命令不返回。
readonly -p [Name[= Value]] ... 将 Name 参数指定的名称标记为只读。这些名称无法由后继

赋值更改。
-p 将所有导出的变量的名称和值以下面的格式写到标准输出:
"export %s= %sn", ; ;
return [n] 使 shell 函数返回到调用脚本。返回状态由 n 变量指定。如果省略 n 变量,则返

回状态是执行最近命令的返回状态。如果在函数或脚本外调用 return 命令,则它与 exit 命令相同。
set [+ |-abCefhkmnostuvx ] [+ |-o Option]... [+ |-A Name] [Argument ...] 如果未指定

选项或自变量,则 set 命令以当前语言环境的整理序列写所有 shell 变量的名称和值。当指定了选项

时,它们将设置或取消设置 shell 的属性,描述如下:
-A
数组赋值。取消设置 Name 参数,并从指定的 Argument 参数列表顺序地指定值。如果使用了 +A 标志

,则首先不取消设置 Name 参数。
-a
自动导出定义的所有后继参数。
-b
异步地通知用户后台作业的完成。
-C
等价于 set -o noclobber。
-e
执行 ERR 陷阱(如果设置),并且如果命令具有非零退出状态则退出。读概要文件时此方式禁用。
-f
禁用文件名替换。
-h
当第一次遇到时,将每个命令指定为跟踪的别名。
-k
将所有参数赋值自变量都放入命令的环境,而不只是命令名前的那些自变量。
-m
在独立的进程中运行后台作业,并在完成后打印行。后台作业的退出状态在完成消息中报告。在具有作

业控制的系统上,此标志为交互式 shell 自动打开。有关更多信息,请参阅Korn shell 或 POSIX

shell 中的作业控制。
-n
读命令并检查其语法错误,但不执行它们。对于交互式 shell 忽略此标志。
-o Option
打印当前选项设置和错误消息(如果没有指定自变量)。可在单个 ksh 命令行上设置多个选项。如果使

用了 +o 标志,则取消设置指定的选项。当指定了自变量时,它们将导致设置或取消设置位置参数。由

Option 变量指定的自变量可为以下之一:
allexport
同 -a 标志。
bgnice
以较低的优先级运行所有后台作业。这是缺省方式。
emacs
为命令条目输入 emacs 样式直接插入编辑器。
errexit
同 -e 标志。
gmacs
为命令条目输入 gmacs 样式直接插入编辑器。
ignoreeof
当遇到文件结束符字符时不退出 shell。要退出 shell,必须使用 exit 命令,或按下 Ctrl-D 按键序

列超过 11 次。
keyword
同 -k 标志。
注:此标志仅用于与 Bourne shell 的反向兼容性。强烈反对其使用。
markdirs
将 / 附加到作为文件名替换结果的所有目录名。
monitor
同 -m 标志。
noclobber
阻止重定向截断现有文件。当指定此选项时,必须在重定向符号后跟垂直栏(>;|)以截断文件。
noexec
同 -n 标志。
noglob
同 -f 标志。
nolog
阻止 .profile 和 $ENV 文件中的函数定义保存在历史文件中。
nounset
同 -u 标志。
privileged
同 -p 标志。

trackall
同 -h 标志。
verbose
同 -v 标志。
vi
为命令条目输入 vi- 样式直接插入编辑器的插入方式。输入转义字符 033 将编辑器置于移动方式。返

回发送行。
viraw
在每个字符以 vi 方式输入时处理它。
xtrace
同 -x 标志。
-p
禁用 $HOME/.profile 文件的处理,并使用 /etc/suid _profile 文件,而非 ENV 文件。当有效的用户

标识(UID)或组标识(GID)不等于实际的 UID 或 GID 时,此方式启用。关闭此选项将 UID 或 GID

设置为实际的 UID 和 GID。
注:由于操作系统不支持 setuid shell 脚本,所以系统不支持 -p 选项。
-s
按词典编纂的方式排序位置参数。
-t
在读和执行一个命令后退出。
注:此标志仅用于与 Bourne shell 的反向兼容性。强烈反对其使用。
-u
替换时将取消设置参数作为错误处理。
-v
读 shell 输入行时打印它们。
-x
执行命令及其自变量时打印它们。
-
关闭 -x 和 -v 标志,并停止检查自变量的标志。
--
阻止更改任何标志。在将 $1 参数设置为以 - 开头的值时,此选项有用。如果没有自变量跟在此标志后

,则不设置位置参数。
在任何 set 命令标志前加 +(而不是 -)关闭标志。在调用 shell 时可以使用这些标志。标志的当前

设置可以在 $- 参数中找到。除非指定 -A 标志,否则剩余的自变量是位置参数,且按顺序指定为 $1、

$2、...,等等。如果没有给出自变量,则所有命名参数的名称和值都打印到标准输出。
shift [n] 重命名位置参数,以 $n+1 ... 到 $1 ... 开始。n 参数的缺省值是 1。n 参数是求

值为小于或等于 $# 参数的非负数的任何算术表达式。
times 打印 shell 和从 shell 运行的进程的累加用户和系统次数。
trap [Command] [Signal] ... 当 shell 接收到指定的(一个或多个)信号时运行指定的命令

。Command 参数在设置陷阱时读一次,在采用陷阱时读一次。Signal 参数可作为数字或信号的名称给出

。陷阱命令以信号号码的顺序执行。在当前 shell 的入口上忽略的信号上设置陷阱的任何尝试都是无效

的。
如果命令是 -,则所有的陷阱复位为其原始值。如果省略命令且第一个信号是数字信号号码,则 ksh 命

令将 Signal 参数的值复位成原始值。
注:如果省略命令且第一个信号是符号名,则将信号解释成一个命令。
如果 Signal 参数的值是 ERR 信号,则无论何时命具令有非零退出状态时都执行指定的命令。如果信号

是 DEBUG,则在每个命令后执行指定的命令。如果 Signal 参数的值是 0 或 EXIT 信号,且 trap 命令

在函数主体内执行,则在函数完成后执行指定的命令。如果 Signal 参数是 0 或 EXIT(对于在任何函

数外设置的 trap 命令),则在从 shell 退出时执行指定的命令。没有自变量的 trap 命令打印与每个

信号号码关联的命令列表。
有关 Signal 参数值的完整列表(不带 SIG 前缀在 trap 命令中使用),请参阅 AIX 5L Version 5.2

Technical Reference: Base Operating System and Extensions Volume 2 中的 sigaction、sigvec

或 signal 子例程。

typeset [+HLRZfilrtux [n]] [Name[= Value]] ... 设置 shell 参数的属性和值。当在函数内

调用时,将创建 Name 参数的一个新实例。函数完成时恢复参数值和类型。可以使用 typeset 命令指定

以下标志:
-H
在非 AIX 机器上提供“AIX 至主机文件”映射。
-L
左对齐并从 Value 参数中除去前导空白。如果 n 参数具有非零值,则它定义字段的宽度;否则,它由

其第一个赋值的值的宽度确定。当指定了参数时,它用空白向右填充,或截断(如有必要)以适合字段

的长度。如果同时设置了 -Z 标志,则除去前导零。-R 标志关闭。
-R
右对齐并用前导空白填充。如果 n 参数具有非零值,则它定义字段的宽度;否则,它由其第一个赋值的

值的宽度确定。如果重新指定参数,则字段仍用空白填充,并从末尾截断。L 标志关闭。
-Z
如果第一个非空白字符是数字且未设置 -L 标志,则右对齐并用前导零填充。如果 n 参数具有非零值,

则它定义字段的宽度;否则,它由其第一个赋值的值的宽度确定。
-f
表示名称指函数名称,而不是参数名称。不能进行赋值,并且仅有的其它有效标志是 -t、-u 和 -x。-t

标志打开此函数的执行跟踪。-u 标志使此函数被标记为未定义。当函数被引用时,搜索 FPATH 变量以

查找函数定义。-x 标志允许函数定义在不是 ksh 命令的独立调用的 shell 脚本中保持有效。
-i
将参数标识为整数,使算术更快速。如果 n 参数具有非零值,则它定义输出算术基数;否则,第一个赋

值确定输出基数。
-l
将所有大写字符转换成小写。-u 大写转换标志关闭。
-r
将 Name 参数指定的名称标记为只读。这些名称无法被后继赋值更改。
-t
标记命名的参数。标记可由用户定义,并对 shell 无特殊含义。
-u
将所有小写字符转换成大写字符。-l 小写标志关闭。
-x
为自动导出到后续执行的命令的环境标记由 Name 指定的名称。
使用 + 而不是 - 关闭 typeset 命令标志。如果不指定 Name 参数但指定标志,则打印有这些标志的参

数的名称(以及值(可选地))列表。(使用 + 而不是 - 阻止打印值。)如果未指定任何名称或标志

,则打印所有参数的名称和属性。
unset [-fv ] Name ... 取消设置由名称列表给定的参数的值和属性。如果指定了 -v,则 Name

指变量名,且 shell 将取消设置它,并将它从环境中除去。无法取消设置只读变量。取消设置 ERRNO、

LINENO、MAILCHECK、OPTARG、OPTIND、RANDOM、SECONDS、TMOUT 和下划线(_)变量除去它们的特殊含

义,即使随后指定它们。
如果设置了 -f 标志,则 Name 指函数名,且 shell 将取消设置函数定义。
常规内置命令描述
Korn shell 提供以下常规内置命令:

alias fg print ulimit
bg getopts pwd umask
cd jobs read unalias
command kill setgroups wait
echo let test whence
fc
alias [-t ] [-x ] [AliasName[= String]] ... 创建或重新定义别名定义,或将现有别名定义

写到标准输出。
有关更多信息,请参阅《AIX 5L V5.2 命令参考大全》中的 alias 命令。

bg [JobID...] 将每个指定作业置于后台。如果未指定 JobID 参数,则当前作业置于后台。有

关作业控制的更多信息,请参阅Korn shell 或 POSIX shell 中的作业控制。
有关在后台运行作业的更多信息,请参阅《AIX 5L V5.2 命令参考大全》中的 bg 命令。

cd [Argument]
cd Old New 此命令可以是两种格式之一。在第一种格式中,它将当前目录更改到由 Argument

参数指定的目录。如果 Argument 参数的值是 -,则目录更改到前一个目录。HOME shell 变量是

Argument 参数的缺省值。PWD 变量设置为当前目录。
CDPATH shell 变量定义包含 Argument 参数值的目录的搜索路径。备用目录名称由 : 分隔。缺省路径

为空,指定当前目录。当前目录由一个空路径名指定,它紧跟在等号之后或出现在路径列表中冒号定界

符之间的任何位置。如果指定的自变量以 / 开始,则不使用搜索路径。否则,为自变量搜索路径中的每

个目录。
cd 命令的第二种格式在当前目录名(PWD)中,用由 New 变量指定的字符串替换由 Old 变量指定的字

符串,并尝试更改到该新目录。
command [-p ] CommandName [Argument ...]
command [-v | -V ] CommandName 使 shell 将指定的命令和自变量作为简单命令处理,禁止

shell 函数查找。
有关更多信息,请参考《AIX 5L V5.2 命令参考大全》中的 command 命令。

echo [String ...] 将字符串写入标准输出。有关用法和描述,请参考 echo 命令。不支持 -n

标志。

fc [-r ] [-e Editor] [First [Last]]
fc -l [-n ] [-r ] [First [Last]]
fc -s [Old= New] [First] 显示命令历史文件的内容,或调用编辑器以修改和重新执行以前在

shell 中输入的命令。
有关更多信息,请参考《AIX 5L V5.2 命令参考大全》中的 fc 命令。
fg [JobID] 将每个指定的作业置于前台。如果未指定任何作业,命令将当前作业置于前台。
有关在前台运行作业的更多信息,请参考《AIX 5L V5.2 命令参考大全》中的 fg 命令。

getopts OptionString Name [Argument ...] 检查合法选项的 Argument 参数。
有关更多信息,请参考《AIX 5L V5.2 命令参考大全》中的 getopts 命令。

jobs [-l | -n | -p ] [JobID ...] 显示在当前 shell 环境中启动的作业的状态。如果未使用

JobID 参数指定特定作业,则显示所有活动作业的状态信息。如果报告了作业终止,则 shell 从当前

shell 环境识别的进程标识列表中除去该作业的进程标识。
有关更多信息,请参考《AIX 5L V5.2 命令参考大全》中的 jobs 命令。


kill [ -s { SignalName | SignalNumber } ] ProcessID... 发送一个信号(缺省情况下,

SIGTERM 信号)到正在运行的进程。此缺省操作正常地停止进程。如果要

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/52450/viewspace-974906/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/52450/viewspace-974906/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux shell脚本编写 YAML(YAML Ain't Markup Language)主要用于配置文件和数据交换,它以其简洁和易读的格式而受欢迎。在shell脚本中使用YAML,可以方便地存储和管理配置信息,尤其是当涉及到复杂的数据结构或跨脚本共享设置时。 以下是使用shell脚本编写YAML的基本步骤: 1. **引入支持**:在bash脚本中,可以直接使用`yq`工具(一个轻量级的YAML处理命令行实用程序)来解析、创建和更新YAML内容。如果系统中没有安装,可以通过包管理器(如`apt-get`或`yum`)进行安装。 ```bash sudo apt-get install yq # 对于Ubuntu或Debian ``` 2. **创建YAML文件**:在shell脚本中,可以使用`echo`指令写入YAML格式的数据到文件。例如: ```bash cat << EOF > my_config.yaml key1: value1 key2: - value2.1 - value2.2 EOF ``` 3. **解析YAML**:使用`yq`执行操作,如读取、更新或删除YAML中的值: ```bash # 读取特定键的值 value=$(yq r my_config.yaml key1) # 更新值 yq e '(.key1) |= "new_value"' my_config.yaml # 插入新条目 yq w -i my_config.yaml "key3: value3" ``` 4. **错误处理**:确保在处理YAML时进行错误检查,因为YAML文件格式必须正确才能被解析。 5. **脚本化**:将上述步骤封装成函数或脚本,以便在需要时重复使用或传递参数。 相关问题: 1. 在哪些场景下会使用shell脚本处理YAML? 2. 如何在shell脚本中验证YAML文件的格式是否正确? 3. 有没有其他的命令行工具可以替代`yq`用于处理YAML?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值