Bourne shell

来源:互联网 发布:软件工具箱下载 编辑:程序博客网 时间:2024/05/29 17:28
Bourne shell

Bourne shell 是交互式命令解释器和命令编程语言。

bsh 命令运行 Bourne shell。

Bourne shell 可以作为登录 shell 或登录 shell 下的子 shell 运行。只有 login 命令可以将Bourne shell 调用为登录 shell。它通过使用特殊格式的 bsh 命令名 -bsh来实现。当调用时带有初始连字符(-),shell 会首先读取并运行在系统 /etc/profile 文件和用户的 $HOME/.profile文件中找到的命令(如果有)。/etc/profile 文件设置所有用户需要的变量。最后,shell 准备好从标准输入读取命令。

如果启动 Bourne shell 时指定了 File [Parameter] 参数,那么 shell 会运行由 File参数标识的脚本文件,包含所有指定的参数。所指定的脚本文件必须具有读许可权;所有 setuid 和 setgid 设置都会被忽略。然后shell 读取命令。如果使用 -c 或 -s 标志,那么不要指定脚本。

● Bourne shell 环境

在命令执行的开始时为命令知晓的所有变量(及其关联的值)组成其环境。此环境包含命令从其父进程继承的变量和在调用命令的命令行上作为关键字参数指定的变量。

shell 向其子进程传递作为内置 export 命令的自变量命名的变量。此命令将命名的变量同时放置在 shell 及其所有将来的子进程的环境中。

关键字参数是以赋值的格式出现的“变量 - 值”对,通常在命令行的过程名之前(但另见 set 命令的标志)。这些变量将放置在所调用的过程的环境中。
请参阅以下示例:

● 考虑显示两个变量的值(保存在名为 key_command 的命令文件中)的以下过程:

# key_command
echo $a $b

以下命令行产生显示为如下的输出:

Input Output
a=key1 b=key2 key_command key1 key2
a=tom b=john key_command tom john

过程的关键字参数不包含在 $# 中存储的参数计数中。

过程可以访问其环境中的任何变量的值。但是,如果它更改任何这些值,那么更改将不在 shell 环境中反映。更改对于正在讨论的过程是本地的。要将更改放置在进程传递到其子进程的环境中,那么必须导出该进程中的新值。
请参阅以下示例:

● 要获取可从当前 shell 导出的变量的列表,请输入以下命令:

export

● 要获取当前 shell 中的只读变量的列表,请输入以下命令:

readonly

● 要获取当前环境中的“变量-值”对的列表,请输入以下命令:

env

有关用户环境的更多信息,请参阅 /etc/environment 文件。
受限 shell

受限 shell 用于设置登录名和执行环境,其能力比常规 Bourne shell 的能力更受到控制。

Rsh 或 bsh -r 命令打开受限 shell。这些命令的行为等同于 bsh 命令的行为,除不允许以下操作外:

● 更改目录(使用 cd 命令)
● 设置 PATH 或 SHELL 变量的值
● 指定包含斜杠(/)的路径或命令名
● 重定向输出

如果受限 shell 确定要运行的命令是 shell 过程,那么它使用 Bourne shell运行命令。这样,就可能向用户提供访问 Bourne shell 的全部功能的 shell过程,但强加受限的命令菜单。这种情况假定用户在同一个目录中不具有写和执行许可权。

如果在启动 Bourne shell 时指定了 File [Parameter] 参数,那么 shell 会运行由 File参数标识的脚本文件(包括所有指定的参数)。指定的脚本文件必须具有读许可权。忽略脚本文件的任何 setuid 和 setgid 设置。然后shell 读取命令。如果使用 -c 或 -s 标志,那么不要指定脚本文件。

使用 Rsh 命令启动时,shell 会在解释 .profile 和 /etc/environment文件后强制执行限制。因此,.profile文件的编写者通过执行设置操作和让用户在相应的目录(可能不是登录目录)中对用户操作进行完全控制。管理员可以在 /usr/rbin目录中创建命令目录,并更改 PATH 变量来包含此目录,使 Rsh 命令可以使用该目录。如果使用 bsh -r 命令启动,那么 shell会在解释 .profile 文件时应用限制。

使用名称 Rsh 调用时,受限 shell 将读取用户的 .profile 文件($HOME/.profile)。执行这一操作时它作为常规 Bourne shell 工作,除中断导致立即退出而不是返回命令级外。
受限 Korn shell

受限 Korn Shell 用于设置登录名和执行环境,其能力比常规 Korn shell 的能力更受限制。

rksh 或 ksh -r 命令打开受限 Korn Shell。这些命令的行为等同于 ksh 命令的行为,除了不允许以下操作外:

● 更改当前工作目录
● 设置 SHELL、ENV 或 PATH 变量的值
● 指定包含 /(斜杠)的命令的路径名
● 使用 >(右插入标记)、>|(右插入标记,管道符)、<>(左插入标记,右插入标记)或 >>(两个右插入标记)重定向命令的输出。

如果受限 Korn Shel 确定要运行的命令是 shell 过程,那么它使用 Korn shell运行命令。这样,就可能向最终用户提供访问 Korn shell 全部功能的 shell过程,但强加受限的命令菜单。这种情况假定用户在同一个目录中不具有写和执行许可权。

如果启动 Korn shell 时指定 File [Parameter] 参数,那么 shell 运行由 File参数标识的脚本文件,包含任何指定的参数。指定的脚本文件必须具有读许可权。忽略脚本文件的任何 setuid 和 setgid 设置。然后shell 读取命令。如果使用 -c 或 -s 标志,那么不要指定脚本文件。

使用 rksh 命令启动时,shell 会在解释 .profile 和 /etc/environment文件后强制执行限制。因此,.profile文件的编写者通过执行设置操作和让用户在相应的目录(可能不是登录目录)中对用户操作进行完全控制。管理员可以在 /usr/rbin目录中创建命令目录,并更改 PATH 变量来包含此目录,使 rksh 命令可以使用该目录。如果使用 ksh -r 命令启动,那么 shell在解释 .profile 文件时应用限制。

当使用 rksh 命令调用时,受限 Korn shell 读取用户的 .profile 文件($HOME/.profile)。执行这一操作时它作为常规 Korn shell 工作,除了中断导致立即退出而不是返回命令级外。
Bourne shell 命令

您可以在 Bourne shell 中发出命令。
当您在 Bourne shell 中发出命令时,它首先对命令求值,并做出所有表示的替换。然后运行命令,条件是:

● 命令名是 Bourne shell 特殊内置命令。


● 命令名匹配已定义的函数的名称。如果是这种情况,那么 shell 将位置参数设置为函数的参数。

如果命令名既不匹配内置命令也不匹配已定义的函数的名称,并且命令命名已编译的(二进制)程序的可执行文件,那么shell(作为父)产生一个立即运行程序的新(子)进程。如果文件标记为可执行文件,但不是已编译程序,那么 shell 假定它是一个 shell过程。在这种情况下,shell 生成其另一个实例(子 shell),来读文件和执行包含在其中的命令。shell 还运行子 shell中加括弧的命令。对于用户来说,已编译程序以与 shell 过程完全相同的方式运行。shell 通常以下列顺序来搜索文件系统目录中的命令:

1. /usr/bin
2. /etc
3. /usr/sbin
4. /usr/ucb
5. $HOME/bin
6. /usr/bin/X11
7. /sbin
8. 当前目录

shell 依次搜索每个目录,如果没有找到命令就继续搜索下一个目录。
注: PATH 变量决定 shell 搜索目录的顺序。可以通过复位 PATH 变量来更改已搜索目录的特定顺序。

如果在运行命令时给出特定路径名(例如,/usr/bin/sort),那么 shell 不会搜索所指定目录外的其他目录。如果命令名包含斜杠(/),那么 shell 将不使用搜索路径。
可以给出一个以根目录开始的全路径名(如 /usr/bin/sort)。还可以指定相对于当前目录的路径名。例如,如果您指定:

bin/myfile

则 shell 在当前目录中查找名为 bin 的目录,并在该目录中查找文件 myfile。
注: 受限 shell 不会运行包含斜杠(/)的命令。

shell 记住每个已执行命令在搜索路径中的位置(以避免以后不必要的 exec 命令)。如果它在相对目录(名称不以 /开头的目录)中找到命令,那么每当当前目录更改时,shell 都必须重新确定命令的位置。每次更改 PATH 变量或运行 hash -r命令后,shell 都会丢失所有已记住的位置。

● 字符加引号
许多字符对 shell 都有特殊的含义。有时您需要隐藏该含义。括起字符串的单引号(')和双引号(")或单个字符之前的反斜杠(/)允许您隐藏字符的含义。
● 信号处理
如果调用的命令以“与”符号(&)终止,即该命令在后台运行,那么 shell 会忽略命令的 INTERRUPT 和 QUIT信号。否则,信号将具有 shell 从其父代那里继承的值,但 SEGMENTATION VIOLATION 信号除外。
● Bourne shell 合成命令
合成命令是以下一种命令。
● 保留字
以下是 Bourne shell 的保留字,仅当它们不带引号出现在命令首个字位置时,才会识别它们。
● Bourne shell 内置命令
在 Bourne shell 有一些特殊的内置命令,它们在 shell 进程中运行。
● 特殊命令描述
Bourne shell 提供以下特殊内置命令:
● Bourne shell 中的命令替换
命令替换允许您捕获任何命令的输出,作为另一个命令的参数。
字符加引号

许多字符对 shell 都有特殊的含义。有时您需要隐藏该含义。括起字符串的单引号(')和双引号(")或单个字符之前的反斜杠(/)允许您隐藏字符的含义。
所有字符(除单引号括起的外)逐字地操作,并且除去任何特殊含义。因此,命令:

stuff='echo $? $*; ls * | wc'

将文字字符串 echo $? $*; ls * | wc 指定给变量 stuff。shell 不执行 echo、ls 和 wc 命令或展开 $? 和 $* 变量以及星号(*)特殊字符。

在双引号中,美元符($)、反引号(`)和双引号(")字符的特殊含义保持有效,而所有其他字符则按字面含义理解。因此,在双引号中会产生命令和变量替换。此外,引号不影响作为引用字符串一部分的命令替换中的命令,因此那里的字符保留其特殊含义。
考虑以下顺序:

ls *
file1 file2 file3message="This directory contains `ls * ` "
echo $message
This directory contains file1 file2 file3

这显示命令替换中的星号(*)特殊字符已展开。

要隐藏双引号中的美元符($)、反引号(`)和双引号(")字符的特殊含义,请在这些字符前输入反斜杠(/)。当您不使用双引号时,将反斜杠放在字符前等价于将字符放在单引号中。因此,就在换行字前的反斜杠(即,反斜杠在一行的结尾)将隐藏换行符,并允许您在下一个物理行继续此命令行。
信号处理

如果调用的命令以“与”符号(&)终止,即该命令在后台运行,那么 shell 会忽略命令的 INTERRUPT 和 QUIT 信号。否则,信号将具有 shell 从其父代那里继承的值,但 SEGMENTATION VIOLATION 信号除外。
Bourne shell 合成命令

合成命令是以下一种命令。

● 管道(由管道(|)符分隔的一个或多个简单命令)
● 简单命令列表
● 以保留字开始的命令
● 以控制运算符左圆括号(()开始的命令

除非另有说明,否则由复合命令返回的值是执行的最后一个简单命令返回的值。
保留字

以下是 Bourne shell 的保留字,仅当它们不带引号出现在命令首个字位置时,才会识别它们。

for do done
case esac
if then fi
elif else
while until
{ }
( )


forIdentifier [inWord. . .] doList done 将 Identifier 参数设置为 Word参数指定的(一个或多个)字(每次一个),并运行 List 参数中指定的命令。如果省略了 in Word. . .,那么 for命令会对于每个已设置的位置参数运行 List 参数,并在使用所有位置参数后结束处理。
case Word in Pattern [|Pattern] . . . ) List;; [Pattern[|Pattern] . . . ) List;;] . . . esac 运行 List 参数中指定的命令,这些命令与匹配 Word参数的值的第一个 Pattern参数关联。以用于文件名替换的模式使用相同字符匹配表示法,但是斜杠(/)、前导点号(.)或紧跟斜杠的点号(/.)不需要显式匹配。
if List then List [elif List then List] . . . [else List] fi 运行if 命令后的 List 参数中指定的命令。如果命令返回的退出值为零,那么 shell 运行第一个 then 命令后的 List参数。否则,它将运行 elif 命令(如果存在)后的 List 参数。如果该退出值为零,那么 shell 运行下一个 then 命令后的List 参数。如果命令返回的退出值非零,那么 shell 会运行 else 命令(如果存在)后的 List 参数。如果未执行 elseList 或 then List,那么 if 命令返回的退出值为零。
while List do List done 运行 while 命令后的 List 参数中指定的命令。如果 while List中的最后一个命令的退出值为零,那么 shell 会运行 do 命令后的 List 参数。它继续在列表中循环,直到 while List中的最后一个命令的退出值非零为止。如果未执行 do List 中的命令,那么 while 命令返回的退出值为零。
until List do List done 运行 until 命令后的 List 参数中指定的命令。如果 until List中的最后一个命令的退出值非零,那么 shell 会运行 do 命令后的 List 参数。它继续在列表中循环,直到 until List中最后一个命令的退出值为零。如果未执行 do List 中的命令,那么 until 命令返回的退出值为零。
( List ) 在子 shell 中运行 List 参数中的命令。
{ List; } 在当前 shell 进程中运行 List 参数中的命令,而不启动子 shell。
Name () { List } 定义 Name 参数所引用的函数。函数的主体是由 List 参数指定的大括号之间的命令列表。
保留字

以下是 Bourne shell 的保留字,仅当它们不带引号出现在命令首个字位置时,才会识别它们。

for do done
case esac
if then fi
elif else
while until
{ }
( )


forIdentifier [inWord. . .] doList done 将 Identifier 参数设置为 Word参数指定的(一个或多个)字(每次一个),并运行 List 参数中指定的命令。如果省略了 in Word. . .,那么 for命令会对于每个已设置的位置参数运行 List 参数,并在使用所有位置参数后结束处理。
case Word in Pattern [|Pattern] . . . ) List;; [Pattern[|Pattern] . . . ) List;;] . . . esac 运行 List 参数中指定的命令,这些命令与匹配 Word参数的值的第一个 Pattern参数关联。以用于文件名替换的模式使用相同字符匹配表示法,但是斜杠(/)、前导点号(.)或紧跟斜杠的点号(/.)不需要显式匹配。
if List then List [elif List then List] . . . [else List] fi 运行if 命令后的 List 参数中指定的命令。如果命令返回的退出值为零,那么 shell 运行第一个 then 命令后的 List参数。否则,它将运行 elif 命令(如果存在)后的 List 参数。如果该退出值为零,那么 shell 运行下一个 then 命令后的List 参数。如果命令返回的退出值非零,那么 shell 会运行 else 命令(如果存在)后的 List 参数。如果未执行 elseList 或 then List,那么 if 命令返回的退出值为零。
while List do List done 运行 while 命令后的 List 参数中指定的命令。如果 while List中的最后一个命令的退出值为零,那么 shell 会运行 do 命令后的 List 参数。它继续在列表中循环,直到 while List中的最后一个命令的退出值非零为止。如果未执行 do List 中的命令,那么 while 命令返回的退出值为零。
until List do List done 运行 until 命令后的 List 参数中指定的命令。如果 until List中的最后一个命令的退出值非零,那么 shell 会运行 do 命令后的 List 参数。它继续在列表中循环,直到 until List中最后一个命令的退出值为零。如果未执行 do List 中的命令,那么 until 命令返回的退出值为零。
( List ) 在子 shell 中运行 List 参数中的命令。
{ List; } 在当前 shell 进程中运行 List 参数中的命令,而不启动子 shell。
Name () { List } 定义 Name 参数所引用的函数。函数的主体是由 List 参数指定的大括号之间的命令列表。

Bourne shell 内置命令

在 Bourne shell 有一些特殊的内置命令,它们在 shell 进程中运行。

除非另有指示,否则输出写入到文件描述符 1(标准输出),并且如果命令不包含任何语法错误则退出状态为 0(零)。允许输入和输出重定向。

有关这些命令的字母顺序列表,请参阅 Bourne shell 内置命令列表。
对以下特殊命令的处理与其他特殊内置命令有所不同:

: (冒号) exec shift
. (点号) exit times
break export trap
continue readonly wait
eval return


Bourne shell 如下处理这些命令:

● 在命令之前的关键字参数赋值列表在命令完成时保持有效。
● 在参数赋值后处理 I/O 重定向。
● shell 脚本中的错误导致脚本停止处理。
特殊命令描述

Bourne shell 提供以下特殊内置命令:
: 返回零退出值。
. File 从 File 参数读取和运行命令并返回。不要启动子 shell。shell 使用由 PATH 变量指定的搜索路径来查找包含指定文件的目录。
break [ n ] 从封闭的 for、while 或 until 命令循环退出(如果有)。如果指定了 n 变量,那么 break 命令将中断由 n 变量指定的级别号。
continue [ n ] 继续封闭的 for、while 或 until 命令循环的下一个迭代。如果指定了 n 变量,那么命令将在第 n 个封闭循环处继续执行。
cd Directory ] 更改当前目录到 Directory。如果未指定 Directory,那么使用 HOME shell变量的值。CDPATH shell 变量定义 Directory 的搜索路径。CDPATH是以冒号分隔的备用目录名称的列表。空路径名指定当前目录(它是缺省路径)。此空路径名紧跟在赋值中等号之后或出现在路径列表中冒号定界符之间的任何其他位置。如果 Directory 以斜杠(/)开始,那么 shell 将不使用搜索路径。否则,shell 搜索 CDPATH shell变量中的每个目录。
注: 受限 shell 无法运行 cd shell 命令。
echo String . . . ] 将字符串写入标准输出。请参阅 echo 命令以获取用法和参数信息。不支持 -n 标志。
eval [ Argument . . . ] 将自变量作为输入读入 shell,并运行(一个或多个)最后形成的命令。
exec [ Argument . . . ] 运行 Argument 参数指定的命令代替此 shell,而不创建新进程。可能显示输入和输出参数,并且如果不显示其他任何参数,那么将导致修改 shell 输入或输出。建议不要将其用于您的登录 shell。
exit [ n ] 导致 shell 退出,退出值由 n 参数指定。如果省略此参数,那么退出值是最后一个执行命令的退出值(Ctrl-D 组合键也导致 shell 退出)。n 参数的值可从 0 到 255,包括 0 和 255。
export [ Name . . . ] 为自动导出到后续执行的命令的环境标记指定的名称。如果未指定 Name 参数,那么 export 命令显示会在该 shell 中导出的所有名称的列表。无法导出函数名。
hash [ -r ][ Command . . . ] 查找并记住每个指定的 Command 在搜索路径中的位置。-r 标志使 shell 忘记所有位置。如果未指定标志或任何命令,那么 shell 以下列格式显示关于记住的命令的信息:

Hits Cost Command

Hits 表示命令已由 shell 进程运行的次数。Cost 是在搜索路径中定位命令所要求的工作的度量。Command显示每个指定命令的路径名。某些情况要求对命令的存储位置进行重新计算;例如,当前目录更改时的相对路径名的位置。可执行此操作的命令由 Hits信息旁的星号(*)表示。重新计算完成时 Cost 将增加。
pwd 显示当前目录。请参阅 pwd 命令以获取命令选项的论述。
read [ Name . . . ] 从标准输入读一行。将行中的第一个字指定给第一个 Name 参数,第二个字指定给第二个 Name 参数,等等,剩余的字都指定给最后一个 Name 参数。此命令返回值 0,除非它遇到文件结束符字符。
readonly [ Name . . . ] 将 Name 参数指定的名称标记为只读。名称的值无法重新设置。如果未指定任何 Name,readonly 命令会显示所有只读名称的列表。
return [ n ] 使函数以返回值 n 退出。如果未指定 n 变量,那么函数返回最后一个在该函数中执行的命令的状态。仅当此命令在 shell 函数中运行时才有效。
set [ Flag [ Argument ] . . . ] 设置一个或多个以下标志:

-a
标记导出所有变量到执行赋值的位置。如果赋值在命令名之前,那么导出属性仅对该命令执行环境有效,除了当赋值在某一特殊内置命令之前时。在这种情况下,导出属性在内置命令完成后仍存留。如果赋值不在命令名之前,或如果赋值是 getopts 或 read命令的操作结果,那么导出属性将存留到变量取消设置为止。
-e
如果对于一个命令所有以下条件存在,那么立即退出:

* 它以一个大于 0(零)的返回值退出。
* 它不是 while、until 或 if 命令的复合列表的一部分。
* 它不使用 AND 或 OR 列表测试。
* 它不是一个前有 !(感叹号)保留字的管道。

-f
禁用文件名替换。
-h
在定义函数时,定位并记住在函数中调用的命令。(通常在执行函数时找到这些命令;请参阅 hash 命令。)
-k
将所有关键字参数都放入命令的环境,而不只是命令名前的那些关键字参数。
-n
读命令但不运行它们。要检查 shell 脚本语法错误,请使用 -n 标志。
-t
在读和执行一个命令后退出。
-u
将取消设置的变量作为错误处理,并在执行变量替换时立即退出。交互式 shell 不退出。
-v
读 shell 输入行时显示它们。
-x
在命令运行前显示命令及其自变量。

不更改任何标志。这在将 $1 位置参数设置为以连字符(-)开始的字符串时很有用。



使用加号(+)而非连字符(-)可取消设置标志。还可在 shell 命令行上指定这些标志。$- 特殊变量包含标志的当前设置。

set 命令的所有 Argument 都将成为位置参数,且按顺序指定为 $1、$2、... 等。如果未指定 flag 或 Argument,那么 set 命令会显示当前 shell 变量的所有名称和值。
shift [n] 向左移位命令行自变量;即,通过废弃 $1 的当前值并将 $2 的值指定给 $1,将 $3 的值指定给$2,等等,来重新指定位置参数的值。如果存在 9 个以上命令行参数,那么将第 10 个指定给 $9,而其余参数仍是未指定的(直到另一次shift 后)。如果只有 9 个或更少自变量,那么 shift 命令取消设置具有值的最大编号的位置参数。

$0 位置参数从不移位。shift n 命令是指定 n 个连续移位的速记标志法。n 参数的缺省值是 1。
test Expression | [ Expression ] 求值条件表达式。请参阅 test 命令以获取命令标志和参数的论述。bsh 中的内置 test 命令不支持 -h 标志。
times 为从 shell 运行的进程显示累加的用户和系统次数。
trap [ Command ] [ n ] . . . 当 shell 接收到由 n 参数指定的(一个或多个)信号时,运行由Command 参数指定的命令。trap 命令以信号号码顺序运行。对当前 shell 的入口忽略的信号设置陷阱的任何尝试都是无效的。
注: shell 会在设置陷阱时扫描一次 Command 参数,在采用陷阱时再扫描一次。
如果不指定命令,那么由 n 参数指定的所有陷阱都被重新设置为其当前值。如果指定空字符串,那么此信号被 shell和它调用的命令忽略。如果 n 参数是零(0),那么指定的命令在您从 shell 中退出时运行。如果未指定命令或信号,那么 trap命令显示与每个信号号码关联的命令的列表。
type [Name . . . ] 表示对每个指定的 Name,shell 将其解释为命令名的方法。
ulimit [-HS] [ -c | -d | -f | -m | -r | -s | -t |-u] [limit] 显示或调整分配的 shell 资源。可个别地或作为组来显示 shell 资源设置。缺省方式是作为组来显示软设置或下界的资源设置。

shell 资源的设置取决于当前 shell 的有效用户标识。仅在当前 shell 的有效用户标识是 root时,才可设置资源的硬级别。如果您不是 root 用户而又试图设置资源的硬级别,那么将会出错。缺省情况下,root用户设置某一特殊资源的硬限制和软限制。因此 root 用户在使用 -S、-H 或限制设置的缺省标志用法时要格外小心。除非您是 root用户,否则只能设置资源的软限制。在非 root 用户降低了限制后,它无法再增加,即使要回复到其原始系统限制也不行。

要设置资源限制,请选择相应的标志以及新资源的限制值,该限制值应为一个整数。一次只能设置一个资源限制。如果指定了多个资源标志,那么会接收到未定义的结果。缺省情况下,在命令行上只有一个新值的 ulimit 设置 shell 的文件大小。-f 标志的使用是可选的。

可以指定以下 ulimit 命令标志:

-c
设置或显示 shell 的核心段。
-d
设置或显示 shell 的数据段。
-f
设置或显示 shell 的文件大小。
-H
设置或显示硬资源限制(仅 root 用户)。
-m
设置或显示 shell 的内存。
-r
为每个进程设置或显示线程的最大数量。
-s
设置或显示 shell 的堆栈段。
-S
设置或显示软资源限制。
-t
设置或显示 shell 的最大 CPU 时间。
-u
为每位用户设置或显示进程的最大数量。

umask [nnn] 确定文件许可权。当文件创建时,此值以及创建进程的许可权确定文件的许可权。缺省值是 022。未输入值时,umask 显示当前值。
unset [Name . . .] 除去由 Name 参数指定的每个名称的对应变量或函数。无法取消设置 PATH、PS1、PS2、MAILCHECK 和 IFS shell 变量。
wait [n] 等待其进程号由 n 参数指定的子进程退出,然后返回该进程的退出状态。如果未指定 n 参数,那么 shell 将等待所有当前活动的子进程,并且返回值将为 0。
Bourne shell 中的命令替换

命令替换允许您捕获任何命令的输出,作为另一个命令的参数。
当您将一个命令行放在反引号(``)中时,shell 首先运行命令,然后用输出替换整个表达式(包括反引号)。此功能经常用于给 shell 变量赋值。例如,语句:

today=`date`

将代表当前日期的字符串指定给 today 变量。以下赋值将当前目录中的文件数保存在 files 变量中。

files=`ls | wc -l`

可以对任何写到标准输出的命令执行命令替换。
要嵌套命令替换,请在每个嵌套的反引号前加一个反斜杠(/),如:

logmsg=`echo Your login directory is /`pwd/``

还可以通过使用 read 特殊命令间接提供 shell 变量的值。此命令从标准输入(通常是键盘)取出一行,并将该行上连续的字指定给任何命名的变量。例如:

read first init last

取出以下格式的输入行:

J. Q. Public

与您输入以下命令的效果相同:

first=J. init=Q. last=Public

read 特殊命令将任何剩余的字指定给最后一个变量。
Bourne shell 中的变量替换

Bourne shell 允许您执行变量替换。

Bourne shell 有几种创建变量的机制(将字符串值指定给名称)。某些变量、位置参数和关键字参数通常仅在命令行上设置。其他变量就是您或 shell 可将字符串值指定给它的名称。
Bourne shell 中用户定义的变量

Bourne shell 可以识别字母数字变量,这些变量可指定字符串值。
要将字符串值指定给名称,请输入以下内容:

Name=String

名称是以下划线或字母开头的字母、数字和下划线的序列。要使用已指定给变量的值,请将一个美元符($)添加到其名称的开头。这样,$Name变量产生由 String 变量指定的值。请注意,赋值语句中等号(=)的任一边都无空格。(位置参数不能出现在赋值语句中。它们只能按 Bourneshell 中的位置参数中的描述设置。)您可以将多个赋值放在命令行上,但记住 shell 从右至左执行赋值。

如果用双引号或单引号(" 或 ')将 String 变量括起来,那么 shell 不会将字符串中的空格、跳格符、分号和换行符视为字定界符,而是会将它们逐字嵌入字符串中。

如果用双引号(")将 String 变量括起来,那么 shell 仍可识别字符串中的变量名,并执行变量替换;即,它会将位置参数的引用和以货币标记($)开头的其他变量名替换为其相应的值(如果有)。shell 还在用双引号括起的字符串中执行命令替换。
如果用单引号(')将 String 变量括起来,那么 shell 不会替换字符串中的变量或命令。以下序列说明此差异:

You: num=875
number1="Add $num"
number2='Add $num'
echo $number1
System: Add 875
You: echo $number2
System: Add $num

shell 在变量替换后不重新解释赋值中的空白。这样,以下赋值使 $first 和 $second 具有相同的值:

first='a string with embedded blanks'
second=$first

当引用一个变量时,可以将变量名(或指定位置参数的数字)括起在 { } 中以定界变量名,与任何后面的字符串分开。特别地,如果紧跟名称的字符是字母、数字或下划线,且变量不是位置参数,那么大括号是必需的:

You: a='This is a'
echo "${a}n example"
System: This is an example
You: echo "$a test"
System: This is a test

请参阅 Bourne shell 中的条件替换以了解变量替换中大括号的不同使用。

● Bourne shell 使用的变量
shell 使用以下变量。尽管 shell 设置了其中的一些变量,您仍可以设置或重新设置所有变量。
CDPATH 指定 cd(更改目录)命令的搜索路径。
HOME 表示您的登录目录(该目录在登录完成后成为当前目录)的名称。 登录程序初始化此变量。cd 命令使用 $HOME 变量的值作为其缺省值。在 shell 过程中使用此变量(而非显式路径名)使得此过程可以从不同的目录运行而无需改动。
IFS 是 IFS(内部字段分隔符)的字符并且是 shell 在空白解释期间使用的字符。请参阅空白解释。shell 初始地设置 IFS 变量以包含空白、制表符和换行字符。
LANG 确定当 LC_ALL 变量和相应的环境变量(以 LC_ 开头)都未指定语言环境时,用于语言环境类别的语言环境。有关语言环境的更多信息,请参阅《AIX V6.1 本地语言支持指南与参考大全》中的语言环境概述。
LC_ALL 确定用于覆盖由 LANG 环境变量或任何以 LC_ 开头的环境变量的设置所指定的任何语言环境类别值的语言环境。
LC_COLLATE 定义当对名称进行排序或字符范围发生在模式中时使用的整理序列。
LC_CTYPE 确定用于将文本数据字节序列解释成字符的语言环境(即,自变量和输入文件中的单字节字符与多字节字符),哪些字符定义为字母(alpha 字符类),以及模式匹配中字符类的行为。
LC_MESSAGES 确定以哪种语言写消息。
LIBPATH 指定共享库的搜索路径。
LOGNAME 指定您的登录名,在 /etc/profile 文件中标记为 readonly。
MAIL 表示邮件系统用于检测新邮件到达的文件的路径名。如果该变量已设,那么 shell将定期检查此文件的修改时间,如果时间已更改,且文件长度大于 0,那么 shell 会显示 $MAILMSG 的值。设置 .profile文件中的 MAIL 变量。通常,mail 命令的用户指定给它的值为 /usr/spool/mail/$LOGNAME。
MAILCHECK 再次检查由 MAILPATH 或 MAIL 变量指定的文件中邮件的到达前,shell 允许经过的秒数。缺省值是 600 秒(10 分钟)。如果将 MAILCHECK 变量设置为 0,那么 shell 在每个提示符前检查。
MAILMSG 邮件通知消息。如果显式将 MAILMSG 变量设置为空字符串(MAILMSG=""),那么不显示任何消息。
MAILPATH 用冒号分隔的文件名的列表。如果设置此变量,shell将通知您在列表中所指定任何文件中邮件的到达。可以在每个文件名后跟一个 % 和当邮件到达时要显示的消息。否则,shell 将使用 MAILMSG变量的值,或缺省使用消息 [YOU HAVE NEW MAIL]。
注: 如果设置了 MAILPATH 变量,那么将检查这些文件,而不是由 MAIL 变量设置的文件。要检查由 MAILPATH 变量设置的文件和由 MAIL 变量设置的文件,请在 MAILPATH 文件的列表中指定 MAIL 文件。
PATH 命令的搜索路径,它是由冒号分隔的目录路径名的有序列表。当 shell 查找命令时,它以指定的顺序搜索这些目录。列表中任何位置的空字符串代表当前目录。

PATH 变量通常在 /etc/environment 文件中初始化,通常设置为/usr/bin:/etc:/usr/sbin:/usr/ucb:/usr/bin/X11:/sbin。可以重新设置此变量以适合您自己的需要。.profile 文件中提供的 PATH 变量还包含 $HOME/bin 和当前目录。
如果您要在搜索标准系统目录前搜索一个特定于项目的命令目录,例如 /project/bin,请如下设置 PATH 变量:

PATH=/project/bin:$PATH

将 PATH 变量设置为除缺省值外的其他值的最佳位置在 $HOME/.profile 文件中。如果在受限 shell 下执行命令,那么无法重新设置 PATH 变量。
PS1 用作主系统提示符的字符串。交互式 shell 在期待输入时显示此提示符字符串。对于非 root 用户,PS1 变量的缺省值是 $ 后跟一个空白空格。
PS2 次提示符字符串的值。如果 shell 在其输入中遇到换行字符时期待更多输入,那么它以 PS2 变量的值提示。PS2 变量的缺省值为 > 后跟一个空格。
SHACCT 您拥有的文件的名称。如果设置此变量,那么对于每个执行的 shell 脚本,shell 在文件中写一个记帐记录。可以使用记帐程序(如 acctcom 和 acctcms)来分析收集的数据。
SHELL 保留在环境中的 shell 的路径名。此变量应由每个受限登录的 $HOME/.profile 文件设置和导出。
TIMEOUT shell 退出前保留非活动的分钟数。如果此变量设置为一个大于零(0)的值,那么当在发出 PS1 提示符后未在指示的秒数内输入命令,shell 退出。(注意,shell 可以使用不能超过此值的最大边界来编译。)值零表示无时间限制。
● Bourne shell 中预定义的特殊变量
几个变量有特殊的含义。以下变量只能由 Bourne shell 设置:
$@ 展开位置参数,以 $1 开始。每个参数都用空格分隔。

如果用双引号(" ")括起 $@, 则 shell 认为每个位置参数是独立的字符串。如果不存在位置参数,那么 Bourne shell 将语句展开成一个没有引起的空字符串。
$* 展开位置参数,以 $1 开始。shell 使用 IFS 变量值的第一个字符分隔每个参数。

如果使用双引号(" ")括起 $*,那么 shell 在双引号中包含位置参数值。每个值都用 IFS 变量的第一个字符分隔。
$# 指定传递给 shell 的位置参数的数目,不计数 shell 步骤名称本身。这样 $#变量产生设置的最大编号位置参数的数目。此变量的一个主要使用是检查存在要求的自变量数目。只有位置参数 $0 到 $9 可以通过 shell访问。请参阅 Bourne shell 中的位置参数获取更多信息。
$? 指定上次执行命令的退出值。其值是一个十进制字符串。大多数命令返回值 0 以表示成功完成。shell 自己返回 $? 变量的当前值作为其退出值。
$$ 标识当前进程的进程号。因为进程号在所有现有字符串中唯一,所以此字符串经常用于生成临时文件的唯一名称。
下例说明了在目录中创建临时文件的推荐方法,该方法仅用于实现上述目的:

temp=/tmp/$$
ls >$temp
.
.
.
rm $temp

$! 指定上一个使用 & 终端符在后台运行的进程的进程号。
$- 由当前在 shell 中设置的执行标志的名称组成的字符串。
● 空白解释
shell 在执行变量替换和命令替换后,扫描结果以获取内部字段分隔符(在 IFS shell 变量中定义的那些)。

shell 在找到一个或多个这些字符的每个地方,将行分割成不同的字,并以一个空格分隔每个不同的字。它则会保留显式空自变量("" 或 '')并废弃隐式空自变量(由不具有值的参数的产生的自变量)。
Bourne shell 中的条件替换

通常,shell 使用指定给 Variable 变量(如该变量存在)的字符串来替换表达式 $Variable。但有一个允许条件替换的特殊标志法,这取决于变量是否设置和/或非空。

根据定义,如果一个变量曾经指定过值,那么它就已设置。变量的值可以是空字符串,您可以用任一以下方式将其指定给变量:
A=
bcd=""
Efg='' 将空字符串指定给 A、bcd 和 Efg。
set '' "" 将第一个和第二个位置参数设置为空字符串,并取消设置所有其他位置参数。

以下是可用于执行条件替换的可用表达式的列表:
${Variable- String} 如果设置了变量,那么替换 Variable 值代替此表达式。否则,使用 String 值替换此表达式。
${Variable:-String} 如果设置了变量且该变量非空,那么替换 Variable 值代替此表达式。否则,使用 String 值替换此表达式。
${Variable=String} 如果设置了变量,那么替换 Variable 值代替此表达式。否则,将 Variable 值设置为 String 值,然后替换 Variable 值代替此表达式。您无法以此方式指定值给位置参数。
${Variable:=String} 如果设置了变量且该变量非空,那么替换 Variable 值代替此表达式。否则,将 Variable 值设置为 String 值,然后替换 Variable 值代替此表达式。您无法以此方式指定值给位置参数。
${Variable?String} 如果设置了变量,那么替换 Variable 值代替此表达式。否则,显示以下格式的消息:

Variable: String

并从当前 shell 退出(除非 shell 是登录 shell)。如果没有为 String 变量指定值,那么 shell 显示以下消息:

变量:参数空或未设置

${Variable:?String} 如果设置了变量且该变量非空,那么替换 Variable 值代替此表达式。否则,显示以下格式的消息:

Variable: String

并从当前 shell 退出(除非 shell 是登录 shell)。如果不指定 String 变量值,那么 shell 显示以下消息:

变量:参数空或未设置

${Variable+String} 如果设置了变量,那么替换 String 值代替此表达式。否则,替换空字符串。
${Variable:+String} 如果设置了变量并且非空,那么替换 String 值代替此表达式。否则,替换空字符串。
在条件替换中,shell 不对 String 变量进行求值,直到 shell 使用此变量作为替换的字符串。这样,在下例中,仅当 d 未设置或为空时,shell 才执行 pwd 命令:

echo ${d:-`pwd`}
Bourne shell 中的位置参数

当您运行 shell 步骤时,shell 隐式地创建位置参数,这些位置参数根据每个字在命令行上的位置在命令行上引用每个字。

位置 0 中的字(步骤名称)称为 $0,下一个字(第一个参数)称为 $1,等等,直到 $9。要引用编号大于 9 的命令行参数,请使用内置的 shift 命令。

可以通过使用内置 set 命令显式地重新设置位置参数的值。
注: 当未指定位置的自变量时,其位置参数设置为空。位置参数是全局的,并且可以传递到嵌套的 shell 步骤。
Bourne shell 中的文件名替换

Bourne shell 允许您执行文件名替换。
命令参数经常是文件名。可以自动产生文件名的列表,作为命令行上的参数。要这样做,请指定 shell 识别为模式匹配字符的字符。当命令包含这样的字符时,shell 使用目录中的文件名替换它。
注: Bourne shell 不支持基于等价字符分类的文件名扩展。

这样的模式中的大多数字符与自身匹配,但也可以在您的模式中使用一些特殊的模式匹配字符。这些特殊字符如下:
* 匹配任何字符串,包括空字符串
? 匹配任何单个字符
[ . . . ] 匹配括起在方括号中的任一字符
[! . . . ] 匹配方括号中的任何字符,除跟在感叹号后的一个字符

在方括号中,以连字符(-)分隔的一对字符,指定该字符对的包含范围中词典编纂地所有字符集,根据字符值的二进制顺序。
模式匹配有一些限制。如果文件名的首个字符为一个点号(.),那么它只能由也以点号开头的模式匹配。例如,* 匹配文件名 myfile 和 yourfile,而不匹配文件名 .myfile 和 .yourfile。要匹配这些文件,请使用诸如以下的模式:

.*file

如果某种模式不匹配任何文件名,那么模式本身将作为所尝试匹配的结果返回。

文件和目录名不应包含字符 *、?、[ 或 ],因为这些字符在模式匹配尝试期间会导致无限递归(即,无限循环)。
字符类

您可以使用字符类来匹配文件名。

您可以使用字符类来匹配文件名,如下所示:

[[:charclass:]]

此格式指示系统匹配属于指定类的任何单个字符。定义的类对应于 ctype 子例程,如下:
字符类 定义
alnum 字母数字字符
alpha 大写和小写字母
blank 空格或水平制表符
cntrl 控制字符
digit 数字
graph 图形字符
lower 小写字母
print 可打印字符
punct 标点符号字符
space 空格、水平制表符、回车、换行、垂直制表符或换页字符
upper 大写字符
xdigit 十六进制数字
Bourne shell 中的输入和输出重定向

在命令中可以使用重定向选项。

一般来说,大多数命令不知道它们的输入或输出是否与键盘、显示屏幕或文件关联。因此,命令可便利地在键盘或管道使用。

以下重定向选项可以在简单命令中的任何位置出现。它们还可以在命令之前或之后,但不传递到命令。
<File 将指定文件用作标准输入。
>File 将指定文件用作标准输出。如果文件不存在,那么创建它;否则,将它截断为零长度。
> >File 将指定文件用作标准输出。如果文件不存在,那么创建它;否则,将输出添加至文件结尾。
<<[-]eofstr 将来自 eofstr 变量的所有行作为标准输入读取,直到仅包含 eofstr的行,或直到一个文件结束符字符。如果 eofstr 变量中的任何字符加有引号,那么 shell不展开或解释输入行中的任何字符。否则,它执行变量和命令替换,并忽略引用的换行符(/newline)。使用反斜杠(/)来引用 eofstr变量中或输入行中的字符。

如果将连字符(-)添加到 << 重定向选项,那么会从 eofstr 变量和输入行除去所有前导跳格符。
<&Digit 将标准输入与 Digit 变量指定的文件描述符关联。
>&Digit 将标准输出与 Digit 变量指定的文件描述符关联。
<&- 关闭标准输入。
>&- 关闭标准输出。
注: 受限 shell 不允许输出重定向。
Bourne shell 内置命令列表

以下是 Bourne shell 内置命令的列表。
: 返回零退出值
. 读和执行来自文件参数的命令,然后返回。
break 从封闭的 for、while 或 until 命令循环退出(如果有)。
cd 将当前目录更改为指定的目录。
continue 继续封闭的 for、while 或 until 命令循环的下一个迭代。
echo 将字符串写入标准输出。
eval 将自变量读作 shell 的输入,并执行最后形成的命令。
exec 执行 Argument 参数指定的命令,而不是此 shell,并不创建新进程。
exit 退出由 n 参数指定其退出状态的 shell。
export 为自动导出到后续执行的命令的环境标记名称。
hash 查找并记住指定的命令在搜索路径中的位置。
pwd 显示当前目录。
read 从标准输入读一行。
readonly 将 Name 参数指定的名称标记为只读。
return 导致函数退出,并有指定的返回值。
set 控制各种参数到标准输出的显示。
shift 左移命令行自变量。
test 求值条件表达式。
times 为从 shell 运行的进程显示累加的用户和系统次数。
trap 当 shell 接收到指定的信号时运行指定的命令。
type 解释 shell 如何将特定名称解释成命令名。
ulimit 显示或调整分配的 shell 资源。
umask 确定文件许可权。
unset 除去对应于指定名称的变量或函数。
wait 等待指定子进程结束并报告其终止状态。

原创粉丝点击