internalvariables.html

来自「BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版」· HTML 代码 · 共 3,354 行 · 第 1/4 页

HTML
3,354
字号
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><HTML><HEAD><TITLE>内部变量</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINKREL="HOME"TITLE="高级Bash脚本编程指南"HREF="index.html"><LINKREL="UP"TITLE="变量重游"HREF="variables2.html"><LINKREL="PREVIOUS"TITLE="变量重游"HREF="variables2.html"><LINKREL="NEXT"TITLE="操作字符串"HREF="string-manipulation.html"></HEAD><BODYCLASS="SECT1"BGCOLOR="#FFFFFF"TEXT="#000000"LINK="#0000FF"VLINK="#840084"ALINK="#0000FF"><DIVCLASS="NAVHEADER"><TABLESUMMARY="Header navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><THCOLSPAN="3"ALIGN="center">高级Bash脚本编程指南: 一本深入学习shell脚本艺术的书籍</TH></TR><TR><TDWIDTH="10%"ALIGN="left"VALIGN="bottom"><AHREF="variables2.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom">9. 变量重游</TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="string-manipulation.html"ACCESSKEY="N">下一页</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="SECT1"><H1CLASS="SECT1"><ANAME="INTERNALVARIABLES">9.1. 内部变量</A></H1><P></P><DIVCLASS="VARIABLELIST"><DL><DT><TTCLASS="REPLACEABLE"><I><AHREF="internal.html#BUILTINREF">内建</A>变量</I></TT></DT><DD><P>这些变量将会影响bash脚本的行为.</P></DD><DT><CODECLASS="VARNAME">$BASH</CODE></DT><DD><P><EM>Bash</EM>的二进制程序文件的路径	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo $BASH</KBD><SAMPCLASS="COMPUTEROUTPUT">/bin/bash</SAMP></PRE></FONT></TD></TR></TABLE>	    </P></DD><DT><CODECLASS="VARNAME">$BASH_ENV</CODE></DT><DD><P>这个<AHREF="othertypesv.html#ENVREF">环境变量</A>会指向一个Bash的启动文件, 			  当一个脚本被调用的时候, 这个启动文件将会被读取. </P></DD><DT><ANAME="BASHSUBSHELLREF"></A><CODECLASS="VARNAME">$BASH_SUBSHELL</CODE></DT><DD><P>这个变量用来提示<AHREF="subshells.html#SUBSHELLSREF">子shell</A>的层次. 			这是一个Bash的新特性, 直到<AHREF="bashver3.html#BASH3REF">版本3</A>的Bash才被引入近来.</P><P>参考<AHREF="subshells.html#SUBSHELL">例子 20-1</A>中的用法.</P></DD><DT><CODECLASS="VARNAME">$BASH_VERSINFO[n]</CODE></DT><DD><P>这是一个含有6个元素的<AHREF="arrays.html#ARRAYREF">数组</A>, 			  它包含了所安装的Bash的版本信息. 			  这与下边的<CODECLASS="VARNAME">$BASH_VERSION</CODE>很相像,	    但是这个更加详细一些.</P><P>	  <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;# Bash version info:  2&nbsp;  3&nbsp;for n in 0 1 2 3 4 5  4&nbsp;do  5&nbsp;  echo "BASH_VERSINFO[$n] = ${BASH_VERSINFO[$n]}"  6&nbsp;done    7&nbsp;  8&nbsp;# BASH_VERSINFO[0] = 3                      # 主版本号.  9&nbsp;# BASH_VERSINFO[1] = 00                     # 次版本号. 10&nbsp;# BASH_VERSINFO[2] = 14                     # 补丁次数. 11&nbsp;# BASH_VERSINFO[3] = 1                      # 编译版本. 12&nbsp;# BASH_VERSINFO[4] = release                # 发行状态. 13&nbsp;# BASH_VERSINFO[5] = i386-redhat-linux-gnu  # 结构体系 14&nbsp;                                            # (与变量$MACHTYPE相同).</PRE></FONT></TD></TR></TABLE>	  </P></DD><DT><CODECLASS="VARNAME">$BASH_VERSION</CODE></DT><DD><P>安装在系统上的Bash版本号</P><P>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo $BASH_VERSION</KBD><SAMPCLASS="COMPUTEROUTPUT">3.00.14(1)-release</SAMP>	      </PRE></FONT></TD></TR></TABLE>	    </P><P>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">tcsh% </SAMP><KBDCLASS="USERINPUT">echo $BASH_VERSION</KBD><SAMPCLASS="COMPUTEROUTPUT">BASH_VERSION: Undefined variable.</SAMP>	      </PRE></FONT></TD></TR></TABLE>	    </P><P>检查$BASH_VERSION对于判断系统上到底运行的是哪个shell来说是一种非常好的方法. 			变量<AHREF="internalvariables.html#SHELLVARREF">$SHELL</A>有时候不能够给出正确的答案. </P></DD><DT><ANAME="DIRSTACKREF"></A><CODECLASS="VARNAME">$DIRSTACK</CODE></DT><DD><P>在目录栈中最顶端的值.	    (将会受到<AHREF="internal.html#PUSHDREF">pushd</A>和<AHREF="internal.html#POPDREF">popd</A>的影响)</P><P>这个内建变量与<AHREF="internal.html#DIRSD">dirs</A>命令相符,	    但是<BCLASS="COMMAND">dirs</B>命令会显示目录栈的整个内容. </P></DD><DT><CODECLASS="VARNAME">$EDITOR</CODE></DT><DD><P>脚本所调用的默认编辑器, 			 通常情况下是<BCLASS="COMMAND">vi</B>或者是<BCLASS="COMMAND">emacs</B>.</P></DD><DT><ANAME="EUIDREF"></A><CODECLASS="VARNAME">$EUID</CODE></DT><DD><P><SPANCLASS="QUOTE">"有效"</SPAN>用户ID</P><P>不管当前用户被假定成什么用户, 这个数都用来表示当前用户的标识号, 也可能使用<AHREF="system.html#SUREF">su</A>命令来达到假定的目的.</P><DIVCLASS="CAUTION"><P></P><TABLECLASS="CAUTION"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/caution.gif"HSPACE="5"ALT="Caution"></TD><TDALIGN="LEFT"VALIGN="TOP"><P><CODECLASS="VARNAME">$EUID</CODE>并不一定与<AHREF="internalvariables.html#UIDREF">$UID</A>相同.</P></TD></TR></TABLE></DIV></DD><DT><CODECLASS="VARNAME">$FUNCNAME</CODE></DT><DD><P>当前函数的名字</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;xyz23 ()  2&nbsp;{  3&nbsp;  echo "$FUNCNAME now executing."  # 打印: xyz23 now executing.  4&nbsp;}  5&nbsp;  6&nbsp;xyz23  7&nbsp;  8&nbsp;echo "FUNCNAME = $FUNCNAME"        # FUNCNAME =  9&nbsp;                                   # 超出函数的作用域就变为null值了. </PRE></FONT></TD></TR></TABLE>            </P></DD><DT><CODECLASS="VARNAME">$GLOBIGNORE</CODE></DT><DD><P>一个文件名的模式匹配列表, 如果在<AHREF="globbingref.html">通配(globbing)</A>中匹配到的文件包含有这个列表中的某个文件, 			  那么这个文件将被从匹配到的结果中去掉.</P></DD><DT><ANAME="GROUPSREF"></A><CODECLASS="VARNAME">$GROUPS</CODE></DT><DD><P>目前用户所属的组</P><P>这是一个当前用户的组id列表(数组), 与记录在<TTCLASS="FILENAME">/etc/passwd</TT>文件中的内容一样.	    </P><P>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">root# </SAMP><KBDCLASS="USERINPUT">echo $GROUPS</KBD><SAMPCLASS="COMPUTEROUTPUT">0</SAMP><SAMPCLASS="PROMPT">root# </SAMP><KBDCLASS="USERINPUT">echo ${GROUPS[1]}</KBD><SAMPCLASS="COMPUTEROUTPUT">1</SAMP><SAMPCLASS="PROMPT">root# </SAMP><KBDCLASS="USERINPUT">echo ${GROUPS[5]}</KBD><SAMPCLASS="COMPUTEROUTPUT">6</SAMP>	      </PRE></FONT></TD></TR></TABLE>	      </P></DD><DT><ANAME="HOMEDIRREF"></A><CODECLASS="VARNAME">$HOME</CODE></DT><DD><P>用户的home目录, 一般是<TTCLASS="FILENAME">/home/username</TT>(参见<AHREF="parameter-substitution.html#EX6">例子 9-15</A>)</P></DD><DT><ANAME="HOSTNAMEREF"></A><CODECLASS="VARNAME">$HOSTNAME</CODE></DT><DD><P><AHREF="system.html#HNAMEREF">hostname</A>放在一个初始化脚本中, 	    在系统启动的时候分配一个系统名字.	    然而, <CODECLASS="FUNCTION">gethostname()</CODE>函数可以用来设置这个Bash内部变量<CODECLASS="VARNAME">$HOSTNAME</CODE>.	    参见<AHREF="parameter-substitution.html#EX6">例子 9-15</A>.</P></DD><DT><CODECLASS="VARNAME">$HOSTTYPE</CODE></DT><DD><P>主机类型</P><P>就像<AHREF="internalvariables.html#MACHTYPEREF">$MACHTYPE</A>,	      用来识别系统硬件.</P><TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo $HOSTTYPE</KBD><SAMPCLASS="COMPUTEROUTPUT">i686</SAMP></PRE></FONT></TD></TR></TABLE></DD><DT><ANAME="IFSREF"></A><CODECLASS="VARNAME">$IFS</CODE></DT><DD><P>内部域分隔符</P><P>这个变量用来决定Bash在解释字符串时如何识别域, 或者单词边界.</P><P>$IFS默认为<AHREF="special-chars.html#WHITESPACEREF">空白</A>(空格,	      制表符,和换行符), 但这是可以修改的, 比如,		  在分析逗号分隔的数据文件时, 就可以设置为逗号. 		  注意<AHREF="internalvariables.html#APPREF">$*</A>使用的是保存在<CODECLASS="VARNAME">$IFS</CODE>中的第一个字符.  参见<AHREF="quotingvar.html#WEIRDVARS">例子 5-1</A>.</P><P>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo $IFS | cat -vte</KBD><SAMPCLASS="COMPUTEROUTPUT">$</SAMP><SAMPCLASS="COMPUTEROUTPUT">(Show tabs and display "$" at end-of-line.)</SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">bash -c 'set w x y z; IFS=":-;"; echo "$*"'</KBD><SAMPCLASS="COMPUTEROUTPUT">w:x:y:z</SAMP><SAMPCLASS="COMPUTEROUTPUT">(从字符串中读取命令, 并分配参数给位置参数.)</SAMP>	      </PRE></FONT></TD></TR></TABLE>	  </P><DIVCLASS="CAUTION"><P></P><TABLECLASS="CAUTION"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/caution.gif"HSPACE="5"ALT="Caution"></TD><TDALIGN="LEFT"VALIGN="TOP"><P><CODECLASS="VARNAME">$IFS</CODE>处理其他字符与处理空白字符不同. 	  <DIVCLASS="EXAMPLE"><HR><ANAME="IFSH"></A><P><B>例子 9-1. $IFS与空白字符</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;# $IFS 处理空白与处理其他字符不同.   3&nbsp;  4&nbsp;output_args_one_per_line()  5&nbsp;{  6&nbsp;  for arg  7&nbsp;  do echo "[$arg]"  8&nbsp;  done  9&nbsp;} 10&nbsp; 11&nbsp;echo; echo "IFS=\" \"" 12&nbsp;echo "-------" 13&nbsp; 14&nbsp;IFS=" " 15&nbsp;var=" a  b c   " 16&nbsp;output_args_one_per_line $var  # output_args_one_per_line `echo " a  b c   "` 17&nbsp;# 18&nbsp;# [a] 19&nbsp;# [b] 20&nbsp;# [c] 21&nbsp; 22&nbsp; 23&nbsp;echo; echo "IFS=:" 24&nbsp;echo "-----" 25&nbsp; 26&nbsp;IFS=: 27&nbsp;var=":a::b:c:::"               # 与上边一样, 但是用" "替换了":". 28&nbsp;output_args_one_per_line $var 29&nbsp;# 30&nbsp;# [] 31&nbsp;# [a] 32&nbsp;# [] 33&nbsp;# [b] 34&nbsp;# [c] 35&nbsp;# [] 36&nbsp;# [] 37&nbsp;# [] 38&nbsp; 39&nbsp;# 同样的事情也会发生在awk的"FS"域中. 40&nbsp; 41&nbsp;# 感谢, Stephane Chazelas. 42&nbsp; 43&nbsp;echo 44&nbsp; 45&nbsp;exit 0</PRE></FONT></TD></TR></TABLE><HR></DIV>	  </P></TD></TR></TABLE></DIV><P>(感谢, S. C., 进行了澄清与举例.)</P><P>参见<AHREF="communications.html#ISSPAMMER">例子 12-37</A>, <AHREF="loops1.html#BINGREP">例子 10-7</A>, 和<AHREF="x13628.html#MAILBOXGREP">例子 17-14</A>             都是展示如何使用<CODECLASS="VARNAME">$IFS</CODE>的例子.</P></DD><DT><CODECLASS="VARNAME">$IGNOREEOF</CODE></DT><DD><P>忽略EOF: 告诉shell在log out之前要忽略多少文件结束符(control-D). </P></DD><DT><CODECLASS="VARNAME">$LC_COLLATE</CODE></DT><DD><P>常在<TTCLASS="FILENAME">.bashrc</TT>或<TTCLASS="FILENAME">/etc/profile</TT>中设置, 			  这个变量用来控制文件名扩展和模式匹配的展开顺序.			  如果$LC_COLLATE设置得不正确的话, 			  <CODECLASS="VARNAME">LC_COLLATE</CODE>会在<AHREF="globbingref.html">文件名匹配(filename 				  globbing)</A>中产生不可预料的结果.</P><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="90%"BORDER="0"><TR

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?