【转载】man bash 或 man sh
- BASH(1) BASH(1)
- NAME
- 概述(SYNOPSIS)
- 版权所有(COPYRIGHT)
- 描述(DESCRIPTION)
- 选项(OPTIONS)
- 参数(ARGUMENTS)
- 启动(INVOCATION)
- 定义(DEFINITIONS)
- 保留字("RESERVED WORDS")
- shell语法("SHELL GRAMMAR")
-
-
- Simple Commands 简单命令
- Pipelines 管道
- Lists 序列
- Compound Commands 复合命令
-
- 注释(COMMENTS)
- 引用(QUOTING)
- 参数(PARAMETERS)
-
-
- Positional Parameters 位置参数
- Special Parameters 特殊参数
- Shell Variables 变量
- Arrays
-
- 扩展(EXPANSION)
-
-
- Brace Expansion
- Tilde Expansion
- Parameter Expansion
- Command Substitution
- Arithmetic Expansion
- Process Substitution
- Word Splitting
- Pathname Expansion
-
- 重定向(REDIRECTION)
-
-
- Redirecting Input
- Redirecting Output
- Appending Redirected Output (添加到重定向后的输出尾)
- Redirecting Standard Output and Standard Error
- Here Documents
- Here Strings
- Duplicating File Descriptors (复制文件描述符)
- Moving File Descriptors
- Opening File Descriptors for Reading and Writing
-
- 别名(ALIASES)
- 函数(FUNCTIONS)
- 算术求值("ARITHMETIC EVALUATION")
- 条件表达式("CONDITIONAL EXPRESSIONS")
- 扩展简单命令("SIMPLE COMMAND EXPANSION")
- 命令执行(COMMAND EXECUTION)
- 命令执行环境(COMMAND EXECUTION ENVIRONMENT)
- 环境(ENVIRONMENT)
- 退出状态("EXIT STATUS")
- 信号(SIGNALS)
- 作业控制("JOB CONTROL")
- 提示符(PROMPTING)
- readline库(READLINE)
-
-
- Readline Notation
- Readline Initialization 初始化
- Readline Key Bindings
- Readline Variables
- Readline Conditional Constructs
- Searching
- Readline Command Names
-
- Commands for Moving 移动
- Commands for Manipulating the History 操纵历史行
- Commands for Changing Text 改变文本
- Killing and Yanking 剪切和粘贴
- Numeric Arguments 数值参数
- Completing 补全
- Keyboard Macros 宏
- Miscellaneous
- Programmable Completion 可编程补全
-
- 历史(HISTORY)
- 历史扩展("HISTORY EXPANSION")
-
-
- Event Designators
- Word Designators
- 修饰符 (Modifiers)
-
- shell 内建命令(SHELL BUILTIN COMMANDS)
- 受限的shell(RESTRICTED SHELL)
- 参见("SEE ALSO")
- 文件(FILES)
- 作者(AUTHORS)
- 报告BUGS (BUG REPORTS)
- BUGS
BASH(1) BASH(1)
NAME
bash - GNU Bourne-Again SHell (GNU 命令解释程序 “Bourne二世”)
概述(SYNOPSIS)
bash [options] [file]
版权所有(COPYRIGHT)
Bash is Copyright (C) 1989-2002 by the Free Software Foundation, Inc.
描述(DESCRIPTION)
Bash 是一个与 sh 从标准输入或文件中阅读的兼容命令解释程序 命令。 Bash 也整合了 Korn 和 C Shell (ksh 和 csh) 优秀的特点。 Bash 目标是遵循 IEEE POSIX Shell and Tools specification (IEEE Working Group 1003.2.可移植操作系统规定: shell 和工具) 的实现。
选项(OPTIONS)
除了在 set 内部建筑命令文档中描述的单字符选项 (option) 之外,bash 在启动 还解释了以下选项。 -c string 如果有 -c 选项,然后命令将服从 string 中读取。如果 string 后 面 有参数 (argument),它们将用于给位参数 (positional parameter ,以 $0 起始) 赋值。 -i 如果有 -i 选项,shell 实施互动 ( interactive )。 -l 选项使得 bash 以类似登录 shell (login shell) 的式启动 (参见
下面的 启动(INVOCATION) 章节)。
-r 如果有 -r 选项,shell 成为受限的 ( restricted ) (参见下面的
受限的shell(RESTRICTED SHELL) 章节)。
-s 如果有 -s 选项,或者如果选项处理完以后,没有参数剩余,那么命
令将从标准输入读取。这个选项允许在启动一个交互 shell 时可以设
置位置参数。
-D 向标准输出打印一个以 $ 为前导的,以双引号引用的字符串列表。这
是 在当前语言环境不是 C 或 POSIX 时,脚本中需要翻译的字符串。
这个选项隐含了 -n 选项;不会执行命令。
[-+]O [shopt_option]
shopt_option 是一个 shopt 内建命令可接受的选项 (参见 下 面 的
shell 内 建 命 令(SHELL BUILTIN COMMANDS) 章节)。如果有
shopt_option,-O 将设置那个选项的取值; +O 取消它。如果没有给
出 shopt_option,shopt 将在标准输出上打印设为允许的选项的名称
和值。如果启动选项是 +O,输出将以一种可以重用为输入的格式显示
。
-- -- 标志选项的结束,禁止其余的选项处理。任何 -- 之后的参数将作
为文件名和参数对待。参数 - 与此等价。
Bash 也解释一些多字节的选项。在命令行中,这些选项必须置于需要被识别的单
字符参数之前。
--dump-po-strings
等价于 -D,但是输出是 GNU gettext po (可移植对象) 文件格式
--dump-strings
等价于 -D
--help 在标准输出显示用法信息并成功退出
--init-file file
--rcfile file
如果 shell 是交互的,执行 file 中的命令,而不是标准的个人初始化
文件 ~/.bashrc (参见下面的 启动(INVOCATION) 章节)
--login
等价于 -l
--noediting
如果 shell 是交互的,不使用 GNU readline 库来读命令行
--noprofile
不读取系统范围的启动文件 /etc/profile 或者任何个人初始化文件
~/.bash_profile, ~/.bash_login, 或 ~/.profile 。默认情况下,
bash 在作为登录 shell 启动时读取这些文件 (参见下面的启动(INVO-
CATION) 章节)
--norc 如果 shell 是交互的,不读取/执行个人初始化文件 ~/.bashrc 这个选
项在 shell 以 sh 命令启动时是默认启用的
--posix
如果默认操作与 POSIX 1003.2 标准不同的话,改变 bash 的行为来符合
标准 (posix mode)
--restricted
shell 成为受限的 (参见下面的 受限的shell(RESTRICTED SHELL) 章节)
--rpm-requires
产生一个为使脚本运行,需要的文件的列表。这个选项包含了 -n 选项。
它 是为了避免进行编译期错误检测时的限制-- Backticks, [] tests,
还有 evals 不会被解释,一些依赖关系可能丢失
--verbose
等价于 -v
--version
在标准输出显示此 bash 的版本信息并成功退出。
参数(ARGUMENTS)
如果选项处理之后仍有参数剩余,并且没有指定 -c 或 -s 选项,第一个参数 将
假定 为一个包含 shell 命令的文件的名字。如果 bash 是以这种方式启动的,
$0 将设置为这个文件的名字,位置参数将设置为剩余的其他参数。 Bash 从这个
文件中读取并执行命令,然后退出。 Bash 的退出状态是脚本中执行的最后一个
命令的退出状态。如果没有执行命令,退出状态是0。尝试的步骤是先试图打开在
当前目录中的这个文件,接下来,如果没有找到,shell 将搜索脚本的 PATH 环
境变量中的路径。
启动(INVOCATION)
login shell 登录 shell,参数零的第一个字符是 - ,或者 启动时指定了
--login 选项的 shell。
interactive 交互的 shell,是一个启动时没有指定非选项的参数,并且没有指
定 -c 选项,标准输出和标准输入都连接到了终端 (在 isatty(3) 中 判 定)
的shell ,或者启动时指定了 -i 选项的 shell。如果 bash 是交互的, PS1 环
境变量将被设置,并且 $- 包含 i ,允许一个 shell 脚本或者一个启动文件 来
检测这一状态。
下列段落描述了 bash 如何执行它的启动文件。如果这些启动文件中的任一个存
在但是不可读取, bash 将报告一个错误。文件名中的波浪号 (~,tilde) 将像
EXPANSION 章节中 Tilde Expansion 段描述的那样展开。
当 bash 是作为交互的登录 shell 启动的,或者是一个非交互的 shell 但是指
定了 --login 选项,它首先读取并执行 /etc/profile 中的命令,只要那个文件
存 在 。 读 取 那 个 文 件 之 后 , 它以如下的顺序查找 ~/.bash_profile,
~/.bash_login, 和 ~/.profile, 从存在并且可读的第一个文件中读取并执行 其
中的命令。 --noprofile 选项可以用来在 shell 启动时阻止它这样做。
当一个登录 shell 退出时, bash 读取并执行文件 ~/.bash_logout 中的命令,
只要它存在。
当一个交互的 shell 但不是登录 shell 启动时, bash 从文件 ~/.bashrc 中读
取 并 执行命令,只要它存在。可以用 --norc 选项来阻止它这样做。 --rcfile
file 选项将强制 bash 读取并执行文件 file 中的命令,而不是 ~/.bashrc 中
的。
当 bash 以非交互的方式启动时,例如在运行一个 shell 脚本时,它在环境中查
找变量 BASH_ENV ,如果它存在则将它的值展开,使用展开的值作为一个文件 的
名称,读取并执行。 Bash 运作的过程就如同执行了下列命令:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
但是没有使用 PATH 变量的值来搜索那个文件名。
如果 bash 以名称 sh 启动,它试图模仿 (mimic) sh 历史版本的启动过程,尽
可能地相似,同时也遵循 POSIX 标准。当作为交互式登录 shell 启动时,或者是
非 交 互 但 使 用 了 --login 选项启动的时候,它首先尝试读取并执行文件
/etc/profile 和 ~/.profile, 中的命令. 选项 --noprofile 用于避免这种 行
为.当使用命令 sh 来启动一个交互式的 shell 时, bash 查找环境变量 ENV, 如
果有定义的话就扩展它的值,然后使用扩展后的值作为要读取和执行的文件 的 名
称. 由 于 使 用 sh 启动的 shell 不会读取和执行任何其他的启动文件,选项
--rcfile 没有意义.使用名称 sh 启动的非交互的 shell 不会读取任何其他启动
文件.当以 sh 启动时, bash 在读取启动文件之后进入 posix 模式.
当 bash 以 posix 模式启动时,(和使用 --posix 命令行参数效果相同),它遵循
POSIX 标准. 这种模式下,交互式 shell 扩展 ENV 环境变量的值,读取并执行以
扩展后值为文件名的配置文件. 不会读取其他文件.
Bash 试着检测它是不是由远程 shell 守护程序,通常为 rshd 启动的.如果 bash
发现它是由 rshd 启动的,它将读取并执行 ~/.bashrc 文件中的命令, 只要这 个
文件存在并且可读.如果以 sh 命令启动,它不会这样做. 选项 --norc 可以用来
阻止这种行为,选项 --rcfile 用来强制读取另一个文件,但是通常 rshd 不会 允
许它们, 或者用它们来启动 shell.
如果 shell 是以与真实用户(组) id 不同的有效用户(组) id 来启动的, 并且没
有 - 选项,那么它不会读取启动文件, 也不会从环境中继承 shell 函数. 环境变
量中如果出现 SHELLOPTS,它将被忽略.有效用户 id 将设置为真实用户 id. 如
果启动时给出了 - 选项,那么启动时的行为是类似的, 但是不会重置有效用户 id.
定义(DEFINITIONS)
下列定义在文档余下部分中通用.
blank 空白
一个空格或是 tab .
word 词
一个字符序列, shell 将它们视为一个结构单元. 也称为一个 token片段
。
name 名称
一个只由字母,数字和下划线构成的词,并且以字符或下划线起始. 也称为
一个 word identifier标识符.
metacharacter 元字符
一个字符, 如果不是引用的话, 将成为词的分隔符. 它是如下字符之一:
| & ; ( ) < > space tab
control operator 控制操作符
一个 token(标识), 拥有控制功能. 它是如下符号之一:
|| & && ; ;; ( ) | <newline>
保留字(“RESERVED WORDS”)
Reserved words( 保留字) 是对 shell 有特殊意义的词. 下列词被识别为保留
的, 如果不是引用, 并且不是一个简单命令的起始词 (参见 下 面 的 shell 语
法("SHELL GRAMMAR") ), 也不是 case 或者 for 命令的第三个词:
! case do done elif else esac fi for function if in select then until
while { } time [[ ]]
shell语法(“SHELL GRAMMAR”)
Simple Commands 简单命令
simple command(简单命令) 是(可选的)一系列变量赋值, 紧接着是 blank(空格)
分隔的词和重定向, 然后以一个 controloperator 结束. 第一个词指明了要执行的
命令, 它被作为第 0 个参数. 其余词被作为这个命令的参数.
simple command 简单命令的返回值是它的退出状态, 或是 128+n, 如果命令被 signal(信号) n 结束的话.
Pipelines 管道
pipeline(管道) 是一个或多个命令的序列,用字符 | 分隔。管道的格式是这样:
[time [-p]] [ ! ] command [ | command2 ... ]
命令 command 的标准输出通过管道连接到命令 command2 的标准输入。连接是在
命令指定的任何重定向之前进行的(参见下面的 REDIRECTION 重定向)。
如果 保留字 ! 作为管道前缀,管道的退出状态将是最后一个命令的退出状态的
逻辑非值。否则,管道的退出状态就是最后一个命令的。 shell 在返回退出状态
值之前,等待管道中的所有命令返回。
如果 保留字 time 作为管道前缀,管道中止后将给出执行管道耗费的用户和系统
时间。选项 -p 将使输出符合 POSIX 指定的格式。环境变量 TIMEFORMAT 可以设
置为 一个格式字符串,指定时间信息应当如何显示;参见下面的 Shell Vari-
ables 环境变量中 TIMEFORMAT 的讲述。
管道中的每个命令都作为单独的进程来执行(即,在一个子 shell 中启动)。
Lists 序列
list(序列)是一个或多个管道,用操作符 ;, &, &&, 或 ││ 分隔的序列, 并且可
以选择用 ;, &, 或 <newline>新行符结束.
这些序列操作符中, && 和 ││ 优先级相同,其次是 ; 和 &, 它们的优先级是相
同的。
序列中可以有一个或多个新行符来分隔命令,而不是使用分号分隔。
如果一个命令是由控制操作符 & 结束的, shell 将在后台的子 shell 中执行 这
个 命令。 shell 不会等待命令执行结束,返回状态总是 0。以分号 ; 分隔的命
令会被顺序执行;shell 会等待每个命令依次结束。返回状态是最后执行的命 令
的返回状态。
控制操作符 && 和 ││ 分别代表 AND 和 OR 序列。一个 AND 序列的形式是
command1 && command2
command2 只有在 command1 返回 0 时才被执行。
一个 OR 序列的形式是
command1 ││ command2
command2 只有在 command1 返回非 0 状态时才被执行。AND 和 OR 序列的返回
状态是序列中最后执行的命令的返回状态。
Compound Commands 复合命令
compound command(复合命令) 是如下情况之一:
(list)
list 序列将在一个子 shell 中执行。变量赋值和影响 shell 环境变量
的内建命令在命令结束后不会再起作用。返回值是序列的返回值。
{ list; }
list 序列将在当前 shell 环境中执行。序列必须以一个新行符或分号结
束。这种做法也称为 group command(命令组)。返回值是序列的返回值。
注意与元字符 ( 和 ) 不同, { 和 } 是 reserved words(保留字),必须
出现在能够识别保留字的场合。由于它们不会产生断词 (cause a word
break),它们和序列之间必须用空格分开。
((expression))
表达式 expression 将被求值。求值规则在下面的 算术求值 (ARITH-
METIC EVALUATION) 章节中描述。如果表达式的值非零,返回值就是 0;
否则返回值是 1。这种做法和 let "expression" 等价。
[[ expression ]]
返 回 0 或 1,取决于条件表达式 expression 求值的情况。表达式是由
下面 CONDITIONAL EXPRESSIONS 条件表达式章节中描述的原语 (pri-maries) 组成。
[[ 和 ]] 中的词不会进行词的拆分和路径的扩展处理;
而 tilde 扩展,参数和变量扩展,算术扩展,命令替换,函数替换和引用
的去除则都将进行。
当使用 == 和 != 操作符时,操作符右边的字符串被认为是一个模式,根
据下面 Pattern Matching(模式匹配) 章节中的规则进行匹配。如果匹配
则返回值是 0,否则返回 1。模式的任何部分可以被引用,强制使它作为
一个字符串而被匹配。
表达式可以用下列操作符结合起来。根据优先级的降序列出如下:
( expression )
返回表达式 expression 的值。括号可以用来提升操作符的优先级。
! expression
返回真,如果表达式 expression 返回假。
expression1 && expression2
返回真,如果表达式 expression1 和 expression2 都返回真。
expression1 || expression2
返回真,如果表达式 expression1 或者 expression2 二者之一返回真。
&&(与) 和 || 操作符不会对表达式 expression2 求值,如果 expres-
sion1 可以决定整个条件表达式的返回值的话。
for name [ in word ] ; do list ; done
in 之后的一系列词会被扩展,产生一个项目列表。变量 name 被依次赋
以这个列表中的每个元素,序列 list 每次都被执行。如果 in word 被
忽略,那么 for 命令遍历已设置的位置参数(positional parameter,参
见下面的 PARAMETERS 参数),为每一个执行一次序列 list。返回值是最
后一个命令的返回值。如果 in 之后的词扩展的结果是空列表,就不会执
行任何命令,返回值是 0。
for (( expr1 ; expr2 ; expr3 )) ; do list ; done
首先,算术表达式 expr1 被根据下面 算术求值 (ARITHMETIC EVALUA-
TION) 中的规则进行求值。然后算术表达式 expr2 被循环求值,直到它
等于 0。每次 expr2 结果非零时,序列 list 都被执行,算术表达式
expr3 被求值。如果任何表达式被忽略,将被视为执行结果是 1。返回值
是序列 list 中被执行的最后一个命令的返回值;或者是 false,如果任
何表达式非法的话。
select name [ in word ] ; do list ; done
in 之后的一系列词会被扩展,产生一个项目列表。这个扩展后的词集合
被输出到标准错误上,每个前面加上一个数字。如果 in word 被忽略 ,
将输出位置参数 (参见下面的 PARAMETERS 参数章节)。 PS3 提示符将被
显示出来,等待从标准输入得到一行输入。如果输入是一个数字且显示中
有对应的词,那么变量 name 的值将设置为这个词。如果输入一个空行,
那么词和提示符将再次显示出来。如果读入了一个 EOF,命令就结束。任
何 其 他 值将设置变量 name 为空。读入的行保存为变量 REPLY. 序列
list 在每次选择之后都会执行,直到执行了一个 break 命令。 select
的退出状态是序列 list 中执行的最后一个命令的退出状态,如果没有执
行命令就是 0。
case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
case 命令首先扩展 word, 然后依次试着用每个 pattern 来匹配它, 使
用 与路径扩展相同的匹配规则(参见下面的 Pathname Expansion 路径扩
展章节)。如果找到一个匹配,相应的序列将被执行。找到一个匹配之 后
,不会再尝试其后的匹配。如果没有模式可以匹配,返回值是 0。否则,
返回序列中最后执行的命令的返回值。
if list; then list; [ elif list; then list; ] ... [ else list; ] fi
序列 if list 被执行。如果退出状态是 0,then list 将被执行。否 则
, 每个 elif 将被一次执行,如果退出状态是 0,相应的 then list 将
被执行,命令结束。否则,else list 将被执行,如果存在的话。退出状
态是最后执行的命令的退出状态,或者是 0,如果所有条件都不满足。
while list; do list; done
until list; do list; done
while 命令不断地执行序列 do list,直到序列中最后一个命令返回 0。
until 命令和 while 命令等价,除了对条件的测试恰好相反;序列 do
list 执行直到序列中最后一个命令返回非零状态值。 while 和 until
命令的退出状态是序列 do list 中最后一个命令的退出状态,或者是 0
,如果没有执行任何命令。
[ function ] name () { list; }
这样可以定义一个名为 name 的函数。函数体 body 是包含在 { 和 } 之
间的命令序列 list。在指定将 name 作为一个命令运行的场合,这个 序列
将被执行。函数的退出状态是函数体最后执行的命令的退出状态(参见
下面的 FUNCTIONS 函数章节)。
注释(COMMENTS)
在非交互的 shell 中或者使用内建命令 shopt 启用 了 interactive_comments
选项的交互的 shell 中,以 # 起始的词使得这个词和所有同一行上所有剩余的
字符都被忽略。没有启用 interactive_comments 选项的交互式 shell 不允许出
现 注释。这个选项在交互式 shell 中是默认启用的 (参见下面的 shell 内建命
令(SHELL BUILTIN COMMANDS) 章节)。
引用(QUOTING)
引用 Quoting 用来去掉特定字符或词的特殊意义。引用可以用来禁止对特殊字符 的处理,阻止保留字被识别,还用来阻止参数的扩展。 上面在 DEFINITIONS 定义中列出的每个元字符 metacharacters 对于 shell 都 有特殊意义。如果要表达它的本义,必须引用它。 在使用命令行历史扩展功能时,history expansion 字符,通常是 !,必须被 引 用,才不会进行历史扩展。 有三种引用机制:转义字符 (escape character), 单引号和双引号。 一个未被引用的反斜杠 (\) 是转义字符 escape character。它保留其后下一个 字符的字面意义,除非那是一个新行符。如果 \ 和新行符成对出现,并且反斜杠 自身没有被引用,那么 \<newline> 被视为续行标志 (意思是,它被从输入流中 删除并忽略了)。 将字符放在单引号之中,将保留引用中所有字符的字面意义。单引号不能包含 在 单引号引用之中,即使前面加上了反斜杠。 将字符放在双引号中,同样保留所有字符的字面意义,例外的情况是 $, ‘, 和 \ 。字符 $ 和 ‘ 在双引号中仍然具有特殊意义。反斜杠只有后面是下列字符时才 有特殊意义: $, ‘, ", \, 或 <newline>. 双引号可以包含在双引号引用中, 但要在前面加上一个反斜杠。 特殊的参数 * 和 @ 在双引号中有特殊意义(参见下面的 PARAMETERS 参数章节)。 形式为 $’string’ 的词会被特殊处理。它被扩展为 string,其中的反斜杠转义 字符被替换为 ANSI C 标准中规定的字符。反斜杠转义序列,如果存在的话, 将 做如下转换: \a alert (bell) 响铃 \b backspace 回退 \e an escape character 字符 Esc \f form feed 进纸 \n new line 新行符 \r carriage return 回车 \t horizontal tab 水平跳格 \v vertical tab 竖直跳格 \\ backslash 反斜杠 \’ single quote 单引号 \nnn 一个八
比特字符,它的值是八进制值 nnn (一到三个数字)。 \xHH 一个八比特字符,它的值是十六进制值 HH (一到两个十六进制数 字)。 \cx 一个 ctrl-x 字符 扩展结果是单引号引用的,就好像 $ 符号不存在一样。 双引号引用字符串前面加上一个 $ 符号将使得这个字符串被根据当前语言环境 (locale) 来翻译。如果当前语言环境是 C 或者 POSIX,这个符号将被忽略。如 果这个字符串被翻译并替换了,那么替换结果是双引号引用的。
参数(PARAMETERS)
一个参数 parameter 是一个储存值的实体。它可以是一个名称 name, 一个数字
或者是下面 Special Parameters 特殊参数章节中列出的特殊字符之一。从
shell 的角度来看,一个变量 variable 是一个由名称 name 代表的参数。一个
变量 有一个值 value 以及零个或多个属性 attibutes。属性可以使用内建命令
declare 来设置(参见下面 shell 内建命令(SHELL BUILTIN COMMANDS) 章节中对
declare 的描述)。
如果给一个参数赋值,那么它就被定义了。空字符串是有效的值。一旦一个变量
被定义了,它只能用内建命令 unset 来取消(参见下面 shell 内建 命 令(SHELL
BUILTIN COMMANDS) 章节).
一个变量 variable 可以用这样的语句形式来赋值:
name=[value]
如果没有给出值 value,变量就被赋为空字符串。所有值 values 都经过了波浪
线扩展,参数和变量扩展,命令替换,算术扩展和引用的删 除( 参 见 下 面 的
EXPANSION 扩展章节)。如果变量设置了 integer 整数属性,那么值 value 将进
行算术扩展,即使没有应用 $((...)) 扩展 (参见下面的 Arithmetic Expansion
算术扩展章节)。不会进行词的拆分,除非是下面 Special Parameters 特殊参数
中提到的 "$@"。不会进行路径的扩展。赋值语句也出现在下列内建命令中,作为
它们的参数: declare, typeset, export, readonly, 和 local 。
Positional Parameters 位置参数
位置参数 positional parameter 是以一或多个数字代表的参数,除了 0。位置
参数是在 shell 启动时,根据它的参数来赋值的,也可以用内建命令 set 来重
新赋值。位置参数不能用赋值语句来赋值。在一个 shell 函数被执行的时候,位
置参数会被暂时地替换掉 (参见下面的 FUNCTIONS 函数章节)。
当位置参数由两个以上的数字构成时,它必须放在括号内 (参见下面 的 EXPAN-
SION 扩展章节)。
Special Parameters 特殊参数
shell 对一些参数做特殊处理。这些参数只能被引用而不能被赋值。
* 扩展为位置参数,从 1 开始。如果扩展发生在双引号中,它扩展为一个
词,值是各个参数,以特殊变量 IFS 的第一个字符分隔 。 也 就 是 说
,"$*" 等价于 "$1c$2c...",这里 c 是变量 IFS 的第一个字符。如果
没有设置 IFS,那么参数将用空格分隔。 IFS
@ 扩展为位置参数,从 1 开始。如果扩展发生在双引号中,每个参数都 将
扩展为一个词。也就是说, "$@" 等价于 "$1" "$2" ... 如果位置参数
不存在,"$@" 和 $@ 扩展为空 (即,它们被删除了)。
# 扩展为位置参数的个数,以十进制表示。
? 扩展为最近执行的前台管道的状态。
- 扩展为当前选项标志。标志是在启动时或以内建命令 set 指定的,或者
是 shell 自身设置的 (例如选项 -i )。
$ 扩展为 shell 的进程 ID。在一个 () 子 shell 中,它扩展为当前
shell 的进程 ID 而不是子 shell 的。
! 扩展为最近一次执行的后台 (异步) 命令的进程号。
0 扩展为 shell 或者 shell 脚本的名称。这个变量是在 shell 初始化 时
设置的。如果 bash 是执行脚本文件时启动的, $0 将设置为那个文件的
名称。如果 bash 启动时的参数包含 -c,那么 $0 被设置为启动命令 行
被 执行后的第一个参数,如果有的话。否则,它被设置为用来启动 bash
的文件名,就是参数 0。
_ shell 启动时,设置为 shell 或参数中被执行的 shell 脚本的绝对路径
名。然后,在扩展时扩展为上一个命令的最后一个参数。它也被设置为被
执行的每个命令的文件全名并且被设置到这个命令执行的环境当中。当检
查邮件时,这个参数保存着正在检查的邮件文件的名称。
Shell Variables 变量
shell 定义了下列变量:
BASH 扩展为用来启动当前 bash 实例的文件全名。
BASH_VERSINFO
一个只读数组变量,成员保存着当前 bash 实例的版本信息。赋予数组元
素的值是如下这些:
BASH_VERSINFO[0] 主版本号 (release).
BASH_VERSINFO[1] 次版本号 (version).
BASH_VERSINFO[2] 补丁版本
BASH_VERSINFO[3] 编译信息
BASH_VERSINFO[4] 发布时的状态 (例如, beta1).
BASH_VERSINFO[5] MACHTYPE 平台类型
BASH_VERSION
扩展为一个字符串,描述了这个 bash 实例的版本。
COMP_CWORD
${COMP_WORDS} 的索引,指向当前光标位置所在的词。这个变量只有在被
可 编程补全功能 (参见下面的 Programmable Completion 章节) 调用的
shell 函数中才可用。
COMP_LINE
当前命令行。这个变量只有在被命令补全功能调用的 shell 函数和外部
命令中才可用。
COMP_POINT
相对于当前命令起始处的当前光标位置。如果当前光标位置是当前命令的
末端,它的值就和 ${#COMP_LINE} 相等。这个变量只有在被命令补全功
能调用的 shell 函数和外部命令中才可用。
COMP_WORDS
一个数组变量 (参见下面的 Arrays(数组)一节),由当前命令行的各个单
词构成。这个变量只有在被命令补全功能调用的 shell 函数中才可用。
DIRSTACK
一个数组变量,包含当前目录栈的内容。栈中的目录排列的顺序就是用内
建命令 dirs 显示时的顺序。对这个数组变量的成员赋值可以用来修改栈
中已有的目录,但是要添加和删除目录就必须使用内建命令 pushd 和
popd。对它赋值不会改变当前目录。如果取消了 DIRSTACK 的定义,它就
失去了它的特殊意义,即使后来重新定义它。
EUID 扩展为当前用户的有效用户 ID。它在 shell 启动时设置。它是只读的。
FUNCNAME
当前执行的 shell 函数名。这个变量只有在执行一个 shell 函数时存在
。向 FUNCNAME 赋值没有效果并且返回一个错误。如果取消了 FUNCNAME
的定义,它就失去了特殊的意义,即使后来重新定义它。
GROUPS 一个数组变量,包含当前用户所属的组的列表。向 GROUPS 赋值没有效果
并且返回一个错误。如果取消了 GROUPS 的定义,它就失去了特殊的意义
,即使后来重新定义它。
HISTCMD
当前命令的历史编号,或者历史列表中的索引。如果取消了 HISTCMD 的
定义,它就失去了特殊的意义,即使后来重新定义它。
HOSTNAME
自动设置为当前的主机名。
HOSTTYPE
自动设置为一个字符串,唯一地标识着正在运行 bash 的机器类型。默认
值是系统相关的。
LINENO 每次引用这个参数时,shell 将它替换为一个指示在脚本或函数中当前行
号的十进制数字(从 1 开始)。如果不是在脚本或函数中,替换得到的 值
不一定有意义。如果取消了 LINENO 的定义,它就失去了特殊的意义,即
使后来重新定义它。
MACHTYPE
自动设置为一个字符串,完整的描述了正在运行 bash 的系统类型,格式
是标准的 GNU cpu-company-system 格式。默认值是系统相关的。
OLDPWD 上一次命令 cd 设置的工作目录。
OPTARG 内建命令 getopts 处理的最后一个选项参数值 (参见下面的 shell 内建
命令(SHELL BUILTIN COMMANDS) 章节)。
OPTIND 内建命令 getopts 将处理的下一个参数的索引 (参见下面的 shell 内建
命令(SHELL BUILTIN COMMANDS) 章节)。
OSTYPE 自动设置的一个字符串,描述了正在运行 bash 的操作系统。默认值是系
统相关的。
PIPESTATUS
一个数组变量 (参见下面的 Arrays 数组章节),包含最近执行的前台 管
道中的进程(可能只包含一个命令)的退出状态。
PPID shell 的父进程的进程号。这个变量是只读的。
PWD 由 cd 命令设置的当前工作目录。
RANDOM 每次引用这个参数时,都会产生一个 0 到 32767 之间的随机整数。可以
通过向 RANDOM 赋值来初始化随机数序列。如果取消了 RANDOM 的定义,
它就失去了特殊的意义,即使后来重新定义它。
REPLY 变量的值将作为内建命令 read 的输入,如果命令没有参数的话。
SECONDS
每 次引用这个参数时,返回 shell 自运行以来的秒数。如果向 SECONDS
赋值,此后对它的引用将返回自赋值时起的秒数加上所赋予的值。如果取
消 SECONDS 的定义,它就失去了特殊的意义,即使后来重新定义它。
SHELLOPTS
一个冒号分隔的被允许的 shell 选项列表。列表中每个词都是内置命令
set 的 -o 选项的有效参数。 SHELLOPTS 中出现的选项也是 set -o 显
示为 on 的选项。如果 bash 启动时从环境中找到这个变量,那么在读取
任何配置文件之前,列表中的每个选项都将被设置。这个变量是只读的。
SHLVL 每次启动一个 bash 的实例时都会增加。
UID 扩展为当前用户的 ID,在启动时初始化。这个变量是只读的。
下列变量被 shell 使用。有时 bash 会为变量赋默认值;这些情况在下面会标出
。
BASH_ENV
如果 bash 在执行一个 shell 脚本时设定了这个变量,它的值将被解 释
为一个文件名,包含着初始化 shell 用到的命令,就像 ~/.bashrc 中一
样。 BASH_ENV 的值在被解释为一个文件名之前要经过参数扩展,命令替
换和算术扩展。不会使用 PATH 来查找结果文件名。
CDPATH 命 令 cd 的搜索路径。这是一个冒号分隔的目录列表,shell 从中查找
cd 命令的目标目录。可以是这样: ".:~:/usr".
COLUMNS
用在内建命令 select 当中,用来判断输出选择列表时的终端宽度。自动
根据 SIGWINCH 信号来设置。
COMPREPLY
一个数组变量,bash 从中读取可能的命令补全。它是由命令补全功能调
用的 shell 函数产生的。
FCEDIT 内建命令 fc 默认的编辑器。
FIGNORE
一个冒号分隔的后缀名列表,在进行文件名补全时被忽略 (参见下 面 的
READLINE 章节)。一个后缀满足其中之一的文件名被排除在匹配的文件名
之外。可以是这样: ".o:~".
GLOBIGNORE
一个冒号分隔的模式列表,定义了路径名扩展时要忽略的文件名集合。如
果一个文件名与路径扩展模式匹配,同时匹配 GLOBIGNORE 中的一个模式
时,它被从匹配列表中删除。
HISTCONTROL
如果设置为 ignorespace, 以 space 开头的行将不会插入到历史列表 中
。 如果设置为 ignoredups, 匹配上一次历史记录的行将不会插入。设置
为 ignoreboth 会结合这两种选项。如果没有定义,或者设置为其他值,
所有解释器读取的行都将存入历史列表,但还要经过 HISTIGNORE 处理。
这个变量的作用可以被 HISTIGNORE 替代。多行的组合命令的第二和其余
行都不会被检测,不管 HISTCONTROL 是什么,都会加入到历史中。
HISTFILE
保 存 命 令 历史的文件名 (参见下面的 HISTORY 历史章节)。默认值是
~/.bash_history。如果取消定义,在交互式 shell 退出时命令历史将不
会保存。
HISTFILESIZE
历史文件中包含的最大行数。当为这个变量赋值时,如果需要的话,历史
文件将被截断来容纳不超过这个值的行。默认值是 500。历史文件在交互
式 shell 退出时也会被截断到这个值。
HISTIGNORE
一个冒号分隔的模式列表,用来判断那个命令行应当保存在历史列表中。
每个模式都定位于行首,必须匹配整行 (没有假定添加 ‘*’)。在 HIST-
CONTROL 指定的测试结束后,这里的每个模式都要被测试。除了平常的
shell 模式匹配字符, ‘&’ 匹配上一个历史行。‘&’ 可以使用反斜杠 来
转义;反斜杠在尝试匹配之前将被删除。多行的组合命令的第二行以及后
续行都不会被测试,不管 HISTIGNORE 是什么,都将加入到历史中。
HISTSIZE
命令历史中保存的历史数量 (参见下面的 HISTORY 历史章节)。默认值是
500。
HOME 当前用户的个人目录;内建命令 cd 的默认参数。在执行波浪线扩展时也
用到这个变量。
HOSTFILE
包含一个格式和 /etc/hosts 相同的文件名,当 shell 需要补全主机 名
时要读取它。shell 运行过程中可以改变可能的主机名补全列表;改变之
后下一次需要主机名补全时 bash 会将新文件的内容添加到旧列表中。如
果 定义了 HOSTFILE 但是没有赋值,bash 将尝试读取 /etc/hosts 文件
来获得可能的主机名补全列表。当取消 HOSTFILE 的定义时,主机名列表
将清空。
IFS 内部字段分隔符 Internal Field Separator 用来在扩展之后进行分词,
使 用 内 部 命 令 read 将 行 划 分 成 词 。 默 认 值 是
‘‘<space><tab><newline>’’。
IGNOREEOF
控制交互式 shell 接受到唯一一个 EOF 字符时的行为。如果有定义,值
是需要在一行的开始连续输入 EOF 字符,直到可以使 bash 退出的字 符
个数。如果这个变量存在,但是值不是一个数字或者没有赋值,默认值是
10。如果变量没有定义, EOF 标志着输入的结束。
INPUTRC
readline 的启动配置文件,而不是默认的 ~/.inputrc (参 见 下 面 的
READLINE 章节)。
LANG 用来决定没有特地用 LC_ 变量指定的语言环境项。
LC_ALL 这个变量超越了 LANG 和所有其他指定语言环境项的 LC_ 变量。
LC_COLLATE
这个变量决定了为路径扩展的结果排序时的字母顺序,决定了范围表达式
的行为,等价类,和路径扩展中的归并顺序以及模式匹配。
LC_CTYPE
这个变量决定了字符的解释和路径扩展以及模式匹配中字符类的行为。
LC_MESSAGES
这个变量决定了翻译以 $ 前导的双引号字符串时的语言环境。
LC_NUMERIC
这个变量决定了格式化数字时的语言环境分类。
LINES 内建命令 select 用它来判断输出选择列表时的列宽度。在 收 到 SIG-
WINCH 信号时自动设置。
MAIL 如果这个参数设置为一个文件名,并且没有设置环境变量 MAILPATH 的话
, bash 将在这个文件中通知用户有邮件到达。
MAILCHECK
指定 bash 检查邮件的频率是多少,以秒为单位。默认值是 60 秒。需要
检查邮件的时候,shell 在显示提示符之前将进行检查。如果取消它的定
义,或者设置为并非大于等于零的数值,shell 将禁止邮件检查。
MAILPATH
一个冒号分隔的文件名列表,从中检查邮件。当邮件到达某个特殊文件中
时 ,输出的特定消息可以通过将文件名与消息以 ‘?’ 分隔来指定。在消
息的文本中,$_ 扩展为当前邮件文件的文件名。例如:
MAILPATH=’/var/mail/bfox?"You have mail":~/shell-mail?"$_ has
mail!"’
Bash 为这个变量提供默认值,但是它使用的用户邮件文件的位置是系统
相关的 (例如,/var/mail/$USER)。
OPTERR 如果设置为 1, bash 显示内建命令 getopts 产生的错误消息 (参见 下
面的 shell 内建命令(SHELL BUILTIN COMMANDS) 章节)。每次 shell 启
动时或者一个 shell 脚本被执行时 OPTERR 被初始化为 1。
PATH 搜索命令的路径。它是一个冒号分割的目录列表,shell 从中搜索命令 (
参见下面的 命令执行(COMMAND EXECUTION) 段落)。默认的路径是系统相
关的,是由安装 bash 的系统管 理 员 设 置 的 。 通 常 它 的 值 是
‘‘/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:.’’。
POSIXLY_CORRECT
如果 bash 启动环境中有这个变量,它将在读取启动配置文件之前进入
posix mode,就好像提供了 --posix 启动参数一样。如果 shell 运行过
程 中设置了它,bash 就启用 posix mode,就好像执行了 set -o posix
命令一样。
PROMPT_COMMAND
如果有定义,它的值将作为一个命令,每次显示主提示符之前都会执行。
PS1 这个参数的值被扩展 (参见下面的 PROMPTING 提示符段落),用作主提示
符字符串。默认值是 ‘‘\s-\v\$ ’’。
PS2 这个参数的值同 PS1 一起被扩展,用作次提示符字符串。默认值是 ‘‘>
’’。
PS3 这 个 参 数的值被用作内建命令 select 的提示符 (参见上面的 SHELL
GRAMMAR 语法章节)。
PS4 这个参数的值同 PS1 一起被扩展,在执行跟踪中在 bash 显示每个命 令
之 前显示。需要的话, PS4 的第一个字符会被复制多次,来指示 indi-
rection 的层数。默认值是 ‘‘+ ’’。
TIMEFORMAT
在前缀 time 保留字的管道中,这个参数的值用作格式字符串,指定计时
信 息如何显示。字符 % 引入的转义序列,被扩展为时间值或其他信息。
转义序列和它们的含义如下所示;括号中是可选的成分。
%% 一个字面上的 %。
%[p][l]R 经历的时间,以秒计算。
%[p][l]U CPU 在用户模式下执行的秒数。
%[p][l]S CPU 在系统模式下执行的秒数。
%P CPU 使用率,算法是 (%U + %S) / %R。
可选的 p 是指定精度 (小数点后数字位数) 的数值。如果是 0 就不输出
小数点或小数值。最多指定到小数点后三位;如果 p 大于 3 就会被改为
3。如果没有指定 p,默认使用 3。
可选的 l 指定了长格式,包含分钟,格式是 MMmSS.FFs。 p 的值决定了
是不是包含小数位。
如 果 没 有 设 置 这 个 值 ,bash 假 定 它 的 值 是
$’\nreal\t%3lR\nuser\t%3lU\nsys%3lS’。如果它是空值,就不会显示计
时信息。显示格式字符串的时候,会加上一个前导的新行符。
TMOUT 如果设置为大于 0 的值,TMOUT 被当作内建命令 read 的默认超时等待
时间。如果等待终端输入时, TMOUT 秒之后仍然没有输入, select 命
令 将终止。在交互的 shell 中,它的值被解释为显示了主提示符之后等
待输入的秒数。如果经过这个秒数之后仍然没有输入, Bash 将退出。
auto_resume
这个变量控制了 shell 如何与用户和作业控制交互。如果设置了这个 变
量,一个不包含重定向的单个词的简单命令,将作为恢复被中断的作业的
指示。不允许出现模棱两可的情况;如果有多个作业都以这个词起始,将
恢复最近运行的作业。在这种情形下,被中断的作业的 name 是用于启动
它的命令行。如果值设置为 exact,给出的字符串必须精确匹配被中断的
作业名;如果设置为 substring,给出的字符串需要匹配被中断的作业名
的子串。值 substring 的功能与作业标识符 %? 功能类似 (参见下面的
JOB CONTROL 作业控制章节)。如果设置为任何其他值,给出的字符串必
须是被中断的作业的前缀;这样做与作业标识符 % 功能类似。
histchars
两到三个字符,控制着历史扩展和分段 (tokenization,参 见 下 面 的
HISTORY EXPANSION 历史扩展章节)。第一个字符是 history expansion(
历史扩展) 字符,这个字符表明了历史扩展的开始,通常是 ‘!’。第二个
字符是 quick substitution(快速替换) 字符,它是重新运行上次输入的
命令,但将命令中的字符串替换为另一个的简写,默认是 ‘^’。可选的第
三个字符是指示如果作为一个词的开始,那么一行中剩余字符是注释。通
常这个字符是 ‘#’。历史注释字符使得对一行中剩余字符在历史替换中被
跳过。它不一定使 shell 解释器将这一行的剩余部分当作注释。
Arrays
Bash 提供了一维数组变量。任何变量都可以作为一个数组;内建命令 declare
可以显式地定义数组。数组的大小没有上限,也没有限制在连续对成员引用和 赋
值时有什么要求。数组以整数为下标,从 0 开始。
如果变量赋值时使用语法 name[subscript]=value,那么就会自动创建数组。
subscript 被当作一个算术表达式,结果必须是大于等于 0 的值。要显式地定义
一个数组,使用 declare -a name (参见下面的 shell 内建命令(SHELL BUILTIN
COMMANDS) 章节)。也可以用 declare -a name[subscript] 这时 subscript 被
忽略。数组变量的属性可以用内建命令 declare 和 readonly 来指定。每个属性
对于所有数组元素都有效。
数组赋值可以使用复合赋值的方式,形式是 name=(value1 ... valuen),这里每
个 value 的形式都是 [subscript]=string。string 必须出现。如果出现了可选
的括号和下标,将为这个下标赋值,否则被赋值的元素的下标是语句中上一次 赋
值 的下标加一。下标从 0 开始。这个语法也被内建命令 declare 所接受。单独
的数组元素可以用上面介绍的语法 name[subscript]=value 来赋值。
数组的任何元素都可以用 ${name[subscript]} 来引用。花括号是必须的,以 避
免 和路径扩展冲突。如果 subscript 是 @ 或是 *,它扩展为 name 的所有成员
。这两种下标只有在双引号中才不同。在双引号中,${name[*]} 扩展为一个词,
由 所有数组成员的值组成,用特殊变量 IFS 的第一个字符分隔;${name[@]} 将
name 的每个成员扩展为一个词。如果数组没有成员,${name[@]} 扩展为空串 。
这 种不同类似于特殊参数 * 和 @ 的扩展 (参见上面的 Special Parameters 段
落)。${#name[subscript]} 扩展为 ${name[subscript]} 的长度。 如果 sub-
script 是 * 或者是 @,扩展结果是数组中元素的个数。引用没有下标数组变量
等价于引用元素 0。
内建命令 unset 用于销毁数组。unset name[subscript] 将销毁下 标 是 sub-
script 的元素。 unset name, 这里 name 是一个数组,或者 unset name[sub-
script], 这里 subscript 是 * 或者是 @,将销毁整个数组。
内建命令 declare, local, 和 readonly 都能接受 -a 选项,从而指定一个数组
。 内建命令 read 可以接受 -a 选项,从标准输入读入一列词来为数组赋值。内
建命令 set 和 declare 使用一种可以重用为输入的格式来显示数组元素。
扩展(EXPANSION)
命令行的扩展是在拆分成词之后进行的。有七种类型的扩展: brace expansion(
花括号扩展), tilde expansion(波浪线扩展), parameter and variable
expansion(参数和变量扩展), command substitution(命令替换), arithmetic
expansion(算术扩展), word splitting(词的拆分), 和 pathname expansion(路
径扩展).
扩展的顺序是:brace expansion, tilde expansion, parameter, variable 和
arithmetic expansion 还有 command substitution (按照从左到右的顺序),
word splitting, 最后是 pathname expansion.
还有一种附加的扩展:process subtitution (进程替换) 只有在支持它的系统中有效。
只有 brace expansion, word splitting, 和 pathname expansion 在扩展前后
的词数会发生改变;其他扩展总是将一个词扩展为一个词。唯一的例外是上面提
到的 "$@" 和 "${name[@]}" (参见 PARAMETERS参数)。
Brace Expansion
Brace expansion 是一种可能产生任意字符串的机制。这种机制类似于 pathname
expansion, 但是并不需要存在相应的文件。花括号扩展的模式是一个 可选 的
preamble(前导字符), 后面跟着一系列逗号分隔的字符串,包含在一对花括号中
,再后面是一个可选的 postscript(附言)。前导被添加到花括号中的每个字符串
前面,附言被附加到每个结果字符串之后,从左到右进行扩展。
花括号扩展可以嵌套。扩展字符串的结果没有排序;而是保留了从左到右的顺序
。例如, a{d,c,b}e 扩展为 ‘ade ace abe’。
花括号扩展是在任何其他扩展之前进行的,任何对其他扩展有特殊意义的字符都
保留在结果中。它是严格字面上的。 Bash 不会对扩展的上下文或花括号中的文
本做任何语义上的解释。
正确的花括号扩展必须包含没有引用的左括号和右括号,以及至少一个没有引用
的 逗号。任何不正确的表达式都不会被改变。可以用反斜杠来引用 { 或 , 来阻
止将它们识别为花括号表达式的一部分。为了避免与参数扩展冲突,字符串 ${
不被认为有效的组合。
这种结构通常用来简写字符串的公共前缀远比上例中为长的情况,例如:
mkdir /usr/local/src/bash/{old,new,dist,bugs}
或者:
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
花括号扩展导致了与历史版本的 sh 的一点不兼容。在左括号或右括号作为词的
一部分出现时, sh 不会对它们进行特殊处理,会在输出中保留它们。 Bash 将
括号从花括号扩展结果的词中删除。例如,向 sh 输入 file{1,2} 会导致不变的
输出。同样的输入在 bash 进行扩展之后,会输出 file1 file2 . 如果需要同
sh 严格地保持兼容,需要在启动 bash 的时候使用 +B 选项,或者使用 set 命
令加上 +B 选项来禁用花括号扩展 (参见下面的 shell 内建命令(SHELL BUILTIN
COMMANDS) 章节)。
Tilde Expansion
如果一个词以没有引用的波浪线字符 (‘~’) 开始,所有在第一个没有引用的斜线
(‘/’) 之前的字符 (或者是这个词的所有字符,如果没有没引用的斜线的话) 都
被认为是 tilde-prefix(波浪线前缀)。如果 tilde-prefix 中没有被引用的字符
,那么波浪线之后的字符串被认为是 login name(登录名)。如果登录名是空字符
串 ,波浪线将被替换为 shell 参数 HOME 的值。如果没有定义 HOME,将替换为
执行此 shell 的用户的个人目录。否则,tilde-prefix 被替换为与指定登录 名
相联系的个人目录。
如果 tilde-prefix 是 ‘~+’ ,将使用 shell 变量 PWD 的值来替换。如果
tilde-prefix 是 ‘~-’,并且设置了 shell 变量 OLDPWD, 将使用这个变量值 来
替换。如果在 tilde-prefix 中,波浪线之后的字符串由一个数字 N 组成,前缀
可选的 ‘+’ 或者 ‘-’,那么 tilde-prefix 将被替换为目录栈中相应的元素,就
是将 tilde-prefix 作为参数执行内建命令 dirs 显示的结果。如果 tilde-pre-
fix 中波浪线之后的字符是一个数字,没有前缀,那么就假定有一个 ‘+’。
如果登录名不合法,或者波浪线扩展失败,这个词将不会变化。
在变量赋值中,对于 : 或 = 之后的字符串会立即检查未引用的 tilde-prefix。
这 种 情 况下,仍然会进行波浪线扩展。因此,可以使用带波浪线的文件名来为
PATH, MAILPATH, 和 CDPATH 赋值,shell 将赋予扩展之后的值。
Parameter Expansion
字符 ‘$’ 引入了参数扩展,命令替换和算术扩展。要扩展的参数名或符号可能包
含 在花括号中,花括号可选的,但是可以使得要扩展的变量不会与紧随其后的字
符合并,成为新的名称。
使用花括号的时候,匹配的右括号是第一个 ‘}’,并且它没有被反斜杠引用或 包
含 在一个引用的字符串中,也没有包含在一个嵌入的算术扩展,命令替换或是参
数扩展中。
${parameter}
被替换为 parameter 的值。如果 parameter 是一个位置参数,并且数字
多 于一位时;或者当紧随 parameter 之后有不属于名称一部分的字符时
,都必须加上花括号。
如果 parameter 的第一个字符是一个感叹号,将引进一层间接变量。 bash 使用
以 parameter 的其余部分为名的变量的值作为变量的名称;接下来新的变量被扩
展,它的值用在随后的替换当中,而不是使用 parameter 自身的值。这也 称 为
indirect expansion(间接扩展). 例外情况是下面讲到的 ${!prefix*}。
下面的每种情况中,word 都要经过波浪线扩展,参数扩展,命令替换和算术扩展
。如果不进行子字符串扩展,bash 测试一个没有定义或值为空的参数;忽略冒号
的结果是只测试未定义的参数。
${parameter:-word}
Use Default Values(使用默认值)。如果 parameter 未定义或值为空,
将替换为 word 的扩展。否则,将替换为 parameter 的值。
${parameter:=word}
Assign Default Values(赋默认值)。如果 parameter 未定义或值为空,
word 的扩展将赋予 parameter. parameter 的值将被替换。位置参数和
特殊参数不能用这种方式赋值。
${parameter:?word}
Display Error if Null or Unset(显示错误,如果未定义或值为空)。如
果 parameter 未定义或值为空,word (或一条信息,如果 word 不存在)
的扩展将写入到标准错误;shell 如果不是交互的,则将退出。否则 ,
parameter 的值将被替换。
${parameter:+word}
Use Alternate Value(使用可选值)。如果 parameter 未定义或非空,不
会进行替换;否则将替换为 word 扩展后的值。
${parameter:offset}
${parameter:offset:length}
Substring Expansion(子字符串扩展)。扩展为parameter 的最多 length
个 字 符 , 从 offset 指定的字符开始。如果忽略了 length,扩展为
parameter 的子字符串,从 offset 指定的字符串开始。length 和 off-
set 是算术表达式 (参见下面的 ARITHMETIC EVALUATION 算术求值段落)
。 length 必须是一个大于等于 0 的数值。如果 offset 求值结果小 于
0 , 值将当作从 parameter 的值的末尾算起的偏移量。如果 parameter
是 @,结果是 length 个位置参数,从 offset 开始。如果 parameter
是 一个 数组名,以 @ 或 * 索引,结果是数组的 length 个成员,从
${parameter[offset]} 开始。子字符串的下标是从 0 开始的,除非使用
位置参数时,下标从 1 开始。
${!prefix*}
扩 展为名称以 prefix 开始的变量名,以特殊变量 IFS 的第一个字符分
隔。
${#parameter}
替换为 parameter 的值的长度 (字符数目)。如果 parameter 是 * 或者
是 @, 替换的值是位置参数的个数。如果 parameter 是一个数组名,下
标是 * 或者是 @, 替换的值是数组中元素的个数。
${parameter#word}
${parameter##word}
word 被扩展为一个模式,就像路径扩展中一样。如果这个模式匹配
parameter 的值的起始,那么扩展的结果是将 parameter 扩展后的值中
,最短的匹配 (‘‘#’’ 的情况) 或者最长的匹配 (‘‘##’’的情况) 删除的
结果。如果 parameter 是 @ 或者是 *, 则模式删除操作将依次施用于每
个位置参数,最后扩展为结果的列表。如果 parameter 是一个数组变 量
, 下标是 @ 或者是 *, 模式删除将依次施用于数组中的每个成员,最后
扩展为结果的列表。
${parameter%word}
${parameter%%word}
word 被扩展为一个模式,就像路径扩展中一样。如果这 个 模 式 匹 配
parameter 扩展后的值的尾部,那么扩展的结果是将 parameter 扩展后
的值中,最短的匹配 (‘‘%’’ 的情况) 或者最长的匹配 (‘‘%%’’的情 况)
删除的结果。如果 parameter 是 @ 或者是 *, 则模式删除操作将依次施
用于每个位置参数,最后扩展为结果的列表。如果 parameter 是一个 数
组 变量,下标是 @ 或者是 *, 模式删除将依次施用于数组中的每个成员
,最后扩展为结果的列表。
${parameter/pattern/string}
${parameter//pattern/string}
patterm 被扩展为一个模式,就像路径扩展中一样。parameter 被扩展,
其值中最长的匹配 pattern 的内容被替换为 string。在第一种形式中,
只有第一个匹配被替换。第二种形式使得 pattern 中所有匹配都被替 换
为 string。如果 pattern 以 # 开始,它必须匹配 parameter 扩展后值
的首部。如果 pattern 以 % 开始,它必须匹配 parameter 扩展后值 的
尾 部。如果 string 是空值,pattern 的匹配都将被删除, pattern 之
后的 / 将被忽略。如果 parameter 是 @ 或者是 *, 则替换操作将依 次
施 用于每个位置参数,最后扩展为结果的列表。如果 parameter 是一个
数组变量,下标是 @ 或者是 *, 模式删除将依次施用于数组中的每个 成
员,最后扩展为结果的列表。
Command Substitution
命令替换 (Command substitution) 允许以命令的输出替换命令名。