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

📄 assortedtips.html

📁 BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版
💻 HTML
📖 第 1 页 / 共 3 页
字号:
<!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="miscellany.html"><LINKREL="PREVIOUS"TITLE="优化"HREF="optimizations.html"><LINKREL="NEXT"TITLE="安全问题"HREF="securityissues.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="optimizations.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom">33. 杂项</TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="securityissues.html"ACCESSKEY="N">下一页</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="SECT1"><H1CLASS="SECT1"><ANAME="ASSORTEDTIPS">33.7. 各种小技巧</A></H1><P></P><UL><LI><P>为了记录在某个(或某些)特定会话中用户脚本的运行状态, 			可以将下面的代码添加到你想要跟踪记录的脚本中. 	    添加的这段代码会将脚本名和调用次数记录到一个连续的文件中. 	    </P><P>	  <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;# 添加(&#62;&#62;)下面的代码, 到你想跟踪记录的脚本末尾.   2&nbsp;  3&nbsp;whoami&#62;&#62; $SAVE_FILE    # 记录调用脚本的用户.   4&nbsp;echo $0&#62;&#62; $SAVE_FILE   # 脚本名.   5&nbsp;date&#62;&#62; $SAVE_FILE      # 记录日期和时间.   6&nbsp;echo&#62;&#62; $SAVE_FILE      # 空行作为分隔符.   7&nbsp;  8&nbsp;#  当然, 我们应该在~/.bashrc中定义并导出变量SAVE_FILE.   9&nbsp;#+ (看起来有点像~/.scripts-run)</PRE></FONT></TD></TR></TABLE>          </P></LI><LI><P><ANAME="PREPENDREF"></A></P><P><SPANCLASS="TOKEN">&#62;&#62;</SPAN>操作符可以在文件末尾添加内容. 		  如果你想在文件的<EM>头部</EM>添加内容怎么办, 		 难道要粘贴到文件头? 	    </P><P>	  <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;file=data.txt  2&nbsp;title="***This is the title line of data text file***"  3&nbsp;  4&nbsp;echo $title | cat - $file &#62;$file.new  5&nbsp;# "cat -" 将stdout连接到$file.  6&nbsp;#  最后的结果就是生成了一新文件,   7&nbsp;#+ 并且成功的将$title的内容附加到了文件的*开头*. </PRE></FONT></TD></TR></TABLE>	  </P><P>这是之前的<AHREF="x13628.html#PREPENDEX">例子 17-13</A>脚本的简化版本. 	    当然, <AHREF="sedawk.html#SEDREF">sed</A>也能做到. </P></LI><LI><P>shell脚本也可以象一个内嵌到脚本的命令那样被调用, 		  比如<EM>Tcl</EM>或<EM>wish</EM>脚本, 		  甚至是<AHREF="filearchiv.html#MAKEFILEREF">Makefile</A>. 		  在C语言中, 它们可以作为一个外部的shell命令被<TTCLASS="REPLACEABLE"><I>system()</I></TT>函数调用, 比如, 	   <TTCLASS="REPLACEABLE"><I>system("script_name");</I></TT>. </P></LI><LI><P>将一个内嵌<ICLASS="FIRSTTERM">sed</I>或<ICLASS="FIRSTTERM">awk</I>的脚本内容赋值给一个变量, 能够提高<AHREF="wrapper.html#SHWRAPPER">shell包装</A>脚本的可读性. 	    请参考<AHREF="contributed-scripts.html#MAILFORMAT">例子 A-1</A>和<AHREF="internal.html#COLTOTALER3">例子 11-19</A>. </P></LI><LI><P>将你最喜欢的变量定义和函数实现都放到一个文件中. 	    在你需要的时候, 		通过使用<AHREF="special-chars.html#DOTREF">点</A>(<BCLASS="COMMAND">.</B>)命令, 		或者<AHREF="internal.html#SOURCEREF">source</A>命令, 		来将这些<SPANCLASS="QUOTE">"库文件"</SPAN><SPANCLASS="QUOTE">"包含"</SPAN>到脚本中. 	    </P><P>              <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;# 脚本库  2&nbsp;# ------ -------  3&nbsp;  4&nbsp;# 注:  5&nbsp;# 这里没有"#!".   6&nbsp;# 也没有"真正需要执行的代码".   7&nbsp;  8&nbsp;  9&nbsp;# 有用的变量定义 10&nbsp; 11&nbsp;ROOT_UID=0             # root用户的$UID为0.  12&nbsp;E_NOTROOT=101          # 非root用户的出错代码.  13&nbsp;MAXRETVAL=255          # 函数最大的返回值(正值).  14&nbsp;SUCCESS=0 15&nbsp;FAILURE=-1 16&nbsp; 17&nbsp; 18&nbsp; 19&nbsp;# Functions 20&nbsp; 21&nbsp;Usage ()               # "Usage:"信息. (译者注: 即帮助信息) 22&nbsp;{ 23&nbsp;  if [ -z "$1" ]       # 没有参数传递进来.  24&nbsp;  then 25&nbsp;    msg=filename 26&nbsp;  else 27&nbsp;    msg=$@ 28&nbsp;  fi 29&nbsp; 30&nbsp;  echo "Usage: `basename $0` "$msg"" 31&nbsp;}   32&nbsp; 33&nbsp; 34&nbsp;Check_if_root ()       # 检查运行脚本的用户是否为root.  35&nbsp;{                      # 摘自"ex39.sh".  36&nbsp;  if [ "$UID" -ne "$ROOT_UID" ] 37&nbsp;  then 38&nbsp;    echo "Must be root to run this script." 39&nbsp;    exit $E_NOTROOT 40&nbsp;  fi 41&nbsp;}   42&nbsp; 43&nbsp; 44&nbsp;CreateTempfileName ()  # 创建"唯一"的临时文件.  45&nbsp;{                      # 摘自"ex51.sh".  46&nbsp;  prefix=temp 47&nbsp;  suffix=`eval date +%s` 48&nbsp;  Tempfilename=$prefix.$suffix 49&nbsp;} 50&nbsp; 51&nbsp; 52&nbsp;isalpha2 ()            # 测试*整个字符串*是否都是由字母组成的.  53&nbsp;{                      # 摘自"isalpha.sh".  54&nbsp;  [ $# -eq 1 ] || return $FAILURE 55&nbsp; 56&nbsp;  case $1 in 57&nbsp;  *[!a-zA-Z]*|"") return $FAILURE;; 58&nbsp;  *) return $SUCCESS;; 59&nbsp;  esac                 # 感谢, S.C. 60&nbsp;} 61&nbsp; 62&nbsp; 63&nbsp;abs ()                           # 绝对值.  64&nbsp;{                                # 注意: 最大的返回值 = 255.  65&nbsp;  E_ARGERR=-999999 66&nbsp; 67&nbsp;  if [ -z "$1" ]                 # 需要传递参数.  68&nbsp;  then 69&nbsp;    return $E_ARGERR             # 返回错误.  70&nbsp;  fi 71&nbsp; 72&nbsp;  if [ "$1" -ge 0 ]              # 如果是非负值,  73&nbsp;  then                           # 74&nbsp;    absval=$1                    # 那就是绝对值本身.  75&nbsp;  else                           # 否则,  76&nbsp;    let "absval = (( 0 - $1 ))"  # 改变符号.  77&nbsp;  fi   78&nbsp; 79&nbsp;  return $absval 80&nbsp;} 81&nbsp; 82&nbsp; 83&nbsp;tolower ()             #  将传递进来的参数字符串 84&nbsp;{                      #+ 转换为小写.  85&nbsp; 86&nbsp;  if [ -z "$1" ]       #  如果没有参数传递进来.  87&nbsp;  then                 #+ 打印错误消息 88&nbsp;    echo "(null)"      #+ (C风格的void指针错误消息) 89&nbsp;    return             #+ 并且从函数中返回.  90&nbsp;  fi   91&nbsp; 92&nbsp;  echo "$@" | tr A-Z a-z 93&nbsp;  # 转换所有传递进来的参数($@).  94&nbsp; 95&nbsp;  return 96&nbsp; 97&nbsp;# 使用命令替换, 将函数的输出赋值给变量.  98&nbsp;# 举例:  99&nbsp;#    oldvar="A seT of miXed-caSe LEtTerS"100&nbsp;#    newvar=`tolower "$oldvar"`101&nbsp;#    echo "$newvar"    # 一串混合大小写的字符全部转换为小写102&nbsp;#103&nbsp;# 练习: 重写这个函数, 104&nbsp;#           将传递进来的参数全部转换为大写[容易].105&nbsp;}</PRE></FONT></TD></TR></TABLE>          </P></LI><LI><P>使用特殊目的注释头来增加脚本的条理性和可读性. 	    </P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;## 表示注意.   2&nbsp;rm -rf *.zzy   ##  "rm"命令的"-rf"选项非常的危险.   3&nbsp;               ##+ 尤其对通配符, 就更危险.   4&nbsp;  5&nbsp;#+ 表示继续上一行.   6&nbsp;#  这是多行注释的第一行,   7&nbsp;#+   8&nbsp;#+ 这是最后一行.   9&nbsp; 10&nbsp;#* 表示标注.  11&nbsp; 12&nbsp;#o 表示列表项.  13&nbsp; 14&nbsp;#&#62; 表示另一种观点.  15&nbsp;while [ "$var1" != "end" ]    #&#62; while test "$var1" != "end"</PRE></FONT></TD></TR></TABLE></P></LI><LI><P><AHREF="testconstructs.html#TESTCONSTRUCTS1">if-test</A>结构有一种聪明的用法, 			用来注释代码块. </P><P>    	      <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;  3&nbsp;COMMENT_BLOCK=  4&nbsp;#  如果给上面的变量赋值,   5&nbsp;#+ 就会出现令人不快的结果.   6&nbsp;  7&nbsp;if [ $COMMENT_BLOCK ]; then  8&nbsp;  9&nbsp;Comment block -- 10&nbsp;================================= 11&nbsp;This is a comment line. 12&nbsp;This is another comment line. 13&nbsp;This is yet another comment line. 14&nbsp;================================= 15&nbsp; 16&nbsp;echo "This will not echo." 17&nbsp; 18&nbsp;Comment blocks are error-free! Whee! 19&nbsp; 20&nbsp;fi 21&nbsp; 22&nbsp;echo "No more comments, please." 23&nbsp; 24&nbsp;exit 0</PRE></FONT></TD></TR></TABLE>	  </P><P>比较这种用法, 和<AHREF="here-docs.html#CBLOCK1">使用here document注释代码块</A>之间的区别. </P></LI><LI><P>使用<AHREF="internalvariables.html#XSTATVARREF">$?退出状态变量</A>, 			因为脚本可能需要测试一个参数是否都是数字, 			以便于后边可以把它当作一个整数来处理. 	    </P><P>  	    <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRE

⌨️ 快捷键说明

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