declareref.html

来自「BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版」· HTML 代码 · 共 591 行

HTML
591
字号
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><HTML><HEAD><TITLE>指定变量的类型: 使用declare或者typeset</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="parameter-substitution.html"><LINKREL="NEXT"TITLE="变量的间接引用"HREF="ivr.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="parameter-substitution.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom">9. 变量重游</TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="ivr.html"ACCESSKEY="N">下一页</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="SECT1"><H1CLASS="SECT1"><ANAME="DECLAREREF">9.4. 指定变量的类型: 使用<BCLASS="COMMAND">declare</B>或者<BCLASS="COMMAND">typeset</B></A></H1><P><ICLASS="FIRSTTERM">declare</I>或者<ICLASS="FIRSTTERM">typeset</I><AHREF="internal.html#BUILTINREF">内建</A>命令(这两个命令是完全一样的)允许指定变量的具体类型. 	在某些编程语言中, 这是指定变量类型的一种很弱的形式. 	<BCLASS="COMMAND">declare</B>命令是从Bash 2.0之后才被引入的命令.	  <BCLASS="COMMAND">typeset</B>也可以用在ksh的脚本中. </P><P></P><DIVCLASS="VARIABLELIST"><P><B><ANAME="DECLAREOPSREF1"></A>declare/typeset选项</B></P><DL><DT><SPANCLASS="TOKEN">-r</SPAN> <TTCLASS="REPLACEABLE"><I>只读</I></TT></DT><DD><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;declare -r var1</PRE></FONT></TD></TR></TABLE></P><P>(<KBDCLASS="USERINPUT">declare -r var1</KBD>与<KBDCLASS="USERINPUT">readonly var1</KBD>是完全一样的)</P><P>这和C语言中的<BCLASS="COMMAND">const</B>关键字一样, 都用来指定变量为只读. 			  如果你尝试修改一个只读变量的值, 那么会产生错误信息. </P></DD><DT><SPANCLASS="TOKEN">-i</SPAN> <TTCLASS="REPLACEABLE"><I>整型</I></TT></DT><DD><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;declare -i number  2&nbsp;# 脚本将会把变量"number"按照整型进行处理.   3&nbsp;  4&nbsp;number=3  5&nbsp;echo "Number = $number"     # Number = 3  6&nbsp;  7&nbsp;number=three  8&nbsp;echo "Number = $number"     # Number = 0  9&nbsp;# 脚本尝试把字符串"three"作为整数来求值(译者注: 当然会失败, 所以出现值为0). </PRE></FONT></TD></TR></TABLE></P><P>如果把一个变量指定为整型的话, 				  那么即使没有<AHREF="moreadv.html#EXPRREF">expr</A>或者<AHREF="internal.html#LETREF">let</A>命令, 也允许使用特定的算术运算.</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;n=6/3  2&nbsp;echo "n = $n"       # n = 6/3  3&nbsp;  4&nbsp;declare -i n  5&nbsp;n=6/3  6&nbsp;echo "n = $n"       # n = 2</PRE></FONT></TD></TR></TABLE></P></DD><DT><SPANCLASS="TOKEN">-a</SPAN> <TTCLASS="REPLACEABLE"><I>数组</I></TT></DT><DD><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;declare -a indices</PRE></FONT></TD></TR></TABLE></P><P>变量<CODECLASS="VARNAME">indices</CODE>将被视为数组.</P></DD><DT><SPANCLASS="TOKEN">-f</SPAN> <TTCLASS="REPLACEABLE"><I>函数</I></TT></DT><DD><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;declare -f</PRE></FONT></TD></TR></TABLE></P><P>如果在脚本中使用<KBDCLASS="USERINPUT">declare -f</KBD>, 而不加任何参数的话, 		那么将会列出这个脚本之前定义的所有函数. </P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;declare -f function_name</PRE></FONT></TD></TR></TABLE></P><P>如果在脚本中使用<KBDCLASS="USERINPUT">declare -f function_name</KBD>这种形式的话, 			  将只会列出这个函数的名字. </P></DD><DT><SPANCLASS="TOKEN">-x</SPAN> <AHREF="internal.html#EXPORTREF">export</A></DT><DD><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;declare -x var3</PRE></FONT></TD></TR></TABLE></P><P>这句将会声明一个变量, 并作为这个脚本的环境变量被导出. </P></DD><DT>-x var=$value</DT><DD><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;declare -x var3=373</PRE></FONT></TD></TR></TABLE></P><P><BCLASS="COMMAND">declare</B>命令允许在声明变量类型的同时给变量赋值. </P></DD></DL></DIV><DIVCLASS="EXAMPLE"><HR><ANAME="EX20"></A><P><B>例子 9-22. 使用<BCLASS="COMMAND">declare</B>来指定变量的类型</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;  3&nbsp;func1 ()  4&nbsp;{  5&nbsp;echo This is a function.  6&nbsp;}  7&nbsp;  8&nbsp;declare -f        # 列出前面定义的所有函数.  9&nbsp; 10&nbsp;echo 11&nbsp; 12&nbsp;declare -i var1   # var1是个整型变量. 13&nbsp;var1=2367 14&nbsp;echo "var1 declared as $var1" 15&nbsp;var1=var1+1       # 整型变量的声明并不需要使用'let'命令. 16&nbsp;echo "var1 incremented by 1 is $var1." 17&nbsp;# 尝试修改一个已经声明为整型变量的值. 18&nbsp;echo "Attempting to change var1 to floating point value, 2367.1." 19&nbsp;var1=2367.1       # 产生错误信息, 并且变量并没有被修改. 20&nbsp;echo "var1 is still $var1" 21&nbsp; 22&nbsp;echo 23&nbsp; 24&nbsp;declare -r var2=13.36         # 'declare'允许设置变量的属性,  25&nbsp;                              #+ 同时给变量赋值. 26&nbsp;echo "var2 declared as $var2" # 试图修改只读变量的值. 27&nbsp;var2=13.37                    # 产生错误消息, 并且从脚本退出. 28&nbsp; 29&nbsp;echo "var2 is still $var2"    # 将不会执行到这行. 30&nbsp; 31&nbsp;exit 0                        # 脚本也不会从此处退出.</PRE></FONT></TD></TR></TABLE><HR></DIV><DIVCLASS="CAUTION"><P></P><TABLECLASS="CAUTION"WIDTH="100%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/caution.gif"HSPACE="5"ALT="Caution"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>使用<EM>declare</EM>内建命令可以限制变量的<ICLASS="FIRSTTERM">作用域</I>.	  <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;foo ()  2&nbsp;{  3&nbsp;FOO="bar"  4&nbsp;}  5&nbsp;  6&nbsp;bar ()  7&nbsp;{  8&nbsp;foo  9&nbsp;echo $FOO 10&nbsp;} 11&nbsp; 12&nbsp;bar   # 打印bar. </PRE></FONT></TD></TR></TABLE></P><P>然而 . . .	  <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;foo (){  2&nbsp;declare FOO="bar"  3&nbsp;}  4&nbsp;  5&nbsp;bar ()  6&nbsp;{  7&nbsp;foo  8&nbsp;echo $FOO  9&nbsp;} 10&nbsp; 11&nbsp;bar  # 什么都不打印. 12&nbsp; 13&nbsp; 14&nbsp;# 感谢, Michael Iatrou, 指出这点. </PRE></FONT></TD></TR></TABLE></P></TD></TR></TABLE></DIV></DIV><DIVCLASS="NAVFOOTER"><HRALIGN="LEFT"WIDTH="100%"><TABLESUMMARY="Footer navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><AHREF="parameter-substitution.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="index.html"ACCESSKEY="H">首页</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="ivr.html"ACCESSKEY="N">下一页</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">参数替换</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="variables2.html"ACCESSKEY="U">上一级</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">变量的间接引用</TD></TR></TABLE></DIV></BODY></HTML>

⌨️ 快捷键说明

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