📄 assortedtips.html
字号:
<!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 # 添加(>>)下面的代码, 到你想跟踪记录的脚本末尾. 2 3 whoami>> $SAVE_FILE # 记录调用脚本的用户. 4 echo $0>> $SAVE_FILE # 脚本名. 5 date>> $SAVE_FILE # 记录日期和时间. 6 echo>> $SAVE_FILE # 空行作为分隔符. 7 8 # 当然, 我们应该在~/.bashrc中定义并导出变量SAVE_FILE. 9 #+ (看起来有点像~/.scripts-run)</PRE></FONT></TD></TR></TABLE> </P></LI><LI><P><ANAME="PREPENDREF"></A></P><P><SPANCLASS="TOKEN">>></SPAN>操作符可以在文件末尾添加内容. 如果你想在文件的<EM>头部</EM>添加内容怎么办, 难道要粘贴到文件头? </P><P> <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 file=data.txt 2 title="***This is the title line of data text file***" 3 4 echo $title | cat - $file >$file.new 5 # "cat -" 将stdout连接到$file. 6 # 最后的结果就是生成了一新文件, 7 #+ 并且成功的将$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 # 脚本库 2 # ------ ------- 3 4 # 注: 5 # 这里没有"#!". 6 # 也没有"真正需要执行的代码". 7 8 9 # 有用的变量定义 10 11 ROOT_UID=0 # root用户的$UID为0. 12 E_NOTROOT=101 # 非root用户的出错代码. 13 MAXRETVAL=255 # 函数最大的返回值(正值). 14 SUCCESS=0 15 FAILURE=-1 16 17 18 19 # Functions 20 21 Usage () # "Usage:"信息. (译者注: 即帮助信息) 22 { 23 if [ -z "$1" ] # 没有参数传递进来. 24 then 25 msg=filename 26 else 27 msg=$@ 28 fi 29 30 echo "Usage: `basename $0` "$msg"" 31 } 32 33 34 Check_if_root () # 检查运行脚本的用户是否为root. 35 { # 摘自"ex39.sh". 36 if [ "$UID" -ne "$ROOT_UID" ] 37 then 38 echo "Must be root to run this script." 39 exit $E_NOTROOT 40 fi 41 } 42 43 44 CreateTempfileName () # 创建"唯一"的临时文件. 45 { # 摘自"ex51.sh". 46 prefix=temp 47 suffix=`eval date +%s` 48 Tempfilename=$prefix.$suffix 49 } 50 51 52 isalpha2 () # 测试*整个字符串*是否都是由字母组成的. 53 { # 摘自"isalpha.sh". 54 [ $# -eq 1 ] || return $FAILURE 55 56 case $1 in 57 *[!a-zA-Z]*|"") return $FAILURE;; 58 *) return $SUCCESS;; 59 esac # 感谢, S.C. 60 } 61 62 63 abs () # 绝对值. 64 { # 注意: 最大的返回值 = 255. 65 E_ARGERR=-999999 66 67 if [ -z "$1" ] # 需要传递参数. 68 then 69 return $E_ARGERR # 返回错误. 70 fi 71 72 if [ "$1" -ge 0 ] # 如果是非负值, 73 then # 74 absval=$1 # 那就是绝对值本身. 75 else # 否则, 76 let "absval = (( 0 - $1 ))" # 改变符号. 77 fi 78 79 return $absval 80 } 81 82 83 tolower () # 将传递进来的参数字符串 84 { #+ 转换为小写. 85 86 if [ -z "$1" ] # 如果没有参数传递进来. 87 then #+ 打印错误消息 88 echo "(null)" #+ (C风格的void指针错误消息) 89 return #+ 并且从函数中返回. 90 fi 91 92 echo "$@" | tr A-Z a-z 93 # 转换所有传递进来的参数($@). 94 95 return 96 97 # 使用命令替换, 将函数的输出赋值给变量. 98 # 举例: 99 # oldvar="A seT of miXed-caSe LEtTerS"100 # newvar=`tolower "$oldvar"`101 # echo "$newvar" # 一串混合大小写的字符全部转换为小写102 #103 # 练习: 重写这个函数, 104 # 将传递进来的参数全部转换为大写[容易].105 }</PRE></FONT></TD></TR></TABLE> </P></LI><LI><P>使用特殊目的注释头来增加脚本的条理性和可读性. </P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 ## 表示注意. 2 rm -rf *.zzy ## "rm"命令的"-rf"选项非常的危险. 3 ##+ 尤其对通配符, 就更危险. 4 5 #+ 表示继续上一行. 6 # 这是多行注释的第一行, 7 #+ 8 #+ 这是最后一行. 9 10 #* 表示标注. 11 12 #o 表示列表项. 13 14 #> 表示另一种观点. 15 while [ "$var1" != "end" ] #> 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 #!/bin/bash 2 3 COMMENT_BLOCK= 4 # 如果给上面的变量赋值, 5 #+ 就会出现令人不快的结果. 6 7 if [ $COMMENT_BLOCK ]; then 8 9 Comment block -- 10 ================================= 11 This is a comment line. 12 This is another comment line. 13 This is yet another comment line. 14 ================================= 15 16 echo "This will not echo." 17 18 Comment blocks are error-free! Whee! 19 20 fi 21 22 echo "No more comments, please." 23 24 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 + -