parameter-substitution.html

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

HTML
1,567
字号
<!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="string-manipulation.html"><LINKREL="NEXT"TITLE="指定变量的类型: 使用declare或者typeset"HREF="declareref.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="string-manipulation.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom">9. 变量重游</TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="declareref.html"ACCESSKEY="N">下一页</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="SECT1"><H1CLASS="SECT1"><ANAME="PARAMETER-SUBSTITUTION">9.3. 参数替换</A></H1><P><ANAME="PARAMSUBREF"></A></P><P></P><DIVCLASS="VARIABLELIST"><P><B><ANAME="PSSUB1"></A>处理和(或)扩展变量</B></P><DL><DT><KBDCLASS="USERINPUT">${parameter}</KBD></DT><DD><P>与<TTCLASS="REPLACEABLE"><I>$parameter</I></TT>相同, 		  也就是变量<TTCLASS="REPLACEABLE"><I>parameter</I></TT>的值.		  在某些上下文中, <TTCLASS="REPLACEABLE"><I>${parameter}</I></TT>很少会产生混淆. </P><P>可以把变量和字符串组合起来使用. </P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;your_id=${USER}-on-${HOSTNAME}  2&nbsp;echo "$your_id"  3&nbsp;#  4&nbsp;echo "Old \$PATH = $PATH"  5&nbsp;PATH=${PATH}:/opt/bin  #在脚本的生命周期中, /opt/bin会被添加到$PATH变量中.  6&nbsp;echo "New \$PATH = $PATH"</PRE></FONT></TD></TR></TABLE></P></DD><DT><KBDCLASS="USERINPUT">${parameter-default}</KBD>, <KBDCLASS="USERINPUT">${parameter:-default}</KBD></DT><DD><P>${parameter-default} -- 如果变量parameter没被声明, 那么就使用默认值.</P><P>${parameter:-default} -- 如果变量parameter没被设置, 那么就使用默认值.</P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;echo ${username-`whoami`}  2&nbsp;# 如果变量$username还没有被声明, 那么就echoe出`whoami`的结果(译者注: 也就是把'whoami'的结果赋值给变量$username). </PRE></FONT></TD></TR></TABLE></P><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P><TTCLASS="REPLACEABLE"><I>${parameter-default}</I></TT>				和<TTCLASS="REPLACEABLE"><I>${parameter:-default}</I></TT>在绝大多数的情况下都是相同的. 				只有在<EM>parameter</EM>已经被声明, 但是被赋null值得时候, 				这个额外的<SPANCLASS="TOKEN">:</SPAN>才会产生不同的结果. </P></TD></TR></TABLE></DIV><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;# param-sub.sh  3&nbsp;  4&nbsp;#  一个变量是否被声明或设置,  5&nbsp;#+ 将会影响这个变量是否使用默认值,   6&nbsp;#+ 即使这个变量值为空(null).  7&nbsp;  8&nbsp;username0=  9&nbsp;echo "username0 has been declared, but is set to null." 10&nbsp;echo "username0 = ${username0-`whoami`}" 11&nbsp;# 不会有输出. 12&nbsp; 13&nbsp;echo 14&nbsp; 15&nbsp;echo username1 has not been declared. 16&nbsp;echo "username1 = ${username1-`whoami`}" 17&nbsp;# 将会输出默认值. 18&nbsp; 19&nbsp;username2= 20&nbsp;echo "username2 has been declared, but is set to null." 21&nbsp;echo "username2 = ${username2:-`whoami`}" 22&nbsp;#                            ^ 23&nbsp;# 会输出, 因为:-会比-多一个条件测试. 24&nbsp;# 可以与上边的例子比较一下. 25&nbsp; 26&nbsp; 27&nbsp;# 28&nbsp; 29&nbsp;# 再来一个: 30&nbsp; 31&nbsp;variable= 32&nbsp;# 变量已经被声明, 但是设为空值.  33&nbsp; 34&nbsp;echo "${variable-0}"    # (没有输出) 35&nbsp;echo "${variable:-1}"   # 1 36&nbsp;#               ^ 37&nbsp; 38&nbsp;unset variable 39&nbsp; 40&nbsp;echo "${variable-2}"    # 2 41&nbsp;echo "${variable:-3}"   # 3 42&nbsp; 43&nbsp;exit 0</PRE></FONT></TD></TR></TABLE></P><P>如果脚本并没有接收到来自命令行的参数, 			那么<EM>默认参数</EM>结构将会提供一个默认值给脚本. </P><P>		  <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;DEFAULT_FILENAME=generic.data  2&nbsp;filename=${1:-$DEFAULT_FILENAME}  3&nbsp;#  如果没有指定值, 那么下面的代码块将会使用filename  4&nbsp;#+ 变量的默认值"generic.data".  5&nbsp;#  6&nbsp;#  后续的命令. </PRE></FONT></TD></TR></TABLE>		</P><P>参考<AHREF="special-chars.html#EX58">例子 3-4</A>, <AHREF="zeros.html#EX73">例子 28-2</A>, 和<AHREF="contributed-scripts.html#COLLATZ">例子 A-6</A>.</P><P>与<AHREF="list-cons.html#ANDDEFAULT">使用一个<EM>与列表</EM>来提供一个默认的命令行参数</A>的方法相比较.</P></DD><DT><KBDCLASS="USERINPUT">${parameter=default}</KBD>, <KBDCLASS="USERINPUT">${parameter:=default}</KBD></DT><DD><P><ANAME="DEFPARAM"></A></P><P>${parameter=default} -- 如果变量parameter没声明, 那么就把它的值设为default. </P><P>${parameter:=default} -- 如果变量parameter没设置, 那么就把它的值设为default. </P><P>这两种形式基本上是一样的. 只有在变量<EM>$parameter</EM>被声明并且被设置为null值的时候, 			<SPANCLASS="TOKEN">:</SPAN>才会引起这两种形式的不同.		    <ANAME="AEN4933"HREF="#FTN.AEN4933"><SPANCLASS="footnote">[1]</SPAN></A>		  如上边所示.		    </P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;echo ${username=`whoami`}  2&nbsp;# 变量"username"现在被赋值为`whoami`.</PRE></FONT></TD></TR></TABLE></P></DD><DT><KBDCLASS="USERINPUT">${parameter+alt_value}</KBD>, <KBDCLASS="USERINPUT">${parameter:+alt_value}</KBD></DT><DD><P>${parameter+alt_value} -- 如果变量parameter被声明了, 				那么就使用<KBDCLASS="USERINPUT">alt_value</KBD>, 否则就使用null字符串.</P><P>${parameter:+alt_value} -- 如果变量parameter被设置了, 				那么就使用<KBDCLASS="USERINPUT">alt_value</KBD>, 否则就使用null字符串.</P><P>这两种形式绝大多数情况下都一样. 只有在<EM>parameter</EM>被声明并且设置为null值的时候, 				多出来的这个<SPANCLASS="TOKEN">:</SPAN>才会引起这两种形式的不同, 具体请看下边的例子. </P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;echo "###### \${parameter+alt_value} ########"  2&nbsp;echo  3&nbsp;  4&nbsp;a=${param1+xyz}  5&nbsp;echo "a = $a"      # a =  6&nbsp;  7&nbsp;param2=  8&nbsp;a=${param2+xyz}  9&nbsp;echo "a = $a"      # a = xyz 10&nbsp; 11&nbsp;param3=123 12&nbsp;a=${param3+xyz} 13&nbsp;echo "a = $a"      # a = xyz 14&nbsp; 15&nbsp;echo 16&nbsp;echo "###### \${parameter:+alt_value} ########" 17&nbsp;echo 18&nbsp; 19&nbsp;a=${param4:+xyz} 20&nbsp;echo "a = $a"      # a = 21&nbsp; 22&nbsp;param5= 23&nbsp;a=${param5:+xyz} 24&nbsp;echo "a = $a"      # a = 25&nbsp;# 产生与a=${param5+xyz}不同的结果. 26&nbsp; 27&nbsp;param6=123 28&nbsp;a=${param6:+xyz} 29&nbsp;echo "a = $a"      # a = xyz</PRE></FONT></TD></TR></TABLE></P></DD><DT><ANAME="QERRMSG"></A><KBDCLASS="USERINPUT">${parameter?err_msg}</KBD>, <KBDCLASS="USERINPUT">${parameter:?err_msg}</KBD></DT><DD><P>${parameter?err_msg} -- 如果parameter已经被声明, 那么就使用设置的值, 否则打印err_msg错误消息.</P><P>${parameter:?err_msg} -- 如果parameter已经被设置, 那么就使用设置的值, 否则打印err_msg错误消息.</P><P>这两种形式绝大多数情况都是一样的. 和上边所讲的情况一样, 				只有在<EM>parameter</EM>被声明并设置为null值的时候, 				多出来的<SPANCLASS="TOKEN">:</SPAN>才会引起这两种形式的不同. </P></DD></DL></DIV><DIVCLASS="EXAMPLE"><HR><ANAME="EX6"></A><P><B>例子 9-15. 使用参数替换和错误消息</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;  3&nbsp;#  检查一些系统环境变量.  4&nbsp;#  这是一种可以做一些预防性保护措施的好习惯.  5&nbsp;#  比如, 如果$USER(用户在控制台上中的名字)没有被设置的话,  6&nbsp;#+ 那么系统就会不认你.  7&nbsp;  8&nbsp;: ${HOSTNAME?} ${USER?} ${HOME?} ${MAIL?}  9&nbsp;  echo 10&nbsp;  echo "Name of the machine is $HOSTNAME." 11&nbsp;  echo "You are $USER." 12&nbsp;  echo "Your home directory is $HOME." 13&nbsp;  echo "Your mail INBOX is located in $MAIL." 14&nbsp;  echo 15&nbsp;  echo "If you are reading this message," 16&nbsp;  echo "critical environmental variables have been set." 17&nbsp;  echo 18&nbsp;  echo 19&nbsp; 20&nbsp;# ------------------------------------------------------

⌨️ 快捷键说明

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