⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch04_03.htm

📁 unix基础教程
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<html><head><title>Variables (UNIX in a Nutshell: System V Edition)</title><link rel="stylesheet" type="text/css" href="../style/style1.css" /><meta name="DC.Creator" content="Arnold Robbins" /><meta name="DC.Format" content="text/xml" scheme="MIME" /><meta name="DC.Language" content="en-US" /><meta name="DC.Publisher" content="O'Reilly &amp; Associates, Inc." /><meta name="DC.Source" scheme="ISBN" content="1-56592-427-4" /><meta name="DC.Subject.Keyword" content="stuff" /><meta name="DC.Title" content="UNIX in a Nutshell: System V Edition" /><meta name="DC.Type" content="Text.Monograph" /></head><body bgcolor="#ffffff"><img src="gifs/smbanner.gif" usemap="#banner-map" border="0" alt="Book Home" /><map name="banner-map"><area shape="rect" coords="1,-2,616,66" href="index.htm" alt="Book Title" /><area shape="rect" coords="629,-11,726,25" href="jobjects/fsearch.htm" alt="Search this book" /></map><div class="navbar"><table width="684" border="0"><tr><td align="left" valign="top" width="228"><a href="ch04_02.htm"><img src="../gifs/txtpreva.gif" alt="Previous" border="0" /></a></td><td align="center" valign="top" width="228" /><td align="right" valign="top" width="228"><a href="ch04_04.htm"><img src="../gifs/txtnexta.gif" alt="Next" border="0" /></a></td></tr></table></div><h2 class="sect1">4.3. Variables</h2><p><a name="unut-ch-4-ix-variables-sh-and-ksh-shells" /><a name="unut-ch-4-ix-ksh-korn-shell-variables" /><a name="unut-ch-4-ix-sh-bourne-shell-variables" />This section describes the following:</p><ul><li><p>Variable substitution</p></li><li><p>Built-in shell variables</p></li><li><p>Other shell variables</p></li><li><p>Arrays (Korn shell only)</p></li><li><p>Discipline functions (<tt class="literal">ksh93</tt> only)</p></li></ul><a name="unut-ch-4-sect-3.1" /><div class="sect2"><h3 class="sect2">4.3.1. Variable Substitution</h3><p><tt class="literal">ksh93</tt> provides structured variables, such as<tt class="literal">pos.x</tt> and <tt class="literal">pos.y</tt>.To create either one, <tt class="literal">pos</tt> must alreadyexist, and braces must be used to retrieve their values.Names beginning with <tt class="literal">.sh</tt> arereserved for use by <tt class="literal">ksh</tt>.</p><p><a name="IXT-4-122708" />No spaces should be used in the following expressions.  The colon(<tt class="literal">:</tt>) is optional;if it's included, <em class="emphasis">var</em> must be nonnull aswell as set.</p><table border="1" cellpadding="3"><tr><td><p><em class="replaceable"><tt>var</em><tt class="literal">=</tt><em class="replaceable">value</tt></em> ...</p></td><td><p>Set each variable <em class="emphasis">var</em> to a <em class="emphasis">value</em>.</p></td></tr><tr><td><p><tt class="literal">${</tt><em class="replaceable"><tt>var</tt></em><tt class="literal">}</tt></p></td><td><p>Use value of <em class="emphasis">var</em>;braces are optional if <em class="emphasis">var</em> is separated from the following text.They are required in <tt class="literal">ksh93</tt> if a variable name contains periods.</p></td></tr><tr><td><p><tt class="literal">${</tt><em class="replaceable"><tt>var</em><tt class="literal">:-</tt><em class="replaceable">value</tt></em><tt class="literal">}</tt></p></td><td><p>Use <em class="emphasis">var</em> if set; otherwise, use <em class="emphasis">value</em>.</p></td></tr><tr><td><p><tt class="literal">${</tt><em class="replaceable"><tt>var</em><tt class="literal">:=</tt><em class="replaceable">value</tt></em><tt class="literal">}</tt></p></td><td><p>Use <em class="emphasis">var</em> if set; otherwise, use <em class="emphasis">value</em>and assign <em class="emphasis">value</em> to <em class="emphasis">var</em>.</p></td></tr><tr><td><p><tt class="literal">${</tt><em class="replaceable"><tt>var</em><tt class="literal">:?</tt><em class="replaceable">value</tt></em><tt class="literal">}</tt></p></td><td><p>Use <em class="emphasis">var</em> if set; otherwise,print <em class="emphasis">value</em> and exit (if not interactive).If <em class="emphasis">value</em> isn't supplied, print the phrase&#8220;parameter null or not set.&#8221;</p></td></tr><tr><td><p><tt class="literal">${</tt><em class="replaceable"><tt>var</em><tt class="literal">:+</tt><em class="replaceable">value</tt></em><tt class="literal">}</tt></p></td><td><p>Use <em class="emphasis">value</em> if <em class="emphasis">var</em> is set; otherwise, use nothing.</p></td></tr></table><p><p>In the Korn shell:</p><table border="1" cellpadding="3"><tr><td><p><tt class="literal">${#</tt><em class="replaceable"><tt>var</tt></em><tt class="literal">}</tt></p></td><td><p>Use the length of <em class="emphasis">var</em>.</p></td></tr><tr><td><p><tt class="literal">${#*}</tt></p><p><tt class="literal">${#@}</tt></p></td><td><p>Use the number of positional parameters.</p></td></tr><tr><td><p><tt class="literal">${</tt><em class="replaceable"><tt>var</em><tt class="literal">#</tt><em class="replaceable">pattern</tt></em><tt class="literal">}</tt></p></td><td><p>Use value of <em class="emphasis">var</em> after removing<em class="emphasis">pattern</em> from the left.Remove the shortest matching piece.</p></td></tr><tr><td><p><tt class="literal">${</tt><em class="replaceable"><tt>var</em><tt class="literal">##</tt><em class="replaceable">pattern</tt></em><tt class="literal">}</tt></p></td><td><p>Same as <tt class="literal">#</tt><em class="emphasis">pattern</em>,but remove the longest matching piece.</p></td></tr><tr><td><p><tt class="literal">${</tt><em class="replaceable"><tt>var</em><tt class="literal">%</tt><em class="replaceable">pattern</tt></em><tt class="literal">}</tt></p></td><td><p>Use value of <em class="emphasis">var</em> after removing<em class="emphasis">pattern</em> from the right.Remove the shortest matching piece.</p></td></tr><tr><td><p><tt class="literal">${</tt><em class="replaceable"><tt>var</em><tt class="literal">%%</tt><em class="replaceable">pattern</tt></em><tt class="literal">}</tt></p></td><td><p>Same as <tt class="literal">%</tt><em class="emphasis">pattern</em>,but remove the longest matching piece.</p></td></tr></table><p>In <tt class="literal">ksh93</tt>:</p><table border="1" cellpadding="3"><tr><td><tt class="literal">${!</tt><em class="replaceable"><tt>prefix</tt></em><tt class="literal">*}</tt></p><p><tt class="literal">${!</tt><em class="replaceable"><tt>prefix</tt></em><tt class="literal">@}</tt></p></td><td><p>List of variables whose names begin with <em class="emphasis">prefix</em>.</p></td></tr><tr><td><p><tt class="literal">${</tt><em class="replaceable"><tt>var</em><tt class="literal">:</tt><em class="replaceable">pos</tt></em><tt class="literal">}</tt></p><p><tt class="literal">${</tt><em class="replaceable"><tt>var</em><tt class="literal">:</tt><em class="replaceable">pos</em><tt class="literal">:</tt><em class="replaceable">len</tt></em><tt class="literal">}</tt></p></td><td><p>Starting at position <em class="emphasis">pos</em> (0-based) in variable<em class="emphasis">var</em>, extract <em class="emphasis">len</em> characters,or rest of string if no <em class="emphasis">len</em>. <em class="emphasis">pos</em> and <em class="emphasis">len</em> may bearithmetic expressions.</p></td></tr><tr><td><p><tt class="literal">${</tt><em class="replaceable"><tt>var</em><tt class="literal">:</tt><em class="replaceable">pos</em><tt class="literal">:</tt><em class="replaceable">len</tt></em><tt class="literal">}</tt></p></td></tr><tr><td><p><tt class="literal">${</tt><em class="replaceable"><tt>var</em><tt class="literal">/</tt><em class="replaceable">pat</em><tt class="literal">/</tt><em class="replaceable">repl</tt></em><tt class="literal">}</tt></p></td><td><p>Use value of <em class="emphasis">var</em>, with first match of<em class="emphasis">pat</em> replaced with <em class="emphasis">repl</em>.</p></td></tr><tr><td><p><tt class="literal">${</tt><em class="replaceable"><tt>var</em><tt class="literal">/</tt><em class="replaceable">pat</tt></em><tt class="literal">}</tt></p></td><td><p>Use value of <em class="emphasis">var</em>, with first match of<em class="emphasis">pat</em> deleted.</p></td></tr><tr><td><p><tt class="literal">${</tt><em class="replaceable"><tt>var</em><tt class="literal">//</tt><em class="replaceable">pat</em><tt class="literal">/</tt><em class="replaceable">repl</tt></em><tt class="literal">}</tt></p></td><td><p>Use value of <em class="emphasis">var</em>, with every match of<em class="emphasis">pat</em> replaced with <em class="emphasis">repl</em>.</p></td></tr><tr><td><p><tt class="literal">${</tt><em class="replaceable"><tt>var</em><tt class="literal">/#</tt><em class="replaceable">pat</em><tt class="literal">/</tt><em class="replaceable">repl</tt></em><tt class="literal">}</tt></p></td><td><p>Use value of <em class="emphasis">var</em>, with match of<em class="emphasis">pat</em> replaced with <em class="emphasis">repl</em>.Match must occur at beginning of the value.</p></td></tr><tr><td><p><tt class="literal">${</tt><em class="replaceable"><tt>var</em><tt class="literal">/%</tt><em class="replaceable">pat</em><tt class="literal">/</tt><em class="replaceable">repl</tt></em><tt class="literal">}</tt></p></td><td><p>Use value of <em class="emphasis">var</em>, with match of<em class="emphasis">pat</em> replaced with <em class="emphasis">repl</em>.Match must occur at end of the value.</p></td></tr></table><p><p>In <tt class="literal">ksh93</tt>,indirect variables allow you to &#8220;alias&#8221; one variablename to affect the value of another.  This is accomplishedusing <tt class="literal">typeset -n</tt>:</p><blockquote><pre class="code">$ <tt class="userinput"><b>greet="hello, world"</b></tt>			<i class="lineannotation">Create initial variable</i>$ <tt class="userinput"><b>typeset -n friendly_message=greet</b></tt>	<i class="lineannotation">Set up alias</i>$ <tt class="userinput"><b>echo $friendly_message</b></tt>		<i class="lineannotation">Access old value through new name</i>hello, world$ <tt class="userinput"><b>friendly_message="don't panic"</b></tt>	<i class="lineannotation">Change the value</i>$ <tt class="userinput"><b>echo $greet</b></tt>				<i class="lineannotation">Old variable is changed</i>don't panic</pre></blockquote><a name="unut-ch-4-sect-3.1.1" /><div class="sect3"><h3 class="sect3">4.3.1.1. Examples</h3><blockquote><pre class="code">$ <tt class="userinput"><b>u=up d=down blank=</b></tt>		<i class="lineannotation">Assign values to three variables (last is null)</i>$ <tt class="userinput"><b>echo ${u}root</b></tt>			<i class="lineannotation">Braces are needed here</i>uproot$ <tt class="userinput"><b>echo ${u-$d}</b></tt>                   <i class="lineannotation">Display value of u or d; since u is set, it's printed</i>up$ <tt class="userinput"><b>echo ${tmp-`date`}</b></tt>	          <i class="lineannotation">If tmp is not set, the date command is executed</i>Thu Feb  4 15:03:46 EST 1993$ <tt class="userinput"><b>echo ${blank="no data"}</b></tt>        <i class="lineannotation">blank is set, so it is printed (a blank line)</i>$ <tt class="userinput"><b>echo ${blank:="no data"}</b></tt>	<i class="lineannotation">blank is set but null, so the string is printed</i>no data	$ <tt class="userinput"><b>echo $blank</b></tt>			<i class="lineannotation">blank now has a new value </i>no data</pre></blockquote></div><a name="unut-ch-4-sect-3.1.2" /><div class="sect3"><h3 class="sect3">4.3.1.2. Korn shell example</h3><blockquote><pre class="code">tail='${PWD##*/}'	<i class="lineannotation">Take the current directory name and remove the longest character string                         ending with /, which removes the leading pathname and leaves the tail</i></pre></blockquote></div></div><a name="unut-ch-4-sect-3.2" /><div class="sect2"><h3 class="sect2">4.3.2. Built-in Shell Variables</h3><p><a name="IXT-4-122709" /><a name="unut-ch-4-ix-shell-variables-sh-and-ksh-shells" /><a name="IXT-4-122710" />Built-in variables are automatically set by the shell andare typically used inside shell scripts.  Built-in variables can make use of the variable substitution patterns shown previously.Note that the <tt class="literal">$</tt> is not actually part of the variable name,although the variable is always referenced this way.<a name="IXT-4-122711" /></p><table border="1" cellpadding="3"><tr><td><p><tt class="literal">$#</tt></p></td><td><p>Number of command-line arguments.</p></td></tr><tr><td><p><tt class="literal">$-</tt></p></td><td><p>Options currently in effect (arguments supplied to <tt class="literal">sh</tt> orto <tt class="literal">set</tt>). </p></td></tr><tr><td><p><tt class="literal">$?</tt></p></td><td><p>Exit value of last executed command.</p></td></tr><tr><td><p><tt class="literal">$$</tt></p></td><td><p>Process number of current process.</p></td></tr><tr><td><p><tt class="literal">$!</tt></p></td><td><p>Process number of last background command.</p></td></tr><tr><td><p><tt class="literal">$0</tt></p></td><td><p>First word; that is, command name.This will have the full path name if it was found via a

⌨️ 快捷键说明

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