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 your_id=${USER}-on-${HOSTNAME} 2 echo "$your_id" 3 # 4 echo "Old \$PATH = $PATH" 5 PATH=${PATH}:/opt/bin #在脚本的生命周期中, /opt/bin会被添加到$PATH变量中. 6 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 echo ${username-`whoami`} 2 # 如果变量$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 #!/bin/bash 2 # param-sub.sh 3 4 # 一个变量是否被声明或设置, 5 #+ 将会影响这个变量是否使用默认值, 6 #+ 即使这个变量值为空(null). 7 8 username0= 9 echo "username0 has been declared, but is set to null." 10 echo "username0 = ${username0-`whoami`}" 11 # 不会有输出. 12 13 echo 14 15 echo username1 has not been declared. 16 echo "username1 = ${username1-`whoami`}" 17 # 将会输出默认值. 18 19 username2= 20 echo "username2 has been declared, but is set to null." 21 echo "username2 = ${username2:-`whoami`}" 22 # ^ 23 # 会输出, 因为:-会比-多一个条件测试. 24 # 可以与上边的例子比较一下. 25 26 27 # 28 29 # 再来一个: 30 31 variable= 32 # 变量已经被声明, 但是设为空值. 33 34 echo "${variable-0}" # (没有输出) 35 echo "${variable:-1}" # 1 36 # ^ 37 38 unset variable 39 40 echo "${variable-2}" # 2 41 echo "${variable:-3}" # 3 42 43 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 DEFAULT_FILENAME=generic.data 2 filename=${1:-$DEFAULT_FILENAME} 3 # 如果没有指定值, 那么下面的代码块将会使用filename 4 #+ 变量的默认值"generic.data". 5 # 6 # 后续的命令. </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 echo ${username=`whoami`} 2 # 变量"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 echo "###### \${parameter+alt_value} ########" 2 echo 3 4 a=${param1+xyz} 5 echo "a = $a" # a = 6 7 param2= 8 a=${param2+xyz} 9 echo "a = $a" # a = xyz 10 11 param3=123 12 a=${param3+xyz} 13 echo "a = $a" # a = xyz 14 15 echo 16 echo "###### \${parameter:+alt_value} ########" 17 echo 18 19 a=${param4:+xyz} 20 echo "a = $a" # a = 21 22 param5= 23 a=${param5:+xyz} 24 echo "a = $a" # a = 25 # 产生与a=${param5+xyz}不同的结果. 26 27 param6=123 28 a=${param6:+xyz} 29 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 #!/bin/bash 2 3 # 检查一些系统环境变量. 4 # 这是一种可以做一些预防性保护措施的好习惯. 5 # 比如, 如果$USER(用户在控制台上中的名字)没有被设置的话, 6 #+ 那么系统就会不认你. 7 8 : ${HOSTNAME?} ${USER?} ${HOME?} ${MAIL?} 9 echo 10 echo "Name of the machine is $HOSTNAME." 11 echo "You are $USER." 12 echo "Your home directory is $HOME." 13 echo "Your mail INBOX is located in $MAIL." 14 echo 15 echo "If you are reading this message," 16 echo "critical environmental variables have been set." 17 echo 18 echo 19 20 # ------------------------------------------------------
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?