五、注释

  在非交互shell中或交互式shell中,内置命令shopt的选项interactive_comments被开启。以"#"开始的词使得这个词所在这一行上所有其他的剩余字符都被忽略(或称注释)。交互式shell不用开启interactive_comments选项也不支持注释。interactive_comments选项在交互式shell中是默认启用的。注释是编写程序时,写程序的人给一个语句、程序段、函数等的解释或提示,能提高程序代码的可读性,以便于以后的参考、修改。后来,在应用程序的配置文件中,也出现了注释的功能,这些注释语句是解释性文本,在运行程序时,会被程序跳过,不做处理。

  例如:

[root@localhost ~]# echo "this is a comment if '#' exists and leads the line."
this is a comment if '#' exists and leads the line.
[root@localhost ~]# #echo "this is a comment if '#' exists and leads the line."
[root@localhost ~]#

  当然,这样的内容如果出现在文件中,也是同样的注释的方式来处理。


六、引用

  引用可以用来去掉指定字符或字的特殊意义。也可以用来禁止对特殊字符的特殊处理,阻止保留字被识别,还用来阻止参数的展开。

  每个元字符对shell来讲都有特殊含义,一般来讲这样的裸字符会被shell特殊解释,如果想要表示字符本身就必须将其放在具有引用功能的符号中或符号后进行引用。

  在使用命令行历史展开功能时,历史展开字符通常是"!",如果想防止历史展开,就必须将其引用。

[root@localhost ~]# echo this is a big apple!I want to eat it
-bash: !I: event not found
[root@localhost ~]# echo this is a big apple'!'I want to eat it
this is a big apple!I have it


  有三种引用机制:转义字符(或称逃逸符),单引号和双引号。

    一个未被引用的反斜杠(\),称为转义字符。它保留其后下一个字符的字面意义。如果"\"和换行符成对出现,并且反斜杠自身没有被引用,那么\<new‐line> 被视为续行标志(意思是,它被从输入流中删除并有效地被忽略了换行符)。

    将字符放在封闭的单引号之中,将保留引用中所有字符的字面意义。单引号不能包含在单引号引用之中,即使前面加上了反斜杠。也就是说,单引号是就近匹配的。而且单引号是强引用,即:除了单引号自身不被单引号引用之外,其余被单引号引用的内容均只做字面意义被bash解释。如:

[root@localhost ~]# echo 'this is a single quote \''
> '
this is a single quote \

[root@localhost ~]#


    这个例子说明了上述问题,bash会认为this前面的单引号和反斜杠后面的单引号是一对,而最后的单引号是单独的,所以bash认为引用不完整。当再次键入单引号的时候,bash才认为单引号配对成功,完成输出。而输出的结果中只有反斜杠没有单引号,就是因为被单引号引用起来的反斜杠已经不是转义字符,而就是简单的反斜杠自身了。如果想要引用单引号可以使用双引号,或者不被引用的反斜线,如:

[root@localhost ~]# echo "this is a pair of single quotes ''"
this is a pair of single quotes ''
[root@localhost ~]# echo "this is a pair of single quotes" \'\'
this is a pair of single quotes ''
[root@localhost ~]#


    将字符封闭地放在双引号之中,同样保留所有字符的字面意义,但如果"$","`","\"和命令历史功能被开启后的"!"字符出现在双引号中,则为例外情况了。字符"$"和"`"在双引号中仍然具有特殊意义,因此说,单引号是弱引用符号。反斜杠只有后面是下列字符时才有特殊意义:$,`,",\或<newline>。双引号可以在双引号中被引用,但要在前面加上一个反斜杠。历史展开就会被执行除非!出现在使用反斜线被转义双引号之中。!前面的反斜线不被删除。

    特殊的参数"*"和"@"在双引号中有特殊意义

[root@localhost ~]# echo "the executable files are in \$PATH"
the executable files are in $PATH
[root@localhost ~]# echo "the executable files are in $PATH"
the executable files are in /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# echo "the current user is `whoami`"
the current user is root
[root@localhost ~]# echo "the current user is \`whoami\`"
the current user is `whoami`
[root@localhost ~]# echo "this is a double quote \""
this is a double quote "
[root@localhost ~]# echo "this is a bashslash \\"
this is a bashslash \
[root@localhost ~]# echo "history command !12"
echo "history command mount -r /dev/sr0 /mnt/cdrom/"
history command mount -r /dev/sr0 /mnt/cdrom/
[root@localhost ~]# echo "history command \!12"
history command \!12
[root@localhost ~]#


    形式为$'string'的词会被特殊处理。它被展开为string,其中的反斜杠转义字符被替换为ANSI C标准中规定的字符。反斜杠转义序列,如果存在的话,将做如下转换:

      \a     响铃

      \b     退格

      \e

      \E     逃逸字符 Esc

      \f     进纸

      \n     换行符

      \r     回车

      \t     水平制表

      \v     垂直制表

      \\     反斜杠

      \'     单引号

      \nnn   一个八比特字符,它的值是八进制值nnn(一到三个数字)。

      \xHH   一个八比特字符,它的值是十六进制值HH(一到两个十六进制数字)。

      \cx    一个ctrl-x字符


    展开结果是单引号引用的,就好像$符号不存在一样。

[root@localhost ~]# echo -e 'this is the first line\nthis is the second line'
this is the first line
this is the second line
[root@localhost ~]#


    双引号引用字符串前面加上一个$符号将使得这个字符串根据当前语言环境被解释。如果当前语言环境是C或者POSIX,$符号将被忽略。如果这个字符串被解释并替换了,那么替换结果是双引号引用的内容。


七、参数

  参数是一个储存值的实体。它可以是一个名称,一个数字或者是一个特殊字符。变量是一个用名称表示的参数。变量可以有一个值以及零个或多个属性。属性可以使用内置命令declare来进行赋值。

  如果给一个参数赋值,那么它就被定义了。空字符串是有效的值。一旦一个变量被定义了,它只能用内置命令unset来撤销。

  变量可以用这样的语句形式来赋值:

    name=[value]

  如果没有给出值,变量就被赋为空字符串。所有值都经过波浪线展开,参数和变量展开,命令替换,算术展开和引用去除。如果变量具有了整数属性集,那么其值就可以像一个算术表达式那样被求值,尽管没有使用是$((...))展开的模式。除非使用了"$@",否则不进行字拆分。不执行路径扩展。赋值语句也可能作为alias, declare, typeset, export, readonly和local这些内置命令的参数出现。

  在为shell变量或数组元素赋值的赋值语句的上下文中,"+="操作符可以用来为变量附加或添加以前的值。当"+="应用于被设置了整数属性的变量的时候,变量值是可以作为算术表达式被计算数组的并且添加到变量的当前值,该值也会被计算。当"+="应用于被设置了数组变量使用复合赋值的时候,新值就被附加到一个大于数组的最大元素下标的位置,或者在关系数组中增加一个额外的键值对。当"+="应用于被字符串变量的时候,会将变量值展开并追加到变量的值。

  位置参数

    位置参数是以一或多个数字代表的参数,除了0。位置参数是在shell启动时,根据它的参数来赋值的,也可以用内置命令set来重新赋值。位置参数不能用赋值语句来赋值。在一个 shell函数被执行的时候,位置参数会被暂时地替换掉。

    当位置参数由两个以上的数字构成时,它必须用括号括起来。


  特殊参数

    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的文件名,就好像给出的参数就是零。

    _  在shell启动时,该变量设置为按照环境和参数列表来传递用来调用shell或被执行的shell脚本的绝对路径名称。然后,在展开时展开为上一个命令的最后一个参数。它也被设置为被执行的每个命令的文件全名并且被设置到这个命令执行的环境当中。当检查邮件时,这个参数保存着正在检查的邮件文件的名称。


八、Shell变量

  shell定义了下列变量:

    BASH  展开为用来调用当前bash实例的文件全名。

    BASHOPTS

      一组使用冒号分隔的shell选项的启动列表。列表中的每个字对于shopt命令的-s选项来说都是有效参数。这些选项作为对shopt命令的报告出现在BASHOPTS变量中。当bash启动的时候,如果这个变量在环境变量中,每个列表中的shell选项都在读或启动文件之前被开启。这个变量是只读的。

    BASHPID  展开出当前bash进程的PID,在某些情况下,不同于"$$",就像子shell不需要bash重新初始化一样。

    BASH_ALIASES

      一个将数组变量的成员对应由alias内置元素维护的内部别名列表添加到这个数组中出现的别名列表;撤销数组元素会导致从别名列表中移除这些别名。

    BASH_ARGC

      一个值为在当前bash执行调用栈的每一个框架中的参数数量的数组变量。当前子例程的参数数量栈的首部。当运行一个子例程的时候,参数数量被推送到BASH_ARGC之上。只有在扩展的调试模式中shell才会设置BASH_ARGC。

    BASH_ARGV

      一个包含了所有当前bash执行调用栈的参数的数组变量。最后的子例程调用的最后的参数在栈顶;初始调用的第一个参数在栈底。当运行一个子例程的时候,支持的参数被推送到BASH_ARGV之上。只有在扩展的调试模式中shell才会设置BASH_ARGV。

    BASH_CMDS

      一个数组变量,其成员对应于内部由内置hash命令维护的hash命令表。元素被添加到这个数组中出现的hash列表;撤销数组元素会导致这些命令从hash表中被移除。

    BASH_COMMAND

      当前正在执行或者将被执行的命令,除非该命令的执行命令出现故障,在这种情况下命令在捕获时执行。

    BASH_EXECUTION_STRING  调用-c选项的命令参数

    BASH_LINENO

      一个数组变量,其成员在源文件中的对应每个FUNCNAME的行号。${BASH_LINENO[$i]}就是在${FUNCNAME[$i]}被调用的源文件中的行号。对应的源文件名称是${BASH_SOURCE[$i]}。使用LINENO显示当前行号。

    BASH_REMATCH

      一个数组变量,其成员由"=~"二进制操作符分配到"[["条件指令。下标为"0"的元素是匹配整个正则表达式的字符串的一部分。这个变量为只读变量。

    BASH_SOURCE  一个数组变量,其成员是对应于FUNCNAME数组变量的元素的源文件。

    BASH_SUBSHELL  每一次子shell或子shell环境被启用就增加1,初始值为0。

    BASH_VERSINFO

      一个只读数组变量,其成员保存着当前bash实例的版本信息。赋予数组元素的值是如下这些:

        BASH_VERSINFO[0]        主版本号 (release)

        BASH_VERSINFO[1]        次版本号 (version)

        BASH_VERSINFO[2]        补丁版本

        BASH_VERSINFO[3]        编译信息

        BASH_VERSINFO[4]        发行版本的状态 (例如, beta1)

        BASH_VERSINFO[5]        平台类型

    BASH_VERSION  展开为一个描述了这个bash实例的版本字符串。

    COMP_CWORD

      ${COMP_WORDS}的索引,指向当前光标位置所在的词。这个变量只有在被命令补全功能调用的shell函数中才可用。

    COMP_KEY  用来调用当前可补全函数的密钥

    COMP_LINE  当前命令行。这个变量只有在被命令补全功能调用的shell函数中才可用。

    COMP_POINT

      相对于当前命令起始处的当前光标位置。如果当前光标位置是当前命令的末端, 它的值就和${#COMP_LINE}相等。这个变量只有在被命令补全功能调用的shell函数中才可用。

    COMP_TYPE

      设置一个对应于该可补全类型尝试使一个可补全的函数被调用的整数值:普通的补全使用TAB,在连续的tabs之后的列表补全使用"?",部分字的列表代替补全使用"!",在字没有修改的情况下的列表补全使用"@",或者菜单补全使用"%"。这个变量只有在被命令补全功能调用的shell函数中才可用。

    COMP_WORDBREAKS

      当执行字补全的时候readline库用作字分隔符的字符集。如果COMP_WORDBREAKS被撤销,即便随后重新定义,它也会丢失它的特殊属性。

    COMP_WORDS

      一个由当前命令行的各个单词构成的数组变量。行被分割为数个单词就像readline那样分割。这个变量只有在被命令补全功能调用的shell函数中才可用。

    DIRSTACK

      一个包含当前目录栈的内容的数组变量。栈中的目录按用内置命令dirs显示的顺序排列。对这个数组变量的成员赋值可以用来修改栈中已有的目录,但是要添加和删除目录就必须使用内置命令pushd和popd。对这个变量的赋值不会改变当前变量。如果DIRSTACK被撤销,即便随后重新定义,它也会失去它的特殊属性。

    EUID  展开为当前用户的有效用户ID。在shell启动时被初始化。这个变量是只读的。

    FUNCNAME

      这个数组变量包含了当前调用栈执行的所有shell函数的名称。使用下标"0"的元素是当前正在执行的shell函数的名字。最底层的元素是"main"函数。这个变量只有在执行一个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处理的最后一个选项参数值。

    OPTIND  内置命令getopts将处理的下一个参数的索引

    OSTYPE  自动设置的一个描述了正在运行bash的操作系统的字符串。默认值是系统相关的。

    PIPESTATUS  一个数组变量包含了从后台管道最近被执行的进程获得的退出状态值。

    PPID  shell的父进程的进程号。这个变量是只读的。

    PWD  由cd命令设置的当前工作目录。

    RANDOM

      每次引用这个参数时,都会产生一个0到32767之间的随机整数。可以通过向RANDOM赋值来初始化随机数序列。如果取消了RANDOM的定义,它就失去了特殊的意义,即使后来重新定义它。

    REPLY  当内置命令read没有参数时,设置该变量的值作为其输入的行。

    SECONDS

      每次引用这个参数时,返回shell自运行以来的秒数。如果向SECONDS赋值,此后对它的引用将返回自赋值时起的秒数加上所赋予的值。如果取消SECONDS的定义,它就失去了特殊的意义,即使后来重新定义它。

    SHELLOPTS

       一个冒号分隔的被允许的 hell选项列表。列表中每个字都是内置命令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"。

    BASH_XTRACEFD

      如果定义了一个应用于有效的文件描述符的整数,当set -x启用该文件描述符的时候,bash将保存一个输出中产生的跟踪。当BASH_XTRACEFD被撤销或者被赋予新值的时候,文件描述符会关闭。撤销BASH_XTRACEFD或给它赋予空串会导致跟踪输出被发送到标准错误。注意设置BASH_XTRACEFD的值为2然后撤销它会导致标准错误被关闭。

    COLUMNS  在显示时选择列表的时候,通过内置命令select来确定终端的宽度。在收到SIGWINCH信号后自动设置。

    COMPREPLY  一个数组变量,bash从中读取由命令补全功能调用的shell函数产生的可能的命令补全。

    FCEDIT 内置命令fc默认的编辑器。

    FIGNORE

      一个冒号分隔的后缀名列表,在进行文件名补全时被忽略。一个后缀满足其中之一的文件名被排除在匹配的文件名之外。可以是这样:".o:~"。

    GLOBIGNORE

      一个冒号分隔的模式列表,定义了路径名展开时要忽略的文件名集合。如果一个文件名与路径展开模式匹配,同时匹配GLOBIGNORE中的一个模式时,它被从匹配列表中删除。

    HISTCONTROL

      如果设置为ignorespace, 以空白字符开头的命令将不会插入到历史列表中。如果设置为ignoredups,匹配上一次历史记录的行将不会保存至命令列表。设置为ignoreboth会结合这两种选项。如果HISTCONTROL被撤销,或者不包含有效值,所有被shell解释器读取的行都将存入历史列表,但还要参考HISTIGNORE的值。一个多行复合的命令的第二行及随后的行无法被测试,并且无论HISTCONTROL的值是什么都会添加到历史中。

    HISTFILE

      保存命令历史的文件名,默认值是~/.bash_history。如果撤销,在交互式shell注销时命令历史不会被保存。

    HISTFILESIZE

      历史文件中包含的最大行数。当为这个变量赋值时,如果需要的话,通过移除最旧的条目的方式将历史文件截断,以容纳不超过这个值的行。默认值是500。在交互式shell注销时,历史文件也会被截断到这个值。

    HISTIGNORE

       一个冒号分隔用来判断那个命令行应当保存在历史列表中的模式列表。每个模式都定位于行首,必须匹配整行(没有隐藏匹配的"*")。在HISTCONTROL指定的测试结束后,这里的每个模式都要被测试。除了普通的shell的模式匹配字符以外,'&'尝试匹配之前的历史命令行。"&"可以用反斜线转义,反斜线在尝试匹配之前被移除。多行复合命令的第二行以及后续行都不会被测试,不管HISTIGNORE是什么,都将加入到历史中。

    HISTSIZE

      命令历史中保存的历史数量,默认值是500

    HISTTIMEFORMAT

      如果这个变量被定义并且不为空,这个变量的值被用来通过内置命令history显示的每一条历史题目都会显示一个与之关联的时间戳。如果该变量被定义,时间戳会被写入历史文件,因此他们会被保存在shell会话中。使用历史注释字符来和其他历史条目做区分。

    HOME  当前用户的家目录;内置命令cd的默认参数在执行波浪线展开时也用到这个变量。。

    HOSTFILE

      包含一个格式和/etc/hosts相同的文件名,当shell需要补全主机名时要读取它。shell运行过程中可能改变主机名补全可能的列表;这个值改变之后,下一次需要主机名补全时,bash会将新文件的内容添加到旧列表中。如果定义了HOSTFILE但是没有赋值,bash将尝试读取/etc/hosts文件来获得主机名补全的可能列表。当取消HOSTFILE的定义时,主机名列表将清空。

    IFS

      内部字段分隔符在行展开后用来做单词分割,使用内部命令read将行划分成词。默认值是"<space><tab><newline>"。

    IGNOREEOF

      控制交互式shell接受到唯一收到的EOF字符时的行为。如果定义,其值是必须在一行的开始连续输入EOF字符,直到可以使bash退出的字符个数。如果这个变量存在,但是值不是一个数字或者没有赋值,默认值是10。如果变量不存在, EOF标志着输入到shell的结束。

    INPUTRC  readline的启动配置文件,而不是默认的~/.inputrc

    LANG   用来决定没有特地用"LC_"变量指定的语言环境项。

    LC_ALL 这个变量超越了LANG和所有其他指定语言环境项的LC_变量。

    LC_COLLATE

      这个变量决定了为路径展开的结果排序时的字母顺序,决定了范围表达式的行为,等价类,和路径展开中的归并顺序以及模式匹配。

    LC_CTYPE  这个变量决定了字符的解释和路径展开以及模式匹配中字符类的行为。

    LC_MESSAGES  这个变量决定了翻译以$前导的双引号字符串时的语言环境。

    LC_NUMERIC  这个变量决定了用于数字格式化时的语言环境分类。

    LINES  被内置命令select用来判断输出选择列表时的列宽度。在收到SIGWINCH信号时自动设置。

    MAIL  如果这个参数设置为一个文件名,并且未定义MAILPATH的话,bash将在这个文件中通知用户有邮件到达。

    MAILCHECK

      指定bash检查邮件的频率是多少,以秒为单位。默认值是60秒。检查邮件的时候,shell 在显示主要提示符之前来进行。如果撤销,或者设置为小于零的数值,shell将禁止邮件检查。

    MAILPATH

      一个冒号分隔的为了检查邮件的文件名列表。当邮件到达某个特殊文件中时,输出的特定消息可以 通过将文件名与消息以'?'分隔来指定。在消息的文本中,$_展开为当前邮件文件的文件名。

    OPTERR

      如果设置为1,bash显示内置命令getopts产生的错误消息。每次当shell启动时或者一个shell脚本被执行时OPTERR都被初始化为1。

    PATH

      搜索命令的路径。它是一个冒号分割的让shell从中搜索命令的目录列表。在PATH变量中零长度(空)的目录名代表当前目录。空目录名可以出现在两个相邻的冒号之间,或者作为最开始,或者在最末尾。默认的路径是系统相关的,并且是安装bash的系统管理员设置的。通常它的值是 "/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin"。

    POSIXLY_CORRECT

      在bash启动时如果环境中有这个变量,它将在读取启动配置文件之前进入posix mode,就好像给bash提供了--posix选项一样。如shell运行过程中定义了它,bash就启用posix mode,就好像执行了set -o posix命令一样。

    PROMPT_COMMAND  如果定义,它的值将作为一个命令,每次显示主提示符之前都会执行。

    PROMPT_DIRTRIM

      如果设置成一个大于零的数,当展开"\w"和"\W"提示符的转义序列的时候,该值被用作保留的末尾目录组件的数目。移除的字符会使用省略号代替。

    PS1  这个参数的值作为主提示字符串而被展开和使用,默认值是"\s-\v\$" (参见下面的PROMPTING)

    PS2  这个参数的值同PS1一起被展开,用作次提示符字符串。默认值是">"。

    PS3  这个参数的值被用作内置命令select的提示符。

    PS4  

      这个参数的值同PS1一起被展开,在执行跟踪中在bash显示和执行每个命令之前显示。根据需要,PS4的第一个字符会被复制多次,来指示间接处理的层数。默认值是"+"。

    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将退出。

    TMPDIR  如果定义,bash使用这个值作为bash创建为shell所用的临时文件目录的名称。

    auto_resume

      这个变量控制了shell如何与用户和作业控制交互。如果这个变量被定义,一个不包含重定向的单个词的简单命令,将作为恢复被中断的作业的指示。不允许出现模棱两可的情况;如果有多个作业都以这个词起始,将恢复最近运行的作业。在这种情形下,被中断的作业的name,在上下文中,是用于启动它的命令行。如果值设置为 exact,给出的字符串必须精确匹配被中断的作业名;如果设置为substring,给出的字符串需要匹配被中断的作业名的子串。子串值的功能与作业标识符%?功能类似。如果设置为任何其他值,提供的子串必须是被停止的作业名的前缀;这提供了类似%string功能的作业标识符。

    histchars

      两到三个字符,控制着历史展开和分段。历史展开字符的第一个字符表明了历史展开的开始,通常是"!"。第二个字符是快速替换字符,它是重新运行上次输入的命令,将命令中的字符串替换为另一个的简写。默认是 "^"。可选的第三个字符是指示如果作为一个词的开始,那么一行中剩余字符是注释。通常这个字符是  "#"。历史注释字符使得对一行中剩余字符在历史替换中被跳过。它不一定使shell解释器将这一行的剩余部分当作注释。


  数组

    Bash提供了一维索引和关联数组变量。任何变量都可以作为一个索引数组;内置命令declare可以显式地定义数组。数组的大小没有上限,也没有对成员索引和连续赋值时的任何要求。索引数组以整数为下标进行引用,从0开始。关联数组可以使用任意字符串引用。

    如果变量赋值时使用语法name[subscript]=value,那么就会自动创建数组。subscript被当作一个结果必须是大于等于0的算术表达式的值。要显式地定义一个数组,使用declare -a name。declare -a name[subscript]也是允许的,下标会被忽略。

    关联数组可以使用declare -A name来创建。

    数组变量的属性可以用内置命令declare和readonly来指定。每个属性对于所有数组元素都有效。

    数组赋值可以使用复合赋值的方式,形式是:name=(value1 ... valuen),这里每个value的形式都是[subscript]=string。以下标的方式赋值不需要括号和下标。当为一个数组赋值的时候,如果给出了可选的括号和下标,那就按照下标赋值;否则被赋值的元素的下标就会在之前的下标的基础之上一次加一即可。下标从0开始。

    当为一个关联数组赋值的时候,下标是必须的。

    这个语法也被内置命令declare所接受。单独的数组元素可以用上面介绍的语法name[subscript]=value来赋值。

    数组的任何元素都可以用${name[subscript]}来引用。花括号是必须的,以避免和路径展开冲突。如果下标是"@"或是"*",它展开为name数组中的所有成员。

    这两种下标只有在双引号中才不同。在双引号中,${name[*]}展开为空, 展开为一个词,由所有数组成员的值组成,用特殊变量IFS的第一个字符分隔;${name[@]} 将name的每个成员展开为一个词。如果数组没有成员,${name[@]}展开为空串。如果双引号在一个单词中展开,第一个参数的展开与原词的开始部分连接,最后一个参数的展开和原来的单词的最后一个部分连接。这种类似于特殊参数"*"和"@"的展开。${#name[subscript]}展开为${name[subscript]}的长度。如果下标是"*"或者是"@",展开结果是数组中元素的个数。不使用下标引用数组变量等价于使用0下标来引用数组。

    只要一个下标被赋值,则这个数组变量被视为正式定义。空值也是有效值

    内置命令unset用于撤销数组的定义。unset name[subscript]将销毁下标是subscript的元素。unset name,这里name是一个数组,或者unset name[subscript], 这里subscript是"*"或者是"@"将销毁整个数组。

    内置命令declare,local和readonly都能接受-a选项,从而指定一个数组。内置命令read可以接受-a选项,从标准输入读入一列词来为数组赋值。内置命令set和declare使用同一种方法来显示数组元素的值,允许他们作为赋值被重用。


(待续...)