"引述"与"bash 特殊变量"

"引述"与"bash 特殊变量"

引用:
引述 (QUOTING)
引述用于去掉外壳识别的一些字符和单词的特殊意思. 引述可以禁止特殊字符的特殊处理,禁止单词当成保留字,或者禁止参数扩展.
任何上面定义的元字符是对于外壳有特殊意义的. 如果使用它自己的字面意思时,必须采用引述.
如果正在使用命令历史扩展工具,历史扩展字符 ! 必须引述才有它的字面意思.
有三种引述机制: 转义字符\,单引号,双引号.
非引述方式的\叫转义字符.它保持跟着它的下一个字符的字面意思,跟着的字符是换行是一种例外情况. \换行成对时,如果这个\不
是引述的,\换行对的意思是续行,从输入中把\换行对忽略,所以下一行认为是当前行的继续.
单引号括起来的字符都使用字面的意思. 单引号引述的内容不能有单引号,用\'方式都不行.
双引号括起来的字符,除了$,`,\以外都保持它们的字面的意思. 双引号引述的中间的$,`都有特殊意思. \后面只有跟着$,`,",\或换行
时才有特殊意义. 在双引号引述的时候, 引述内部的双引号前面加\就可以保留字面意思.
在双引号引述的内部,参数变量*,@有特殊的意义.
$'string' 形式的单词是特殊处理的. 单词扩展为字符串, \转义的字符按照ANSI C标准替换.如果有\转义的字符,如下处理:
\a 警告(响铃)
\b 退格
\e escape字符
\f form feed
\n new line (新行)
\r 回车
\t 水平TAB
\v 垂直TAB
\\ 字符\
\' 单引号
\nnn 一个8bit字符, 值等于nnn指定的8进制(nnn为一到三个).
\xHH 一个8bit字符, 值等于HH指定的16禁止(HH为一到两个).
\cx 一个 control-x 字符.
       扩展的结果是单引号引述的,好象$不存在一样处理.
       $"string" 形式的导致string按照当前的locale翻译.如果当前locale是C或POSIX,$被忽略. 如果string被翻译替换,结果是双引号引述的.
参数
       参数是可以存值的单元. 可以是名字,一个数字,或者下面列出的特殊参数. 对外壳来说, 变量是用名字指定的参数. 变量有一个名字, 0或更多的属性. 属性由内部命令 declare 来说明.
       赋值后的参数叫已设置(set)参数. 参数值可以使用空的字符串. 一旦参数已设置,只有内部命令 unset 才能取消设置(unset).
       参数赋值的形式是 name=[value]
       如果没有给出value,参数赋值为空的字符串. value经过~扩展,变量替换,命令替换,算术扩展,消除引述一系列处理. 如果参数name是
       指定了整数属性的,value在没有$((...))的形式指定时都会进行算术扩展. 不进行单词分裂处理,只有$@是例外. 不进行路径名扩展.
       参数赋值也可以出现在内部命令declare,typeset,export,readonly和local的后面.
   位置参数
       位置参数是一个或更多数字(0除外)指定的参数. 位置参数是外壳启动时外壳命令行的参数,可以用内部变量set重新赋值. 位置参数不能赋值语句重新赋值. 在外壳的函数调用时,位置参数临时替换为函数的参数.
       如果位置参数多于一位数字,它必须用{ }括起来才能进行变量替换.
   特殊参数
       一些参数是外壳的特殊参数. 它们只能引用值,不能重新赋值.
       * 扩展为1开始的位置参数.在双引号引述时,它扩展为单个单词,是由位置参数依次串起来,用参数IFS值的第一个字符分隔.
也就是,"$*"等价于"$1c$2c...",c是IFS的值的第一个字符. 如果IFS是没设置unset的,参数是空格分隔的. 如果IFS的值为 空字符串,参数之间没有分隔的连接起来.
       @ 扩展为1开始的位置参数.在双引号引述时,它把每个位置参数扩展为一个单词.就是说,"$@"等价于 "$1" "$2"....如果没有 位置参数,"$@"和$@扩展为空(即直接删除).
       # 用十进制表示的位置参数的个数.
       ? 最近一次执行的前台管道命令的返回值.
       - 当前选项的值,由启动bash时指定,或set命令指定,或者外壳自己定义的(如-i).
       $ 当前外壳的进程ID.在( )子外壳中,它返回当前外壳的ID,不是子外壳的ID.
       ! 最近一次执行的后台进程的进程ID.
       0 外壳或外壳脚本的名字. 在外壳初始化时设置. 如果bash启动时带有参数作为命令文件,$0设置为该文件的名字.如果bash
有-c选项,$0设置为-c后要执行的字符串后面的第一个参数.否则,它设置为调用bash的文件的名字.
       _   外壳启动时,设置为正在执行的外壳或这脚本的绝对路径的文件名.接着,扩展为前一条命令的最后一个参数.也设置为每个 执行命令的完整的文件名,处于该命令的export的环境中.检查邮件时,设为正检查的邮件文件的名字.
外壳有名字的变量
外壳设置如下的一些变量:
BASH 启动外壳的完整文件名.
BASH_VERSINFO 一个只读的数组变量,数组成员是bash的版本信息. 内容如下:
BASH_VERSINFO[0] 主版本号(release)
BASH_VERSINFO[1] 次版本号(version)
BASH_VERSINFO[2] 补丁(patch level)
BASH_VERSINFO[3] 编译版本(build).
BASH_VERSINFO[4] 发行状态(e.g., beta1).
BASH_VERSINFO[5] 机器类型(MACHTYPE).
       BASH_VERSION 外壳的版本的字符串.
       COMP_CWORD $(COMP_WORDS} 的索引,包含当前光标的位置.只有可编程补全的外壳函数才能用这个变量.
       COMP_LINE 当前命令行.只有可编程补全的外壳函数和外部命令才能使用这个变量.
       COMP_POINT 当前光标相对于当前命令开始的位置.如果位于命令的结尾,等于$(#COMP_LINE).只有可编程补全的外壳函数和外部 命令才能使用这个变量.
       COMP_WORDS 当前命令行的各个单词组成的数组. 只有可编程补全的外壳函数和外部命令才能使用这个变量.
       DIRSTACK 包括当前目录堆栈的内容的数组.数组中的目录出现的顺序和dirs命令显示的一样.可以对数组的成员赋值,从而 修改目录堆栈的内容,但是增加和删除目录堆栈的内容必须使用pushd, popd. 对数组的赋值不能改变当前目录.
如果DIRSTACK被删除unset,它失去特别意义,即使后来在赋值.
       EUID 当前用户的有效用户ID,外壳启动时设置. 是只读的变量.
       FUNCNAME 正执行的外壳函数的名字.只有在外壳函数正执行的时候才有意义.对FUNCNAME赋值没有作用,而返回值为错误.如 FUNCNAME被删除unset,它失去特殊意义,即使重新设置.
       GROUPS 当前用户所属的组的列表.对GROUPS赋值没有作用,而返回值为错误.如GROUPS被删除,它失去特殊意义,即使重新设置.
       HISTCMD 当前的历史号码,或历史列表的索引.如HISTCMD被删除,它失去特殊意义,即使重新设置.
       HOSTNAME 自动设置为当前主机的名字.
       HOSTTYPE 自动设置为bash执行的机器的唯一的类型字符串. 默认的值和系统是相关的.
       LINENO 每次使用这个变量的值,外壳返回当前脚本或函数中行的顺序号(从1开始).如果不在脚本或函数内部,值不一定有 意义. 如LINENO被删除,它失去特殊意义,即使重新设置.
       MACHINETYPE 自动设置为bash执行时的系统类型的完全描述的字符串,按GNU标准的cpu-com-pany-system格式.与系统实现有关的.
       OLDPWD cd 设置的先前一个目录.
       OPTARG 内部命令getopts处理的最后一个选项的值.
       OPTIND 内部命令getopts处理的下一个选项的索引.
       OSTYPE 自动设置为bash执行时的操作系统的字符串,与系统实现有关的.
       PIPESTATUS 最近执行的前台管道的各个命令的返回值组成的数组.
       PPID 外壳的父进程的进程ID. 只读变量.
       PWD cd命令设置的当前工作目录.
       RANDOM 每次使用,返回一个0到32767之间的一个随机整数.可以对RANDOM赋值来初始化随机序列. 如RANDOM被删除,它失去 特殊意义,即使重新设置.
       REPLY read命令如果没有参数,输入存到REPLY变量中.
       SECONDS 每次使用时,返回启动外壳以来经过的秒数. 如果SECONDS被赋值,返回的是所赋值加上赋值后经过的秒数.如SECONDS 被删除,它失去特殊意义,即使重新设置.
       SHELLOPTS 已启用的外壳选项的列表,有:分隔.每个单词是set内部命令的-o选项的有效参数.SHELLOPTS列表中的单词是set -o 汇报为已启用的. 如果bash启动时环境中有SHELLOPTS变量,列表中的每个选项在启动文件运行后启动. 只读变量.
       SHLVL 每次启动bash时增加1.
       UID 当前用户的用户ID,在外壳启动时初始化. 只读变量.

       下面的变量由外壳使用. 有时外壳赋值一个默认的值给变量,下面会指出这些情况.
       BASH_ENV 外壳执行脚本时,如果这个变量存在,它的值作为一个文件名,来初始化外壳,和~/.bashrc类似. 它的值经过变量替换, 命令替换,算术扩展,然后作为文件名. 搜索文件时不用PATH变量.
       CDPATH cd命令的查找路径,由:分隔. 外壳用来查找cd的目标.例如".:~:/usr"
       COLUMNS select命令使用它决定终端的宽度,收到信号 SIGWINCH时自动设置.
       COMPREPLY 外壳从中读可能的补全命令的数组,由可编程的补全工具调用的一个函数生成.
       FCEDIT fc命令的默认编辑器.
       FIGNORE :分隔的后缀列表,在文件名补全时忽略,匹配列表中的后缀的文件名不补全.例如".o:~"
       GLOBIGNORE :分隔的模式列表,在路径名扩展时,匹配列表中的文件名不扩展.
       HISTCONTROL 如果设置为ignorespace,用空格开始的命令不进入历史记录. 如果设置为ignoredups,和最后的历史行匹配的命令不 记录. ignoreboth组合上面两个.如果删除,或设置为其它值,所有的命令都记录在历史中(除了HISTIGNORE指定的).此
变量的功能由HISTIGNORE代替.符合命令的第二行以上不检查,不管HISTCONTROL都加入历史.
       HISTFILE 保存历史记录的文件.默认为~/.bash_history. 如果删除,交互外壳退出时历史不会保存.
       HISTFILESIZE 保存历史记录的文件的最多的行数.如果此变量存在,历史文件会截断到最多的行数不超过它.默认为500. 交互外壳 退出时,也截断到最大这个行数.
       HISTIGNORE :分隔的模式列表,指定什么命令保存在历史中. 每个模式匹配行的开始,必须匹配整个行(不隐含附加*).在 HISTCONTROL检测后进行匹配.除了普通的外壳模式匹配字符,&匹配前一句历史,&可以用\转义,\在匹配前消除.复合
命令的第二行以后都不检测,直接加入历史记录中.
       HISTSIZE 命令历史的最大的命令数. 默认是500.
       HOME 当前用户的home目录.cd的默认参数.~扩展的时候使用它的值.
       HOSTFILE 同/etc/hosts同样格式的一个文件的名字,进行主机的名字补全时使用. 外壳运行当中可以改变主机名的列表,下次主机名补全时bash把新文件的内容加到当前列表.如果HOSTFILE存在但没有值,bash读取/etc/hosts.如果HOSTFILE被删除,主机名列表被清楚.
       IFS 内部字段分隔符,用于扩展后的单词分裂,以及read命令的行分裂为单词.默认值为"空格 TAB 新行"
       IGNOREEOF 控制交互外壳命令行输入EOF字符的行为. 如果设置,它的值是必须连续输入的EOF字符数,且处于输入行的第一个字符 时使bash退出. 如果它的值不是数字,或者没有值,默认是10. 如果不存在,EOF表示输入结束.
       INPUTRC readline的启动文件的名字,覆盖默认的~/.inputrc.
       LANG 用来决定locale分类的没有用LC_xxx指定的变量的值.
       LC_ALL 覆盖LANG和所有其它LC_xxx的值.
       LC_COLLATE 决定排列顺序,用来排序路径名扩展的结果,决定范围表达式的行为,决定等价类,路径名扩展和模式匹配的排列顺序.
       LC_CTYPE 决定字符的解释,路径名扩展和模式匹配的字符类的意义.
       LC_MESSAGES $"string"翻译时的locale.
       LC_NUMERIC 数字格式的locale.
       LINES select命令用的决定列的长度. 信号SIGWENCH自动设置它,
       MAIL 如果MAILPATH没有设置,MAIL设置为文件名,bash在指定的文件中通知新邮件的到来.
       MAILCHECK bash检查邮件的时间间隔.默认60秒.如果到检测时间,在外壳显示基本提示前检查.如果次变量没有设置,或者设置的 不是大于或等于0的数字,外壳不进行邮件检查.
       MAILPATH :分隔的检查邮件使用的文件名列表.当邮件到达一个特定文件,要显示的信息可以指定为文件名和信息用?分隔.当 用于邮件的正文中时,$_扩展成当前邮件文件的名字. 例如:
MAILPATH='/var/mail/bfox?"You have mail":~/shell-mail?"$_ has mail!"'
bash提供默认的值,但是使用的文件是系统相关的.
       OPTERR 如果设为1,bash显示getopts产生的错误信息.OPTERR每次外壳启动或脚本启动都设为1.
       PATH 命令的搜索列表. :分隔的目录.默认是系统相关的,有安装bash的管路员设置.常见值是
"/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:."
       POSIXLY_CORRECT 如果bash启动时此变量存在,外壳读取启动文件之前就进入posix模式,好象--posix选项.如果bash运行之中,此变量设置,bash激活posix模式,好象执行了set -o posix命令.
       PROMPT_COMMAND 如果设置,每次显示基本提示前执行它的值.
       PS1 扩展后作为基本提示的值,默认为"\s-\v\$"
       PS2 扩展后作为第二提示的值,默认为"> "
       PS3 作为select命令的提示,
       PS4 同PS1扩展,在bash跟踪执行时在每个命令前面打印.第一个字符重复,来表示间接的级别,默认为"+".
       TIMEFORMAT 作为管道带有time命令时显示时间的格式,%引入转义序列,代表时间或其它信息.意义如下,[]表示可选的.
%% %的字面意思.
%[p][l]R 流逝的秒数.
%[p][l]U 用户模式使用的秒数.
%[p][l]S 系统模式使用的秒数.
%P CPU百分比, (%U+%S)/%R.
可选的p表示精度,小数点后的数字.0表示不显示小数点和后面的数字.至多小数点后三位,大于3的改为3.不指定时当做3.
可选的l表示长格式,包括分钟,形式为MMmSS.FFs. p指定是否有小数.
如果TIMEFORMAT不设置,bash打印就按照 $'\nreal\t%3lR\nuser\t%3lU\nsys%3lS'. 如果值为空,不显示时间.显示时附加
结尾一个"\n"

      TMOUT 如果设置为大于0,作为read命令的默认超时的值. 从终端输入时, 过了TMOUT秒没有输入,select命令结束. 对交互外壳, 这个值是显示基本提示后等待的秒数. 等待这个秒数没有输入, bash就终止.
      auto_resume 控制外壳和用户及工作控制的方式. 如果设置,不带重定向的单个单词的简单命令作为继续已停止进程的候选.不允许歧异,如果多于一个工作以键入的单词开头,选中最近使用的进程.停止工作的名字,是启动它的命令.如果设置为exact, 字符串必须精确匹配停止工作的名字;如果设置为substring,字符串必须匹配停止工作的子串.substring提供了类似%?
工作标志的功能. 如果设为其它值,字符串必须是停止工作的前缀名,类似%工作标准的功能.
      histchars 控制历史扩展和单词化的两三个字符. 第一个是历史扩展字符,一般是!.第二个是快速替换字符,用来作为启动先前命令的快捷方式,并替换命令中的一个字符串.默认为^. 可选的第三个字符,标明注释的开始,一般是#.历史注释字符
导致注释部分不做历史替换.不一定使外壳认为它也使注释.
引用:
引述 (QUOTING)
引述用于去掉外壳识别的一些字符和单词的特殊意思. 引述可以禁止特殊字符的特殊处理,禁止单词当成保留字,或者禁止参数扩展.
任何上面定义的元字符是对于外壳有特殊意义的. 如果使用它自己的字面意思时,必须采用引述.
如果正在使用命令历史扩展工具,历史扩展字符 ! 必须引述才有它的字面意思.
有三种引述机制: 转义字符\,单引号,双引号.
非引述方式的\叫转义字符.它保持跟着它的下一个字符的字面意思,跟着的字符是换行是一种例外情况. \换行成对时,如果这个\不
是引述的,\换行对的意思是续行,从输入中把\换行对忽略,所以下一行认为是当前行的继续.
单引号括起来的字符都使用字面的意思. 单引号引述的内容不能有单引号,用\'方式都不行.
双引号括起来的字符,除了$,`,\以外都保持它们的字面的意思.
好象‘不包括其中,看下面:
zhyfly: ~$ a=b\ c
zhyfly: ~$ echo "'$a'"
'b c'
zhyfly: ~$ echo '"$a"'
"$a"
第二个中单引号仍然被解释为普通字符!
不知道我说的对否?
[code:1][root@BOoRFGOnZ root]# a=1
[root@BOoRFGOnZ root]# echo $a
1
[root@BOoRFGOnZ root]# echo "$a"
1
[root@BOoRFGOnZ root]# echo "'$a'"
'1'
[root@BOoRFGOnZ root]# echo '"$a"'
"$a"

[/code:1]