﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Free mind-随笔分类-2. System</title><link>http://www.blogjava.net/morphis/category/18904.html</link><description>Be fresh and eager every morning, and tired and satisfied every night.</description><language>zh-cn</language><lastBuildDate>Mon, 21 May 2007 19:32:41 GMT</lastBuildDate><pubDate>Mon, 21 May 2007 19:32:41 GMT</pubDate><ttl>60</ttl><item><title>Linux 技巧: Bash 测试和比较函数</title><link>http://www.blogjava.net/morphis/archive/2007/05/19/118505.html</link><dc:creator>morphis</dc:creator><author>morphis</author><pubDate>Sat, 19 May 2007 02:14:00 GMT</pubDate><guid>http://www.blogjava.net/morphis/archive/2007/05/19/118505.html</guid><wfw:comment>http://www.blogjava.net/morphis/comments/118505.html</wfw:comment><comments>http://www.blogjava.net/morphis/archive/2007/05/19/118505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/morphis/comments/commentRss/118505.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/morphis/services/trackbacks/118505.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr vAlign=top>
            <td width="100%">
            <h1><span style="COLOR: #999999">Linux 技巧: </span>Bash 测试和比较函数</h1>
            <p id=subtitle>test、[、[[、((、和 if-then-else 解密</p>
            <img class=display-img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=1></td>
            <td class=no-print width=192><img height=18 alt=developerWorks src="http://www.ibm.com/developerworks/i/dw.gif" width=192></td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr vAlign=top>
            <td width=10><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=10></td>
            <td width="100%">
            <p>级别： 中级</p>
            <p><a href="http://www.ibm.com/developerworks/cn/linux/l-bash-test.html#author"><font color=#5c81a7>Ian Shields</font></a> (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#105;&#115;&#104;&#105;&#101;&#108;&#100;&#115;&#64;&#117;&#115;&#46;&#105;&#98;&#109;&#46;&#99;&#111;&#109;&#63;&#115;&#117;&#98;&#106;&#101;&#99;&#116;&#61;&#66;&#97;&#115;&#104;&#32;&#27979;&#35797;&#21644;&#27604;&#36739;&#20989;&#25968;"><font color=#5c81a7>ishields@us.ibm.com</font></a>), 高级程序员, IBM <br></p>
            <p>2007 年 3 月 16 日</p>
            <blockquote>您是否为 Bash shell 中大量的测试和比较选项而困惑呢？这个技巧可以帮助您解密不同类型的文件、算术和字符串测试，这样您就能够知道什么时候使用 <code>test</code>、 <code>[&nbsp;]</code>、 <code>[[&nbsp;]]</code>、 <code>((&nbsp;))</code> 或 <code>if-then-else</code> 了。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
            <p>Bash shell 在当今的许多 Linux&#174; 和 UNIX&#174; 系统上都可使用，是 Linux 上常见的默认 shell。Bash 包含强大的编程功能，其中包括丰富的可测试文件类型和属性的函数，以及在多数编程语言中可以使用的算术和字符串比较函数。理解不同的测试并认识到 shell 还能把一些操作符解释成 shell 元字符，是成为高级 shell 用户的重要一步。这篇文章摘自 developerWorks 教程 <a href="http://www.ibm.com/developerworks/cn/linux/edu/l-dw-linux-lpic1109-i.html"><font color=#5c81a7>LPI exam 102 prep: Shells, scripting, programming, and compiling</font></a>，介绍了如何理解和使用 Bash shell 的测试和比较操作。</p>
            <p>这个技巧解释了 shell 测试和比较函数，演示了如何向 shell 添加编程功能。您可能已经看到过使用 &amp;&amp; 和 || 操作符的简单 shell 逻辑，它允许您根据前一条命令的退出状态（正确退出或伴随错误退出）而执行后一条命令。在这个技巧中，将看到如何把这些基本的技术扩展成更复杂的 shell 编程。</p>
            <p><a name=N10081><span class=atitle>测试</span></a></p>
            <p>在任何一种编程语言中，学习了如何给变量分配值和传递参数之后，都需要测试这些值和参数。在 shell 中，测试会设置返回的状态，这与其他命令执行的功能相同。实际上，<code>test</code> 是个内置<em>命令</em>！</p>
            <p><a name=N10090><span class=smalltitle><strong><font face=Arial>test 和 [</font></strong></span></a></p>
            <p>内置命令 <code>test</code> 根据表达式<em>expr</em> 求值的结果返回 0（真）或 1（假）。也可以使用方括号：<code>test&nbsp;<em>expr</em></code> 和 [ <em>expr</em> ] 是等价的。 可以用 <code>$?</code> 检查返回值；可以使用 &amp;&amp; 和 || 操作返回值；也可以用本技巧后面介绍的各种条件结构测试返回值。</p>
            <br><a name=N100B1><strong>清单 1. 一些简单测试</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="75%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>[ian@pinguino ~]$ test 3 -gt 4 &amp;&amp; echo True || echo false
                        false
                        [ian@pinguino ~]$ [ "abc" != "def" ];echo $?
                        0
                        [ian@pinguino ~]$ test -d "$HOME" ;echo $?
                        0
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>在清单 1 的第一个示例中，<code>-gt</code> 操作符对两个字符值之间执行算术比较。在第二个示例中，用 <code>[&nbsp;]</code> 的形式比较两个字符串不相等。在最后一个示例中，测试 HOME 变量的值，用单目操作符 <code>-d</code> 检查它是不是目录。</p>
            <p>可以用 <code>-eq</code>、 -<code>ne</code>、<code>-lt</code>、 -<code>le</code>、 -<code>gt</code> 或 -<code>ge</code> 比较算术值，它们分别表示等于、不等于、小于、小于等于、大于、大于等于。 </p>
            <p>可以分别用操作符 <code>=</code>、 <code>!=</code>、<code>&lt;</code> 和 <code>&gt;</code> 比较字符串是否相等、不相等或者第一个字符串的排序在第二个字符串的前面或后面。单目操作符 <code>-z</code> 测试 null 字符串，如果字符串非空 <code>-n</code> 返回 True（或者根本没有操作符）。</p>
            <p><strong>说明：</strong>shell 也用 <code>&lt;</code> 和 <code>&gt;</code> 操作符进行重定向，所以必须用 <code>\&lt;</code> 或 <code>\&gt;</code> 加以转义。清单 2 显示了字符串测试的更多示例。检查它们是否如您预期的一样。</p>
            <br><a name=N10117><strong>清单 2. 一些字符串测试</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="75%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>[ian@pinguino ~]$ test "abc" = "def" ;echo $?
                        1
                        [ian@pinguino ~]$ [ "abc" != "def" ];echo $?
                        0
                        [ian@pinguino ~]$ [ "abc" \&lt; "def" ];echo $?
                        0
                        [ian@pinguino ~]$ [ "abc" \&gt; "def" ];echo $?
                        1
                        [ian@pinguino ~]$ [ "abc" \&lt;"abc" ];echo $?
                        1
                        [ian@pinguino ~]$ [ "abc" \&gt; "abc" ];echo $?
                        1
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>表 1 显示了一些更常见的文件测试。如果被测试的文件存在，而且有指定的特征，则结果为 True。</p>
            <table class=data-table-1 cellSpacing=0 cellPadding=0 width="50%" summary="" border=0>
                <caption><strong><font color=#ffffff>表 1. 一些常见的文件测试</font></strong> </caption>
                <tbody>
                    <tr vAlign=top>
                        <th vAlign=bottom>操作符</th>
                        <th vAlign=bottom>特征</th>
                    </tr>
                    <tr vAlign=top>
                        <td>-d</td>
                        <td>目录</td>
                    </tr>
                    <tr vAlign=top>
                        <td>-e</td>
                        <td>存在（也可以用 -a）</td>
                    </tr>
                    <tr vAlign=top>
                        <td>-f</td>
                        <td>普通文件</td>
                    </tr>
                    <tr vAlign=top>
                        <td>-h</td>
                        <td>符号连接（也可以用 -L）</td>
                    </tr>
                    <tr vAlign=top>
                        <td>-p</td>
                        <td>命名管道</td>
                    </tr>
                    <tr vAlign=top>
                        <td>-r</td>
                        <td>可读</td>
                    </tr>
                    <tr vAlign=top>
                        <td>-s</td>
                        <td>非空</td>
                    </tr>
                    <tr vAlign=top>
                        <td>-S</td>
                        <td>套接字</td>
                    </tr>
                    <tr vAlign=top>
                        <td>-w</td>
                        <td>可写</td>
                    </tr>
                    <tr vAlign=top>
                        <td>-N</td>
                        <td>从上次读取之后已经做过修改</td>
                    </tr>
                </tbody>
            </table>
            <p>除了上面的单目测试，还可以使用表 2 所示的双目操作符比较两个文件：</p>
            <table class=data-table-1 cellSpacing=0 cellPadding=0 width="50%" summary="" border=0>
                <caption><strong><font color=#ffffff>表 2. 测试一对文件</font></strong> </caption>
                <tbody>
                    <tr vAlign=top>
                        <th vAlign=bottom>操作符</th>
                        <th vAlign=bottom>为 True 的情况 </th>
                    </tr>
                    <tr vAlign=top>
                        <td>-nt</td>
                        <td>测试 file1 是否比 file2 更新。修改日期将用于这次和下次比较。</td>
                    </tr>
                    <tr vAlign=top>
                        <td>-ot</td>
                        <td>测试 file1 是否比 file2 旧。</td>
                    </tr>
                    <tr vAlign=top>
                        <td>-ef</td>
                        <td>测试 file1 是不是 file2 的硬链接。 </td>
                    </tr>
                </tbody>
            </table>
            <p>其他一些测试可以用来测试文件许可之类的内容。请参阅 bash 手册获得更多细节或使用 <code>help&nbsp;test</code> 查看内置测试的简要信息。也可以用 <code>help</code> 命令了解其他内置命令。</p>
            <p><code>-o</code> 操作符允许测试利用 <code>set&nbsp;-o&nbsp;<em>选项</em></code> 设置的各种 shell 选项，如果设置了该选项，则返回 True (0)，否则返回 False (1)，如清单 3 所示。</p>
            <br><a name=N101FB><strong>清单 3. 测试 shell 选项</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="75%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>[ian@pinguino ~]$ set +o nounset
                        [ian@pinguino ~]$ [ -o nounset ];echo $?
                        1
                        [ian@pinguino ~]$ set -u
                        [ian@pinguino ~]$ test  -o nounset; echo $?
                        0
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>最后，<code>-a</code> 和 <code>-o</code> 选项允许使用逻辑运算符 AND 和 OR 将表达式组合在一起。单目操作符 <code>!</code> 可以使测试的意义相反。可以用括号把表达式分组，覆盖默认的优先级。请记住 shell 通常要在子 shell 中运行括号中的表达式，所以需要用 \( 和 \) 转义括号，或者把这些操作符括在单引号或双引号内。清单 4 演示了摩根法则在表达式上的应用。</p>
            <br><a name=N10214><strong>清单 4. 组合和分组测试</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="75%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>[ian@pinguino ~]$ test "a" != "$HOME" -a 3 -ge 4 ; echo $?
                        1
                        [ian@pinguino ~]$ [ ! \( "a" = "$HOME" -o 3 -lt 4 \) ]; echo $?
                        1
                        [ian@pinguino ~]$ [ ! \( "a" = "$HOME" -o '(' 3 -lt 4 ')' ")" ]; echo $?
                        1
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N1021A><span class=atitle>(( 和 [[</span></a></p>
            <p><code>test</code> 命令非常强大，但是很难满足其转义需求以及字符串和算术比较之间的区别。幸运的是，bash 提供了其他两种测试方式，这两种方式对熟悉 C、C++ 或 Java&#174; 语法的人来说会更自然些。</p>
            <p><code>((&nbsp;))</code> <em>复合命令</em> 计算算术表达式，如果表达式求值为 0，则设置退出状态为 1；如果求值为非 0 值，则设置为 0。不需要对 <code>((</code> 和 <code>))</code> 之间的操作符转义。算术只对整数进行。除 0 会产生错误，但不会产生溢出。可以执行 C 语言中常见的算术、逻辑和位操作。 <code>let</code> 命令也能执行一个或多个算术表达式。它通常用来为算术变量分配值。</p>
            <br><a name=N10242><strong>清单 5. 分配和测试算术表达式</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="75%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>[ian@pinguino ~]$ let x=2 y=2**3 z=y*3;echo $? $x $y $z
                        0 2 8 24
                        [ian@pinguino ~]$ (( w=(y/x) + ( (~ ++x) &amp; 0x0f ) )); echo $? $x $y $w
                        0 3 8 16
                        [ian@pinguino ~]$ (( w=(y/x) + ( (~ ++x) &amp; 0x0f ) )); echo $? $x $y $w
                        0 4 8 13
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>同使用 <code>((&nbsp;))</code> 一样，利用复合命令 <code>[[&nbsp;]]</code> 可以对文件名和字符串使用更自然的语法。可以用括号和逻辑操作符把 <code>test</code> 命令支持的测试组合起来。 </p>
            <br><a name=N1025F><strong>清单 6. 使用 [[ 复合命令</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="75%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>[ian@pinguino ~]$ [[ ( -d "$HOME" ) &amp;&amp; ( -w "$HOME" ) ]] &amp;&amp;
                        &gt;  echo "home is a writable directory"
                        home is a writable directory
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>在使用 <code>=</code> 或 <code>!=</code> 操作符时，复合命令 <code>[[</code> 还能在字符串上进行模式匹配。匹配的方式就像清单 7 所示的通配符匹配。</p>
            <br><a name=N10278><strong>清单 7. 用 [[ 进行通配符测试</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="75%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>[ian@pinguino ~]$ [[ "abc def .d,x--" == a[abc]*\ ?d* ]]; echo $?
                        0
                        [ian@pinguino ~]$ [[ "abc def c" == a[abc]*\ ?d* ]]; echo $?
                        1
                        [ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* ]]; echo $?
                        1
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>甚至还可以在 <code>[[</code> 复合命令内执行算术测试，但是千万要小心。除非在 <code>((</code> 复合命令内，否则 <code>&lt;</code> 和 <code>&gt;</code> 操作符会把操作数当成字符串比较并在当前排序序列中测试它们的顺序。清单 8 用一些示例演示了这一点。</p>
            <br><a name=N10295><strong>清单 8. 用 [[ 包含算术测试</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="75%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>[ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* || (( 3 &gt; 2 )) ]]; echo $?
                        0
                        [ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* || 3 -gt 2 ]]; echo $?
                        0
                        [ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* || 3 &gt; 2 ]]; echo $?
                        0
                        [ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* || a &gt; 2 ]]; echo $?
                        0
                        [ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* || a -gt 2 ]]; echo $?
                        -bash: a: unbound variable
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N1029B><span class=atitle>条件测试</span></a></p>
            <p>虽然使用以上的测试和 <code>&amp;&amp;</code>、 <code>||</code> 控制操作符能实现许多编程，但 bash 还包含了更熟悉的 &#8220;if, then, else&#8221; 和 case 结构。学习完这些之后，将学习循环结构，这样您的工具箱将真正得到扩展。</p>
            <p><a name=N102AB><span class=smalltitle><strong><font face=Arial>If、then、else 语句</font></strong></span></a></p>
            <p>bash 的 <code>if</code> 命令是个复合命令，它测试一个测试或命令（<code>$?</code>）的返回值，并根据返回值为 True（0）或 False（不为 0）进行分支。虽然上面的测试只返回 0 或 1 值，但命令可能返回其他值。请参阅 <a href="http://www.ibm.com/developerworks/cn/linux/edu/l-dw-linux-lpic1109-i.html"><font color=#5c81a7>LPI exam 102 prep: Shells, scripting, programming, and compiling</font></a> 教程学习这方面的更多内容。</p>
            <p>Bash 中的 <code>if</code> 命令有一个 <code>then</code> 子句，子句中包含测试或命令返回 0 时要执行的命令列表，可以有一个或多个可选的 <code>elif</code> 子句，每个子句可执行附加的测试和一个 <code>then</code> 子句，子句中又带有相关的命令列表，最后是可选的 <code>else</code> 子句及命令列表，在前面的测试或 <code>elif</code> 子句中的所有测试都不为真的时候执行，最后使用 <code>fi</code> 标记表示该结构结束。 </p>
            <p>使用迄今为止学到的东西，现在能够构建简单的计算器来计算算术表达式，如清单 9 所示：</p>
            <br><a name=N102E5><strong>清单 9. 用 if、then、else 计算表达式</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="75%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>[ian@pinguino ~]$ function mycalc ()
                        &gt; {
                        &gt;   local x
                        &gt;   if [ $# -lt 1 ]; then
                        &gt;     echo "This function evaluates arithmetic for you if you give it some"
                        &gt;   elif (( $* )); then
                        &gt;     let x="$*"
                        &gt;     echo "$* = $x"
                        &gt;   else
                        &gt;     echo "$* = 0 or is not an arithmetic expression"
                        &gt;   fi
                        &gt; }
                        [ian@pinguino ~]$ mycalc 3 + 4
                        3 + 4 = 7
                        [ian@pinguino ~]$ mycalc 3 + 4**3
                        3 + 4**3 = 67
                        [ian@pinguino ~]$ mycalc 3 + (4**3 /2)
                        -bash: syntax error near unexpected token `('
                        [ian@pinguino ~]$ mycalc 3 + "(4**3 /2)"
                        3 + (4**3 /2) = 35
                        [ian@pinguino ~]$ mycalc xyz
                        xyz = 0 or is not an arithmetic expression
                        [ian@pinguino ~]$ mycalc xyz + 3 + "(4**3 /2)" + abc
                        xyz + 3 + (4**3 /2) + abc = 35
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>这个计算器利用 <code>local</code> 语句将 x 声明为局部变量，只能在 <code>mycalc</code> 函数的范围内使用。<code>let</code> 函数具有几个可用的选项，可以执行与它密切关联的 <code>declare</code> 函数。请参考 bash 手册或使用 <code>help&nbsp;let</code> 获得更多信息。</p>
            <p>如清单 9 所示，需要确保在表达式使用 shell 元字符 —— 例如(、)、*、&gt; 和 &lt; 时 —— 正确地对表达式转义。无论如何，现在有了一个非常方便的小计算器，可以像 shell 那样进行算术计算。</p>
            <p>在清单 9 中可能注意到 <code>else</code> 子句和最后的两个示例。可以看到，把 <code>xyz</code> 传递给 mycalc 并没有错误，但计算结果为 0。这个函数还不够灵巧，不能区分最后使用的示例中的字符值，所以不能警告用户。可以使用字符串模式匹配测试（例如 <br><code>[[ ! ("$*" == *[a-zA-Z]* ]]</code><br>，或使用适合自己范围的形式）消除包含字母表字符的表达式，但是这会妨碍在输入中使用 16 进制标记，因为使用 16 进制标记时可能要用 0x0f 表示 15。实际上，shell 允许的基数最高为 64（使用 <code><em>base</em>#<em>value</em></code> 标记），所以可以在输入中加入 _ 和 @ 合法地使用任何字母表字符。8 进制和 16 进制使用常用的标记方式，开头为 0 表示八进制，开头为 0x 或 0X 表示 16 进制。清单 10 显示了一些示例。</p>
            <br><a name=N10324><strong>清单 10. 用不同的基数进行计算</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="75%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>[ian@pinguino ~]$ mycalc 015
                        015 = 13
                        [ian@pinguino ~]$ mycalc 0xff
                        0xff = 255
                        [ian@pinguino ~]$ mycalc 29#37
                        29#37 = 94
                        [ian@pinguino ~]$ mycalc 64#1az
                        64#1az = 4771
                        [ian@pinguino ~]$ mycalc 64#1azA
                        64#1azA = 305380
                        [ian@pinguino ~]$ mycalc 64#1azA_@
                        64#1azA_@ = 1250840574
                        [ian@pinguino ~]$ mycalc 64#1az*64**3 + 64#A_@
                        64#1az*64**3 + 64#A_@ = 1250840574
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>对输入进行的额外处理超出了本技巧的范围，所以请小心使用这个计算器。</p>
            <p><code>elif</code> 语句非常方便。它允许简化缩进，从而有助于脚本编写。在清单 11 中可能会对 <code>type</code> 命令在 <code>mycalc</code> 函数中的输出感到惊讶。</p>
            <br><a name=N1033F><strong>清单 11. Type mycalc</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="75%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>[ian@pinguino ~]$ type mycalc
                        mycalc is a function
                        mycalc ()
                        {
                        local x;
                        if [ $# -lt 1 ]; then
                        echo "This function evaluates arithmetic for you if you give it some";
                        else
                        if (( $* )); then
                        let x="$*";
                        echo "$* = $x";
                        else
                        echo "$* = 0 or is not an arithmetic expression";
                        fi;
                        fi
                        }
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>当然，也可以只用 <code>$((&nbsp;<em>表达式</em>&nbsp;))</code> 和 <code>echo </code>命令进行 shell 算术运算，如清单 12 所示。这样就不必学习关于函数或测试的任何内容，但是请注意 shell 不会解释元字符，例如 *，因此元字符不能在 <code>((&nbsp;<em>表达式</em>&nbsp;))</code> 或 <code>[[&nbsp;<em>表达式</em>&nbsp;]]</code> 中那样正常发挥作用。 </p>
            <br><a name=N1036B><strong>清单 12. 在 shell 中用 echo 和 $(( )) 直接进行计算</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="75%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>[ian@pinguino ~]$  echo $((3 + (4**3 /2)))
                        35
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/morphis/aggbug/118505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/morphis/" target="_blank">morphis</a> 2007-05-19 10:14 <a href="http://www.blogjava.net/morphis/archive/2007/05/19/118505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用autotools制作Makefile 和configure文件</title><link>http://www.blogjava.net/morphis/archive/2007/02/13/99752.html</link><dc:creator>morphis</dc:creator><author>morphis</author><pubDate>Tue, 13 Feb 2007 14:55:00 GMT</pubDate><guid>http://www.blogjava.net/morphis/archive/2007/02/13/99752.html</guid><wfw:comment>http://www.blogjava.net/morphis/comments/99752.html</wfw:comment><comments>http://www.blogjava.net/morphis/archive/2007/02/13/99752.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/morphis/comments/commentRss/99752.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/morphis/services/trackbacks/99752.html</trackback:ping><description><![CDATA[
		<p>目的 从复杂的工作中简化出来。<br /><br />网上有一些制作Makfile的文章，只停留在Makefile而已。用autotools的工具相对来说要简单的多，其它一些介绍autotools文章又有很多漏洞，而且步骤烦琐。<br /><br />制作一个最简单的helloworld程序：<br /><br />现有目录test<br /><br />mkdir src 建立src目录存放 源代码<br />在src下。<br />编辑hello.c文件<br /><br /></p>
		<div style="FONT-SIZE: 13px">
				<div class="msgheader">
						<div class="right">
								<a class="smalltxt" onclick="copycode($('code0'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=782832&amp;extra=###">[Copy to clipboard]</a>
						</div>CODE:</div>
				<div class="msgborder" id="code0" style="FONT-FAMILY: Fixdays">#include &lt;stdio.h&gt;<br /><br />int main()<br />{<br />        printf("hello world\n");<br />        return 0;<br />}</div>
				<br />在src目录下建立Makefile.am文件 (src/Makefile.am)<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code1'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=782832&amp;extra=###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code1" style="FONT-FAMILY: Fixdays">AUTOMAKE_OPTIONS=foreign<br />bin_PROGRAMS = hello<br />hello_SOURCES = hello.c<br />hello_LDADD = -lpthread (只是测试，实际不需要连接该库)</div><br />保存退出<br /><br />退到test目录 <br /><br />编辑Makefile.am文件 (Makefile.am)<br /><br />SUBDIRS = src<br /><br />退出保存<br /><br />然后<br />执行 <br />autoscan<br />生成configure.scan文件<br /><br />按此编辑此文件<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code2'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=782832&amp;extra=###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code2" style="FONT-FAMILY: Fixdays">#                                               -*- Autoconf -*-<br /># Process this file with autoconf to produce a configure script.<br /><br />AC_PREREQ(2.59)<br />AC_INIT(hello,1.0, [miaoquan@nou.com.cn])<br />AM_INIT_AUTOMAKE<br />AC_CONFIG_SRCDIR([src/hello.c])<br />AC_CONFIG_HEADER([config.h])<br /><br /># Checks for programs.<br />AC_PROG_CC<br /><br /># Checks for libraries.<br /># FIXME: Replace `main' with a function in `-lpthread':<br />AC_CHECK_LIB([pthread], [main])<br /><br /># Checks for header files.<br /><br /># Checks for typedefs, structures, and compiler characteristics.<br /><br /># Checks for library functions.<br /><br />#AC_CONFIG_FILES([Makefile<br />#                 src/Makefile])<br />AC_OUTPUT(Makefile src/Makefile)</div><br />退出保存<br />将此文件更名 mv configure.scan configure.in<br />然后执行<br />touch NEWS README AUTHORS ChangeLog<br /><br />然后执行<br />autoreconf -fvi<br /><br />至此生成configure文件<br />执行configure文件<br /><br />生成Makefile文件<br /><br />make <br />make install<br />make uninstall<br />make dist <br />试验一下吧。<br /><strong>继续完善这个例子,论坛里有人问,如何生成静态库,并连接.<br /></strong><br />完善hello.c这个例子<br /><br /><br />当前目录<br />     |-  src 目录<br />            |-  hello.c 文件<br />     |-  include 目录<br />            |-  hello.h文件<br />     |-  lib 目录<br />            |-  test.c文件 此文件用来生成 libhello.a<br /><br />在当前目录 编写Makefile.am<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code3'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=782832&amp;extra=###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code3" style="FONT-FAMILY: Fixdays">SUBDIRS = lib src</div><br />在include目录下 编写hello.h<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code4'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=782832&amp;extra=###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code4" style="FONT-FAMILY: Fixdays">extern void print(char *);</div><br />在lib目录下编写test.c<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code5'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=782832&amp;extra=###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code5" style="FONT-FAMILY: Fixdays">#include &lt;stdio.h&gt;<br /><br />void print(char *msg)<br />{<br />        printf("%s\n",msg);<br />}</div><br />在lib目录下编写Makefile.am<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code6'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=782832&amp;extra=###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code6" style="FONT-FAMILY: Fixdays">noinst_LIBRARIES=libhello.a<br />libhello_a_SOURCES=test.c</div><br />这里noinst_LIBRARIES 的意思是生成的静态库 ,不会被make install 安装<br />然后指定libhello.a的源文件test.c<br /><br /><br />在src目录下编写hello.c<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code7'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=782832&amp;extra=###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code7" style="FONT-FAMILY: Fixdays">#include "hello.h"<br /><br />int main()<br />{<br />        print("haha");  //这里是静态库里的print函数<br />        return 0;<br />}</div><br />在src目录下编写Makefile.am<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code8'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=782832&amp;extra=###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code8" style="FONT-FAMILY: Fixdays">INCLUDES= -I../include<br /><br />bin_PROGRAMS=hello<br />hello_SOURCES=hello.c<br />hello_LDADD=../lib/libhello.a</div><br />首先指定头文件的位置 ../include<br />然后指定要生成执行文件 hello<br />然后指定源代码文件 hello.c<br />最后添加静态库的位置 ../lib/libhello.a<br /><br /><br />按照我首篇帖子的方式.<br />执行autoscan 生成configure.scan<br /><br />修改该文件<br /><br />按照首篇帖子修改.<br /><br />然后不同之处<br />需要添加一行:AC_PROG_RANLIB<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code9'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=782832&amp;extra=###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code9" style="FONT-FAMILY: Fixdays">#                                               -*- Autoconf -*-<br /># Process this file with autoconf to produce a configure script.<br /><br />AC_PREREQ(2.59)<br />AC_INIT(hello,1.1,[miaoquan@nou.com.cn])<br />AM_INIT_AUTOMAKE<br />AC_CONFIG_SRCDIR([src/hello.c])<br />AC_CONFIG_HEADER([config.h])<br /><br /># Checks for programs.<br />AC_PROG_CC<br /><br /><br /># Checks for libraries.<br />AC_PROG_RANLIB<br /># Checks for header files.<br /><br /># Checks for typedefs, structures, and compiler characteristics.<br /><br /># Checks for library functions.<br /><br />#AC_CONFIG_FILES([Makefile<br />#                lib/Makefile<br />  #               src/Makefile])<br />AC_OUTPUT([Makefile<br />                        lib/Makefile<br />                        src/Makefile])</div><br />mv configure.scan configure.in<br /><br /><br />touch NEWS README AUTHORS ChangeLog<br /><br /><br />执行autoreconf -fvi<br /><br />生成configure.执行configure生成Makefile..<br /><br /><br />后面同上...<br /></div>
<img src ="http://www.blogjava.net/morphis/aggbug/99752.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/morphis/" target="_blank">morphis</a> 2007-02-13 22:55 <a href="http://www.blogjava.net/morphis/archive/2007/02/13/99752.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用脚本命令集</title><link>http://www.blogjava.net/morphis/archive/2007/02/13/99751.html</link><dc:creator>morphis</dc:creator><author>morphis</author><pubDate>Tue, 13 Feb 2007 14:47:00 GMT</pubDate><guid>http://www.blogjava.net/morphis/archive/2007/02/13/99751.html</guid><wfw:comment>http://www.blogjava.net/morphis/comments/99751.html</wfw:comment><comments>http://www.blogjava.net/morphis/archive/2007/02/13/99751.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/morphis/comments/commentRss/99751.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/morphis/services/trackbacks/99751.html</trackback:ping><description><![CDATA[
		<p>
				<span class="bold">常用脚本命令集</span>
				<br />
				<br />
		</p>
		<div style="FONT-SIZE: 13px">如何用脚本实现分割文件<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code0'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=381726&amp;extra=&amp;page=1###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code0" style="FONT-FAMILY: Fixdays">#!/bin/bash<br /><br />if [ $# -ne 2 ]; then<br />        echo 'Usage: split file size(in bytes)'<br />        exit<br />fi<br /><br />file=$1<br />size=$2<br /><br />if [ ! -f $file ]; then<br />        echo "$file doesn't exist"<br />        exit<br />fi<br /><br />#TODO: test if $size is a valid integer<br /><br />filesize=`/bin/ls -l $file | awk '{print $5}'`<br />echo filesize: $filesize<br /><br />let pieces=$filesize/$size<br />let remain=$filesize-$pieces*$size<br />if [ $remain -gt 0 ]; then<br />        let pieces=$pieces+1<br />fi<br />echo pieces: $pieces<br /><br />i=0<br />while [ $i -lt $pieces ];<br />do<br />        echo split: $file.$i:<br />        dd if=$file of=$file.$i bs=$size count=1 skip=$i<br />        let i=$i+1<br />done<br /><br />echo "#!/bin/bash" &gt;; merge<br /><br />echo "i=0" &gt;;&gt;; merge<br />echo "while [ $i -lt $pieces ];" &gt;;&gt;; merge<br />echo "do" &gt;;&gt;; merge<br />echo " echo merge: $file.$i" &gt;;&gt;; merge<br />echo " if [ ! -f $file.$i ]; then" &gt;;&gt;; merge<br />echo " echo merge: $file.$i missed" &gt;;&gt;; merge<br />echo " rm -f $file.merged" &gt;;&gt;; merge<br />echo " exit" &gt;;&gt;; merge<br />echo " fi" &gt;;&gt;; merge<br />echo " dd if=$file.$i of=$file.merged bs=$size count=1 seek=$i" &gt;;&gt;; merge<br />echo " let i=$i+1" &gt;;&gt;; merge<br />echo "done" &gt;;&gt;; merge<br />chmod u+x merge' </div><br />如何查找日期为某一天的文件<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code1'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=381726&amp;extra=&amp;page=1###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code1" style="FONT-FAMILY: Fixdays">#!/bin/sh <br /># The right of usage, distribution and modification is here by granted by the author. <br /># The author deny any responsibilities and liabilities related to the code. <br /># <br />OK=0 <br />A=`find $1 -print` <br />if expr $3 == 1 &gt;;/dev/null ; then M=Jan ; OK=1 ; fi <br />if expr $3 == 2 &gt;;/dev/null ; then M=Feb ; OK=1 ; fi <br />if expr $3 == 3 &gt;;/dev/null ; then M=Mar ; OK=1 ; fi <br />if expr $3 == 4 &gt;;/dev/null ; then M=Apr ; OK=1 ; fi <br />if expr $3 == 5 &gt;;/dev/null ; then M=May ; OK=1 ; fi <br />if expr $3 == 6 &gt;;/dev/null ; then M=Jun ; OK=1 ; fi <br />if expr $3 == 7 &gt;;/dev/null ; then M=Jul ; OK=1 ; fi <br />if expr $3 == 8 &gt;;/dev/null ; then M=Aug ; OK=1 ; fi <br />if expr $3 == 9 &gt;;/dev/null ; then M=Sep ; OK=1 ; fi <br />if expr $3 == 10 &gt;;/dev/null ; then M=Oct ; OK=1 ; fi <br />if expr $3 == 11 &gt;;/dev/null ; then M=Nov ; OK=1 ; fi <br />if expr $3 == 12 &gt;;/dev/null ; then M=Dec ; OK=1 ; fi <br />if expr $3 == 1 &gt;;/dev/null ; then M=Jan ; OK=1 ; fi <br />if expr $OK == 1 &gt;; /dev/null ; then <br />ls -l --full-time $A 2&gt;;/dev/null | grep "$M $4" | grep $2 ; <br />else <br />  echo Usage: $0 path Year Month Day; <br />  echo Example: $0 ~ 1998 6 30; <br />fi </div><br />如何计算当前目录下的文件数和目录数<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code2'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=381726&amp;extra=&amp;page=1###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code2" style="FONT-FAMILY: Fixdays"># ls -l * |grep "^-"|wc -l ---- to count files <br /># ls -l * |grep "^d"|wc -l ----- to count dir </div><br />如何只列子目录？<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code3'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=381726&amp;extra=&amp;page=1###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code3" style="FONT-FAMILY: Fixdays">ls -F | grep /$ 或者 alias sub = "ls -F | grep /$"(linux)<br /><br />ls -l | grep "^d" 或者 ls -lL | grep "^d" (Solaris)</div><br />如何实现取出文件中特定的行内容<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code4'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=381726&amp;extra=&amp;page=1###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code4" style="FONT-FAMILY: Fixdays">如果你只想看文件的前5行，可以使用head命令，<br />如： head -5 /etc/passwd <br /><br />如果你想查看文件的后10行，可以使用tail命令，<br />如： tail -10 /etc/passwd <br /><br />你知道怎么查看文件中间一段吗？你可以使用sed命令 <br />如: sed -n '5,10p' /etc/passwd 这样你就可以只查看文件的第5行到第10行。</div><br />如何查找含特定字符串的文件<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code5'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=381726&amp;extra=&amp;page=1###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code5" style="FONT-FAMILY: Fixdays">例如查找当前目录下含有"the string you want find..."字符串的文件：<br />　　$find . -type f -exec grep “the string you want find...” {} ; -print </div><br />如何列出目录树<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code6'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=381726&amp;extra=&amp;page=1###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code6" style="FONT-FAMILY: Fixdays">下面的短小的shell程序可以列出目录树, 充分利用了sed强大的模式匹配能力. <br />　　目录树形式如下: <br />　　. <br />　　`----shellp <br />　　`----updates <br />　　`----wu-ftpd-2.4 <br />　　| `----doc <br />　　| | `----examples <br />　　| `----src <br />　　| | `----config <br />　　| | `----makefiles <br />　　| `----support <br />　　| | `----makefiles <br />　　| | `----man <br />　　| `----util <br />　　脚本如下：<br />　　#!/bin/sh <br />　　# dtree: Usage: dtree [any directory] <br />　　dir=${1:-.} <br />　　(cd $dir; pwd) <br />　　find $dir -type d -print | sort -f | sed -e "s,^$1,," -e "/^$/d" -e "s,[^/]*/([^/]*)$,`----1," -e "s,[^/]*/,| ,g" </div><br />如何实现取出文件中特定的列内容<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code7'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=381726&amp;extra=&amp;page=1###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code7" style="FONT-FAMILY: Fixdays">我们经常会遇到需要取出分字段的文件的某些特定字段，例如/etc/password就是通过“:”分隔各个字段的。可以通过cut命令来实现。例如，我们希望将系统账号名保存到特定的文件，就可以：<br />　　cut -d: -f 1 /etc/passwd &gt;; /tmp/users<br />　　-d用来定义分隔符，默认为tab键，-f表示需要取得哪个字段。<br />　　当然也可以通过cut取得文件中每行中特定的几个字符，例如：<br />　　cut -c3-5 /etc/passwd<br />　　就是输出/etc/passwd文件中每行的第三到第五个字符。<br />　　-c 和 －f 参数可以跟以下子参数：<br />　　N 第N个字符或字段<br />　　N- 从第一个字符或字段到文件结束<br />　　N-M 从第N个到第M个字符或字段<br />　　-M 从第一个到第N个字符或字段 </div><br />在vim中实现批量加密<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code8'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=381726&amp;extra=&amp;page=1###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code8" style="FONT-FAMILY: Fixdays">密码中还是不能带空格，不管了，能加密就好，先这么用着。<br /><br />============================================================<br />#!/bin/bash<br /># Encrypt file with vim<br /><br />if (test $# -lt 2) then<br />    echo Usage: decrypt password filename<br />else<br />    vim -e -s -c ":set key=$1" -c ':wq' $2<br />    echo "$2 encrypted."<br />fi<br />============================================================<br />[weeder@SMTH weeder]$ for file in *.txt ; do encrypt test $file ; done<br />test2.txt encrypted.<br />test4.txt encrypted.<br />test9.txt encrypted.<br />kick.txt encrypted.<br />    echo "$2 encrypted."<br />fi<br />[weeder@SMTH weeder]$ for file in *.txt ; do encrypt test $file ; done<br />test2.txt encrypted.<br />test4.txt encrypted.<br />test9.txt encrypted.<br />kick.txt encrypted.<br />too_old.txt encrypted.<br />too_old_again.txt encrypted.<br />bg5.txt encrypted.<br />[weeder@SMTH weeder]$ </div><br />$@等特定shell变量的含义<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code9'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=381726&amp;extra=&amp;page=1###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code9" style="FONT-FAMILY: Fixdays">在shell脚本的实际编写中，有一些特殊的变量十分有用：<br />$# 传递到脚本的参数个数<br /><br />$* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同，此选项参数可超过9个<br /><br />$$ 脚本运行的当前进程ID号<br /><br />$! 后台运行的最后一个进程的进程ID号<br /><br />$@ 与$#相同，但是使用时加引号，并在引号中返回每个参数<br /><br />$- 显示shell使用的当前选项，与set命令功能相同<br /><br />$? 显示最后命令的退出状态。0表示没有错误，其他任何值表明有错误。</div><br />如何使程序的执行结果同时定向到屏幕和文件<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code10'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=381726&amp;extra=&amp;page=1###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code10" style="FONT-FAMILY: Fixdays">program_name |tee logfile<br />这样程序执行期间的显示都记录到logfile同时显示到标准输出（屏幕）。 </div><br />如何用sendmail给系统所有用户送信<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code11'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=381726&amp;extra=&amp;page=1###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code11" style="FONT-FAMILY: Fixdays">首先在aliases文件里面建立一个alias：<br />alluser: :include:/etc/mail/allusers<br />并执行newaliases使之生效，然后在/etc/mail/allusers里面列出所有用户，可以使用下面的命令：<br />awk -F: '$3 &gt;; 100 { print $1 }' /etc/passwd &gt;; /etc/mail/allusers</div><br />如何查找某条命令的相关库文件<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code12'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=381726&amp;extra=&amp;page=1###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code12" style="FONT-FAMILY: Fixdays">在制作自己的发行版时经常需要判断某条命令需要哪些库文件的支持，以确保指定的命令在独立的系统内可以可靠的运行。<br />在Linux环境下通过ldd命令即可实现，在控制台执行：<br />ldd /bin/ls<br />即可得到/bin/ls命令的相关库文件列表。 </div><br />如何使用host命令获得更多信息<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code13'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=381726&amp;extra=&amp;page=1###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code13" style="FONT-FAMILY: Fixdays">Host能够用来查询域名，然而它可以得到更多的信息。host -t mx linux.com可以查询出Linux.com的MX记录，以及处理Mail的Host的名字。Host -l linux.com会返回所有注册在linux.com下的域名。host -a linux.com则会显示这个主机的所有域名信息。 </div><br />如何停止终端多个进程<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code14'));" href="http://linux.chinaunix.net/bbs/viewthread.php?tid=381726&amp;extra=&amp;page=1###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code14" style="FONT-FAMILY: Fixdays">以下是脚本：<br />　　echo "系统当前用户"<br />　　echo "---------------"<br />　　who | awk '{print $2}'<br />　　echo "---------------"<br />　　echo "输入要杀死终端的终端号:"<br />　　read $TTY<br />　　kill -9 ${K}=`ps -t $TTY | grep [0-9] | awk '{print $1}'` </div><br /></div>
<img src ="http://www.blogjava.net/morphis/aggbug/99751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/morphis/" target="_blank">morphis</a> 2007-02-13 22:47 <a href="http://www.blogjava.net/morphis/archive/2007/02/13/99751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>