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 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 declare -i number 2 # 脚本将会把变量"number"按照整型进行处理. 3 4 number=3 5 echo "Number = $number" # Number = 3 6 7 number=three 8 echo "Number = $number" # Number = 0 9 # 脚本尝试把字符串"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 n=6/3 2 echo "n = $n" # n = 6/3 3 4 declare -i n 5 n=6/3 6 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 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 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 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 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 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 #!/bin/bash 2 3 func1 () 4 { 5 echo This is a function. 6 } 7 8 declare -f # 列出前面定义的所有函数. 9 10 echo 11 12 declare -i var1 # var1是个整型变量. 13 var1=2367 14 echo "var1 declared as $var1" 15 var1=var1+1 # 整型变量的声明并不需要使用'let'命令. 16 echo "var1 incremented by 1 is $var1." 17 # 尝试修改一个已经声明为整型变量的值. 18 echo "Attempting to change var1 to floating point value, 2367.1." 19 var1=2367.1 # 产生错误信息, 并且变量并没有被修改. 20 echo "var1 is still $var1" 21 22 echo 23 24 declare -r var2=13.36 # 'declare'允许设置变量的属性, 25 #+ 同时给变量赋值. 26 echo "var2 declared as $var2" # 试图修改只读变量的值. 27 var2=13.37 # 产生错误消息, 并且从脚本退出. 28 29 echo "var2 is still $var2" # 将不会执行到这行. 30 31 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 foo () 2 { 3 FOO="bar" 4 } 5 6 bar () 7 { 8 foo 9 echo $FOO 10 } 11 12 bar # 打印bar. </PRE></FONT></TD></TR></TABLE></P><P>然而 . . . <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 foo (){ 2 declare FOO="bar" 3 } 4 5 bar () 6 { 7 foo 8 echo $FOO 9 } 10 11 bar # 什么都不打印. 12 13 14 # 感谢, 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 + -
显示快捷键?