"引述"与"bash 特殊变量"
BOoRFGOnZ
|
1#
BOoRFGOnZ 发表于 2005-03-04 07:18
"引述"与"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 控制历史扩展和单词化的两三个字符. 第一个是历史扩展字符,一般是!.第二个是快速替换字符,用来作为启动先前命令的快捷方式,并替换命令中的一个字符串.默认为^. 可选的第三个字符,标明注释的开始,一般是#.历史注释字符 导致注释部分不做历史替换.不一定使外壳认为它也使注释. |