??xml version="1.0" encoding="utf-8" standalone="yes"?>久久综合九色综合网站,电影一区二区三区久久免费观看,视频在线精品一区http://www.aygfsteel.com/morphis/category/18904.htmlBe fresh and eager every morning, and tired and satisfied every night.zh-cnMon, 21 May 2007 19:32:41 GMTMon, 21 May 2007 19:32:41 GMT60Linux 技? Bash 试和比较函?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/morphis/archive/2007/05/19/118505.html</guid><wfw:comment>http://www.aygfsteel.com/morphis/comments/118505.html</wfw:comment><comments>http://www.aygfsteel.com/morphis/archive/2007/05/19/118505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/morphis/comments/commentRss/118505.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/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>U别Q?中</p> <p><a ><font color=#5c81a7>Ian Shields</font></a> (<a href="mailto:ishields@us.ibm.com?subject=Bash 测试和比较函数"><font color=#5c81a7>ishields@us.ibm.com</font></a>), 高E序? IBM <br></p> <p>2007 q?3 ?16 ?/p> <blockquote>(zhn)是否ؓ(f) Bash shell 中大量的试和比较选项而困惑呢Q这个技巧可以帮助?zhn)解密不同cd的文件、算术和字符串测试,q样(zhn)就能够知道什么时候?<code>test</code>?<code>[ ]</code>?<code>[[ ]]</code>?<code>(( ))</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® ?UNIX® pȝ上都可用,?Linux 上常见的默认 shell。Bash 包含强大的编E功能,其中包括丰富的可试文gcd和属性的函数Q以及在多数~程语言中可以用的术和字W串比较函数。理解不同的试q认识到 shell q能把一些操作符解释?shell 元字W,是成为高U?shell 用户的重要一步。这文章摘?developerWorks 教程 <a ><font color=#5c81a7>LPI exam 102 prep: Shells, scripting, programming, and compiling</font></a>Q介l了如何理解和?Bash shell 的测试和比较操作?/p> <p>q个技巧解释了 shell 试和比较函敎ͼ演示了如何向 shell d~程功能。?zhn)可能已经看到q?&& ?|| 操作W的?shell 逻辑Q它允许(zhn)根据前一条命令的退出状态(正确退出或伴随错误退出)而执行后一条命令。在q个技巧中Q将看到如何把这些基本的技术扩展成更复杂的 shell ~程?/p> <p><a name=N10081><span id="wmqeeuq" class=atitle>试</span></a></p> <p>在Q何一U编E语a中,学习(fn)了如何给变量分配值和传递参C后,都需要测试这些值和参数。在 shell 中,试?x)设|返回的状态,q与其他命o(h)执行的功能相同。实际上Q?code>test</code> 是个内置<em>命o(h)</em>Q?/p> <p><a name=N10090><span id="wmqeeuq" class=smalltitle><strong><font face=Arial>test ?[</font></strong></span></a></p> <p>内置命o(h) <code>test</code> Ҏ(gu)表达?em>expr</em> 求值的l果q回 0Q真Q或 1Q假Q。也可以使用Ҏ(gu)P(x)<code>test <em>expr</em></code> ?[ <em>expr</em> ] 是等L(fng)?可以?<code>$?</code> 查返回|可以使用 && ?|| 操作q回|也可以用本技巧后面介l的各种条gl构试q回倹{?/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 && 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 的第一个示例中Q?code>-gt</code> 操作W对两个字符g间执行算术比较。在W二个示例中Q用 <code>[ ]</code> 的Ş式比较两个字W串不相{。在最后一个示例中Q测?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><</code> ?<code>></code> 比较字符串是否相{、不相等或者第一个字W串的排序在W二个字W串的前面或后面。单目操作符 <code>-z</code> 试 null 字符Ԍ如果字符串非I?<code>-n</code> q回 TrueQ或者根本没有操作符Q?/p> <p><strong>说明Q?/strong>shell 也用 <code><</code> ?<code>></code> 操作W进行重定向Q所以必ȝ <code>\<</code> ?<code>\></code> 加以转义。清?2 昄了字W串试的更多示例。检查它们是否如(zhn)预期的一栗?/p> <br><a name=N10117><strong>清单 2. 一些字W串试</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" \< "def" ];echo $? 0 [ian@pinguino ~]$ [ "abc" \> "def" ];echo $? 1 [ian@pinguino ~]$ [ "abc" \<"abc" ];echo $? 1 [ian@pinguino ~]$ [ "abc" \> "abc" ];echo $? 1 </pre> </td> </tr> </tbody> </table> <br> <p>?1 昄了一些更常见的文件测试。如果被试的文件存在,而且有指定的特征Q则l果?True?/p> <table class=data-table-1 cellSpacing=0 cellPadding=0 width="50%" summary="" border=0> <caption><strong><font color=#ffffff>?1. 一些常见的文g试</font></strong> </caption> <tbody> <tr vAlign=top> <th vAlign=bottom>操作W?/th> <th vAlign=bottom>特征</th> </tr> <tr vAlign=top> <td>-d</td> <td>目录</td> </tr> <tr vAlign=top> <td>-e</td> <td>存在Q也可以?-aQ?/td> </tr> <tr vAlign=top> <td>-f</td> <td>普通文?/td> </tr> <tr vAlign=top> <td>-h</td> <td>W号q接Q也可以?-LQ?/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>从上ơ读取之后已l做q修?/td> </tr> </tbody> </table> <p>除了上面的单目测试,q可以用表 2 所C的双目操作W比较两个文Ӟ(x)</p> <table class=data-table-1 cellSpacing=0 cellPadding=0 width="50%" summary="" border=0> <caption><strong><font color=#ffffff>?2. 试一Ҏ(gu)?/font></strong> </caption> <tbody> <tr vAlign=top> <th vAlign=bottom>操作W?/th> <th vAlign=bottom>?True 的情?</th> </tr> <tr vAlign=top> <td>-nt</td> <td>试 file1 是否?file2 更新。修Ҏ(gu)期将用于q次和下ơ比较?/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>其他一些测试可以用来测试文件许可之cȝ内容。请参阅 bash 手册获得更多l节或?<code>help test</code> 查看内置试的简要信息。也可以?<code>help</code> 命o(h)了解其他内置命o(h)?/p> <p><code>-o</code> 操作W允许测试利?<code>set -o <em>选项</em></code> 讄的各U?shell 选项Q如果设|了该选项Q则q回 True (0)Q否则返?False (1)Q如清单 3 所C?/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> 选项允许使用逻辑q算W?AND ?OR 表辑ּl合在一赗单目操作符 <code>!</code> 可以使测试的意义相反。可以用括号把表辑ּ分组Q覆盖默认的优先U。请C shell 通常要在?shell 中运行括号中的表辑ּQ所以需要用 \( ?\) 转义括号Q或者把q些操作W括在单引号或双引号内。清?4 演示了摩Ҏ(gu)则在表达式上的应用?/p> <br><a name=N10214><strong>清单 4. l合和分l测?/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 id="wmqeeuq" class=atitle>(( ?[[</span></a></p> <p><code>test</code> 命o(h)非常强大Q但是很难满_转义需求以及字W串和算术比较之间的区别。幸q的是,bash 提供了其他两U测试方式,q两U方式对熟?zhn)?C、C++ ?Java® 语法的h来说?x)更自然些?/p> <p><code>(( ))</code> <em>复合命o(h)</em> 计算术表达式,如果表达式求gؓ(f) 0Q则讄退出状态ؓ(f) 1Q如果求gؓ(f)?0 |则设|ؓ(f) 0。不需要对 <code>((</code> ?<code>))</code> 之间的操作符转义。算术只Ҏ(gu)数进行。除 0 ?x)生错误,但不会(x)生溢出。可以执?C 语言中常见的术、逻辑和位操作?<code>let</code> 命o(h)也能执行一个或多个术表达式。它通常用来为算术变量分配倹{?/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) & 0x0f ) )); echo $? $x $y $w 0 3 8 16 [ian@pinguino ~]$ (( w=(y/x) + ( (~ ++x) & 0x0f ) )); echo $? $x $y $w 0 4 8 13 </pre> </td> </tr> </tbody> </table> <br> <p>同?<code>(( ))</code> 一P利用复合命o(h) <code>[[ ]]</code> 可以Ҏ(gu)件名和字W串使用更自然的语法。可以用括号和逻辑操作W把 <code>test</code> 命o(h)支持的测试组合v来?</p> <br><a name=N1025F><strong>清单 6. 使用 [[ 复合命o(h)</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" ) && ( -w "$HOME" ) ]] && > echo "home is a writable directory" home is a writable directory </pre> </td> </tr> </tbody> </table> <br> <p>在?<code>=</code> ?<code>!=</code> 操作W时Q复合命?<code>[[</code> q能在字W串上进行模式匹配。匹配的方式像清单 7 所C的通配W匹配?/p> <br><a name=N10278><strong>清单 7. ?[[ q行通配W测?/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>甚至q可以在 <code>[[</code> 复合命o(h)内执行算术测试,但是千万要小心。除非在 <code>((</code> 复合命o(h)内,否则 <code><</code> ?<code>></code> 操作W会(x)把操作数当成字符串比较ƈ在当前排序序列中试它们的顺序。清?8 用一些示例演CZq一炏V?/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 > 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 > 2 ]]; echo $? 0 [ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* || a > 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 id="wmqeeuq" class=atitle>条g试</span></a></p> <p>虽然使用以上的测试和 <code>&&</code>?<code>||</code> 控制操作W能实现许多~程Q但 bash q包含了更熟(zhn)的 “if, then, else” ?case l构。学?fn)完q些之后Q将学习(fn)循环l构Q这h的工L(fng)真正得到扩展?/p> <p><a name=N102AB><span id="wmqeeuq" class=smalltitle><strong><font face=Arial>If、then、else 语句</font></strong></span></a></p> <p>bash ?<code>if</code> 命o(h)是个复合命o(h)Q它试一个测试或命o(h)Q?code>$?</code>Q的q回|q根据返回gؓ(f) TrueQ?Q或 FalseQ不?0Q进行分支。虽然上面的试只返?0 ?1 |但命令可能返回其他倹{请参阅 <a ><font color=#5c81a7>LPI exam 102 prep: Shells, scripting, programming, and compiling</font></a> 教程学习(fn)q方面的更多内容?/p> <p>Bash 中的 <code>if</code> 命o(h)有一?<code>then</code> 子句Q子句中包含试或命令返?0 时要执行的命令列表,可以有一个或多个可选的 <code>elif</code> 子句Q每个子句可执行附加的测试和一?<code>then</code> 子句Q子句中又带有相关的命o(h)列表Q最后是可选的 <code>else</code> 子句及命令列表,在前面的试?<code>elif</code> 子句中的所有测试都不ؓ(f)真的时候执行,最后?<code>fi</code> 标记表示该结构结束?</p> <p>使用q今为止学到的东西,现在能够构徏单的计算器来计算术表达式,如清?9 所C:(x)</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 () > { > local x > if [ $# -lt 1 ]; then > echo "This function evaluates arithmetic for you if you give it some" > elif (( $* )); then > let x="$*" > echo "$* = $x" > else > echo "$* = 0 or is not an arithmetic expression" > fi > } [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>q个计算器利?<code>local</code> 语句?x 声明为局部变量,只能?<code>mycalc</code> 函数的范围内使用?code>let</code> 函数h几个可用的选项Q可以执行与它密切关联的 <code>declare</code> 函数。请参?bash 手册或?<code>help let</code> 获得更多信息?/p> <p>如清?9 所C,需要确保在表达式?shell 元字W?—?例如(???gt; ?< ?—?正确地对表达式{义。无论如何,现在有了一个非常方便的计器Q可以像 shell 那样q行术计算?/p> <p>在清?9 中可能注意到 <code>else</code> 子句和最后的两个CZ。可以看刎ͼ?<code>xyz</code> 传递给 mycalc q没有错误,但计结果ؓ(f) 0。这个函数还不够灵yQ不能区分最后用的CZ中的字符|所以不能警告用戗可以用字W串模式匚w试Q例?<br><code>[[ ! ("$*" == *[a-zA-Z]* ]]</code><br>Q或使用适合自己范围的Ş式)消除包含字母表字W的表达式,但是q会(x)妨碍在输入中使用 16 q制标记Q因Z?16 q制标记时可能要?0x0f 表示 15。实际上Qshell 允许的基数最高ؓ(f) 64Q?<code><em>base</em>#<em>value</em></code> 标记Q,所以可以在输入中加?_ ?@ 合法C用Q何字母表字符? q制?16 q制使用常用的标记方式,开头ؓ(f) 0 表示八进Ӟ开头ؓ(f) 0x ?0X 表示 16 q制。清?10 昄了一些示例?/p> <br><a name=N10324><strong>清单 10. 用不同的基数q行计算</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>对输入进行的额外处理出了本技巧的范围Q所以请心使用q个计算器?/p> <p><code>elif</code> 语句非常方便。它允许化羃q,从而有助于脚本~写。在清单 11 中可能会(x)?<code>type</code> 命o(h)?<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>当然Q也可以只用 <code>$(( <em>表达?/em> ))</code> ?<code>echo </code>命o(h)q行 shell 术q算Q如清单 12 所C。这样就不必学习(fn)关于函数或测试的M内容Q但是请注意 shell 不会(x)解释元字W,例如 *Q因此元字符不能?<code>(( <em>表达?/em> ))</code> ?<code>[[ <em>表达?/em> ]]</code> 中那h常发挥作用?</p> <br><a name=N1036B><strong>清单 12. ?shell 中用 echo ?$(( )) 直接q行计算</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.aygfsteel.com/morphis/aggbug/118505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/morphis/" target="_blank">morphis</a> 2007-05-19 10:14 <a href="http://www.aygfsteel.com/morphis/archive/2007/05/19/118505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用autotools制作Makefile 和configure文ghttp://www.aygfsteel.com/morphis/archive/2007/02/13/99752.htmlmorphismorphisTue, 13 Feb 2007 14:55:00 GMThttp://www.aygfsteel.com/morphis/archive/2007/02/13/99752.htmlhttp://www.aygfsteel.com/morphis/comments/99752.htmlhttp://www.aygfsteel.com/morphis/archive/2007/02/13/99752.html#Feedback0http://www.aygfsteel.com/morphis/comments/commentRss/99752.htmlhttp://www.aygfsteel.com/morphis/services/trackbacks/99752.html目的 从复杂的工作中简化出来?br />
|上有一些制作Makfile的文章,只停留在Makefile而已。用autotools的工L(fng)Ҏ(gu)说要单的多,其它一些介lautotools文章又有很多漏洞Q而且步骤烦琐?br />
制作一个最单的helloworldE序Q?br />
现有目录test

mkdir src 建立src目录存放 源代?br />在src下?br />~辑hello.c文g

#include <stdio.h>

int main()
{
        printf("hello world\n");
        return 0;
}

在src目录下徏立Makefile.am文g (src/Makefile.am)

AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS = hello
hello_SOURCES = hello.c
hello_LDADD = -lpthread (只是试Q实际不需要连接该?

保存退?br />
退到test目录

~辑Makefile.am文g (Makefile.am)

SUBDIRS = src

退Z?br />
然后
执行
autoscan
生成configure.scan文g

按此~辑此文?br />
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.59)
AC_INIT(hello,1.0, [miaoquan@nou.com.cn])
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([src/hello.c])
AC_CONFIG_HEADER([config.h])

# Checks for programs.
AC_PROG_CC

# Checks for libraries.
# FIXME: Replace `main' with a function in `-lpthread':
AC_CHECK_LIB([pthread], [main])

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

#AC_CONFIG_FILES([Makefile
#                 src/Makefile])
AC_OUTPUT(Makefile src/Makefile)

退Z?br />此文g更名 mv configure.scan configure.in
然后执行
touch NEWS README AUTHORS ChangeLog

然后执行
autoreconf -fvi

x生成configure文g
执行configure文g

生成Makefile文g

make
make install
make uninstall
make dist
试验一下吧?br />l箋完善q个例子,论坛里有人问,如何生成静态库,q连?

完善hello.cq个例子


当前目录
     |-  src 目录
            |-  hello.c 文g
     |-  include 目录
            |-  hello.h文g
     |-  lib 目录
            |-  test.c文g 此文件用来生?libhello.a

在当前目?~写Makefile.am

SUBDIRS = lib src

在include目录?~写hello.h

extern void print(char *);

在lib目录下编写test.c

#include <stdio.h>

void print(char *msg)
{
        printf("%s\n",msg);
}

在lib目录下编写Makefile.am

noinst_LIBRARIES=libhello.a
libhello_a_SOURCES=test.c

q里noinst_LIBRARIES 的意思是生成的静态库 ,不会(x)被make install 安装
然后指定libhello.a的源文gtest.c


在src目录下编写hello.c

#include "hello.h"

int main()
{
        print("haha");  //q里是静态库里的print函数
        return 0;
}

在src目录下编写Makefile.am

INCLUDES= -I../include

bin_PROGRAMS=hello
hello_SOURCES=hello.c
hello_LDADD=../lib/libhello.a

首先指定头文件的位置 ../include
然后指定要生成执行文?hello
然后指定源代码文?hello.c
最后添加静态库的位|?../lib/libhello.a


按照我首帖子的方式.
执行autoscan 生成configure.scan

修改该文?br />
按照首篇帖子修改.

然后不同之处
需要添加一?AC_PROG_RANLIB

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.59)
AC_INIT(hello,1.1,[miaoquan@nou.com.cn])
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([src/hello.c])
AC_CONFIG_HEADER([config.h])

# Checks for programs.
AC_PROG_CC


# Checks for libraries.
AC_PROG_RANLIB
# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

#AC_CONFIG_FILES([Makefile
#                lib/Makefile
  #               src/Makefile])
AC_OUTPUT([Makefile
                        lib/Makefile
                        src/Makefile])

mv configure.scan configure.in


touch NEWS README AUTHORS ChangeLog


执行autoreconf -fvi

生成configure.执行configure生成Makefile..


后面同上...


morphis 2007-02-13 22:55 发表评论
]]>
常用脚本命o(h)?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/morphis/archive/2007/02/13/99751.html</guid><wfw:comment>http://www.aygfsteel.com/morphis/comments/99751.html</wfw:comment><comments>http://www.aygfsteel.com/morphis/archive/2007/02/13/99751.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/morphis/comments/commentRss/99751.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/morphis/services/trackbacks/99751.html</trackback:ping><description><![CDATA[ <p> <span id="wmqeeuq" class="bold">常用脚本命o(h)?/span> <br /> <br /> </p> <div style="FONT-SIZE: 13px">如何用脚本实现分割文?br /><br /><div id="wmqeeuq" class="msgheader"><div id="wmqeeuq" class="right"><a class="smalltxt" onclick="copycode($('code0'));" >[Copy to clipboard]</a></div>CODE:</div><div id="wmqeeuq" 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" >; merge<br /><br />echo "i=0" >;>; merge<br />echo "while [ $i -lt $pieces ];" >;>; merge<br />echo "do" >;>; merge<br />echo " echo merge: $file.$i" >;>; merge<br />echo " if [ ! -f $file.$i ]; then" >;>; merge<br />echo " echo merge: $file.$i missed" >;>; merge<br />echo " rm -f $file.merged" >;>; merge<br />echo " exit" >;>; merge<br />echo " fi" >;>; merge<br />echo " dd if=$file.$i of=$file.merged bs=$size count=1 seek=$i" >;>; merge<br />echo " let i=$i+1" >;>; merge<br />echo "done" >;>; merge<br />chmod u+x merge' </div><br />如何查找日期为某一天的文g<br /><br /><div id="wmqeeuq" class="msgheader"><div id="wmqeeuq" class="right"><a class="smalltxt" onclick="copycode($('code1'));" >[Copy to clipboard]</a></div>CODE:</div><div id="wmqeeuq" 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 >;/dev/null ; then M=Jan ; OK=1 ; fi <br />if expr $3 == 2 >;/dev/null ; then M=Feb ; OK=1 ; fi <br />if expr $3 == 3 >;/dev/null ; then M=Mar ; OK=1 ; fi <br />if expr $3 == 4 >;/dev/null ; then M=Apr ; OK=1 ; fi <br />if expr $3 == 5 >;/dev/null ; then M=May ; OK=1 ; fi <br />if expr $3 == 6 >;/dev/null ; then M=Jun ; OK=1 ; fi <br />if expr $3 == 7 >;/dev/null ; then M=Jul ; OK=1 ; fi <br />if expr $3 == 8 >;/dev/null ; then M=Aug ; OK=1 ; fi <br />if expr $3 == 9 >;/dev/null ; then M=Sep ; OK=1 ; fi <br />if expr $3 == 10 >;/dev/null ; then M=Oct ; OK=1 ; fi <br />if expr $3 == 11 >;/dev/null ; then M=Nov ; OK=1 ; fi <br />if expr $3 == 12 >;/dev/null ; then M=Dec ; OK=1 ; fi <br />if expr $3 == 1 >;/dev/null ; then M=Jan ; OK=1 ; fi <br />if expr $OK == 1 >; /dev/null ; then <br />ls -l --full-time $A 2>;/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 />如何计算当前目录下的文g数和目录?br /><br /><div id="wmqeeuq" class="msgheader"><div id="wmqeeuq" class="right"><a class="smalltxt" onclick="copycode($('code2'));" >[Copy to clipboard]</a></div>CODE:</div><div id="wmqeeuq" 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 id="wmqeeuq" class="msgheader"><div id="wmqeeuq" class="right"><a class="smalltxt" onclick="copycode($('code3'));" >[Copy to clipboard]</a></div>CODE:</div><div id="wmqeeuq" 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 />如何实现取出文g中特定的行内?br /><br /><div id="wmqeeuq" class="msgheader"><div id="wmqeeuq" class="right"><a class="smalltxt" onclick="copycode($('code4'));" >[Copy to clipboard]</a></div>CODE:</div><div id="wmqeeuq" class="msgborder" id="code4" style="FONT-FAMILY: Fixdays">如果你只想看文g的前5行,可以使用head命o(h)Q?br />如:(x) head -5 /etc/passwd <br /><br />如果你想查看文g的后10行,可以使用tail命o(h)Q?br />如:(x) tail -10 /etc/passwd <br /><br />你知道怎么查看文g中间一D吗Q你可以使用sed命o(h) <br />? sed -n '5,10p' /etc/passwd q样你就可以只查看文件的W?行到W?0行?/div><br />如何查找含特定字W串的文?br /><br /><div id="wmqeeuq" class="msgheader"><div id="wmqeeuq" class="right"><a class="smalltxt" onclick="copycode($('code5'));" >[Copy to clipboard]</a></div>CODE:</div><div id="wmqeeuq" class="msgborder" id="code5" style="FONT-FAMILY: Fixdays">例如查找当前目录下含?the string you want find..."字符串的文gQ?br />  $find . -type f -exec grep “the string you want find...?{} ; -print </div><br />如何列出目录?br /><br /><div id="wmqeeuq" class="msgheader"><div id="wmqeeuq" class="right"><a class="smalltxt" onclick="copycode($('code6'));" >[Copy to clipboard]</a></div>CODE:</div><div id="wmqeeuq" class="msgborder" id="code6" style="FONT-FAMILY: Fixdays">下面的短的shellE序可以列出目录? 充分利用了sed强大的模式匹配能? <br />  目录?wi)Ş式如? <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 />  脚本如下Q?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 />如何实现取出文g中特定的列内?br /><br /><div id="wmqeeuq" class="msgheader"><div id="wmqeeuq" class="right"><a class="smalltxt" onclick="copycode($('code7'));" >[Copy to clipboard]</a></div>CODE:</div><div id="wmqeeuq" class="msgborder" id="code7" style="FONT-FAMILY: Fixdays">我们l常?x)遇到需要取出分字段的文件的某些特定字段Q例?etc/password是通过?”分隔各个字D늚。可以通过cut命o(h)来实现。例如,我们希望系l̎号名保存到特定的文gQ就可以Q?br />  cut -d: -f 1 /etc/passwd >; /tmp/users<br />  -d用来定义分隔W,默认为tab键,-f表示需要取得哪个字Dc?br />  当然也可以通过cut取得文g中每行中特定的几个字W,例如Q?br />  cut -c3-5 /etc/passwd<br />  是输出/etc/passwd文g中每行的W三到第五个字符?br />  -c ?Qf 参数可以跟以下子参数Q?br />  N WN个字W或字段<br />  N- 从第一个字W或字段到文件结?br />  N-M 从第N个到WM个字W或字段<br />  -M 从第一个到WN个字W或字段 </div><br />在vim中实现批量加?br /><br /><div id="wmqeeuq" class="msgheader"><div id="wmqeeuq" class="right"><a class="smalltxt" onclick="copycode($('code8'));" >[Copy to clipboard]</a></div>CODE:</div><div id="wmqeeuq" class="msgborder" id="code8" style="FONT-FAMILY: Fixdays">密码中还是不能带I格Q不了Q能加密好Q先q么用着?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 id="wmqeeuq" class="msgheader"><div id="wmqeeuq" class="right"><a class="smalltxt" onclick="copycode($('code9'));" >[Copy to clipboard]</a></div>CODE:</div><div id="wmqeeuq" class="msgborder" id="code9" style="FONT-FAMILY: Fixdays">在shell脚本的实际编写中Q有一些特D的变量十分有用Q?br />$# 传递到脚本的参C?br /><br />$* 以一个单字符串显C所有向脚本传递的参数。与位置变量不同Q此选项参数可超q??br /><br />$$ 脚本q行的当前进EID?br /><br />$! 后台q行的最后一个进E的q程ID?br /><br />$@ ?#相同Q但是用时加引Pq在引号中返回每个参?br /><br />$- 昄shell使用的当前选项Q与set命o(h)功能相同<br /><br />$? 昄最后命令的退出状态?表示没有错误Q其他Q何D明有错误?/div><br />如何使程序的执行l果同时定向到屏q和文g<br /><br /><div id="wmqeeuq" class="msgheader"><div id="wmqeeuq" class="right"><a class="smalltxt" onclick="copycode($('code10'));" >[Copy to clipboard]</a></div>CODE:</div><div id="wmqeeuq" class="msgborder" id="code10" style="FONT-FAMILY: Fixdays">program_name |tee logfile<br />q样E序执行期间的显C都记录到l(f)ogfile同时昄到标准输出(屏幕Q?</div><br />如何用sendmaill系l所有用户送信<br /><br /><div id="wmqeeuq" class="msgheader"><div id="wmqeeuq" class="right"><a class="smalltxt" onclick="copycode($('code11'));" >[Copy to clipboard]</a></div>CODE:</div><div id="wmqeeuq" class="msgborder" id="code11" style="FONT-FAMILY: Fixdays">首先在aliases文g里面建立一个aliasQ?br />alluser: :include:/etc/mail/allusers<br />q执行newaliases使之生效Q然后在/etc/mail/allusers里面列出所有用P可以使用下面的命令:(x)<br />awk -F: '$3 >; 100 { print $1 }' /etc/passwd >; /etc/mail/allusers</div><br />如何查找某条命o(h)的相兛_文g<br /><br /><div id="wmqeeuq" class="msgheader"><div id="wmqeeuq" class="right"><a class="smalltxt" onclick="copycode($('code12'));" >[Copy to clipboard]</a></div>CODE:</div><div id="wmqeeuq" class="msgborder" id="code12" style="FONT-FAMILY: Fixdays">在制作自q发行版时l常需要判断某条命令需要哪些库文g的支持,以确保指定的命o(h)在独立的pȝ内可以可靠的q行?br />在Linux环境下通过ldd命o(h)卛_实现Q在控制台执行:(x)<br />ldd /bin/ls<br />卛_得到/bin/ls命o(h)的相兛_文g列表?</div><br />如何使用host命o(h)获得更多信息<br /><br /><div id="wmqeeuq" class="msgheader"><div id="wmqeeuq" class="right"><a class="smalltxt" onclick="copycode($('code13'));" >[Copy to clipboard]</a></div>CODE:</div><div id="wmqeeuq" class="msgborder" id="code13" style="FONT-FAMILY: Fixdays">Host能够用来查询域名Q然而它可以得到更多的信息。host -t mx linux.com可以查询出Linux.com的MX记录Q以及处理Mail的Host的名字。Host -l linux.com?x)返回所有注册在linux.com下的域名。host -a linux.com则会(x)昄q个L的所有域名信息?</div><br />如何停止l端多个q程<br /><br /><div id="wmqeeuq" class="msgheader"><div id="wmqeeuq" class="right"><a class="smalltxt" onclick="copycode($('code14'));" >[Copy to clipboard]</a></div>CODE:</div><div id="wmqeeuq" class="msgborder" id="code14" style="FONT-FAMILY: Fixdays">以下是脚本:(x)<br />  echo "pȝ当前用户"<br />  echo "---------------"<br />  who | awk '{print $2}'<br />  echo "---------------"<br />  echo "输入要杀ȝ端的l端?"<br />  read $TTY<br />  kill -9 ${K}=`ps -t $TTY | grep [0-9] | awk '{print $1}'` </div><br /></div> <img src ="http://www.aygfsteel.com/morphis/aggbug/99751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/morphis/" target="_blank">morphis</a> 2007-02-13 22:47 <a href="http://www.aygfsteel.com/morphis/archive/2007/02/13/99751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">޼</a>| <a href="http://" target="_blank">ԣ</a>| <a href="http://" target="_blank">żҿ</a>| <a href="http://" target="_blank">ӯ</a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ǰ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˫</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɳ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϸ</a>| <a href="http://" target="_blank">ͬ</a>| <a href="http://" target="_blank">Ӣ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ǫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʷ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͬ</a>| <a href="http://" target="_blank">״</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>