??xml version="1.0" encoding="utf-8" standalone="yes"?>国产一区二区三区精品久久久,亚洲国产精品自拍,中日韩免费毛片http://www.aygfsteel.com/jzone/category/40638.htmljava web, java wap ..My laboratory..zh-cnSun, 29 Nov 2009 21:25:45 GMTSun, 29 Nov 2009 21:25:45 GMT60向脚本传递参?/title><link>http://www.aygfsteel.com/jzone/articles/304093.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sun, 29 Nov 2009 04:10:00 GMT</pubDate><guid>http://www.aygfsteel.com/jzone/articles/304093.html</guid><description><![CDATA[<h3 class="" title="随笔"><a ></a> </h3> <div id="wmqeeuq" class="blog_content"><strong><span style="font-size: medium">shift命o</span></strong> <br /> 向脚本传递参数时Q有旉要将每一个参数偏UM处理选项Q这是 shift命o的功能。它每次参C|向左偏UM位,下面用一D늮单脚本详q其功能。脚本?while循环反馈所有传递到脚本的参数。用shift命o来处理传递到脚本的每一个参敎ͼ <br /> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> </div> <ol class="dp-default"> <li><span><span>#!/bin/sh   </span></span></li> <li><span>loop=</span><span id="wmqeeuq" class="number">0</span><span>  </span></span></li> <li><span>while [ $# -ne </span><span id="wmqeeuq" class="number">0</span><span> ]   </span></span></li> <li><span>do    </span></li> <li><span>   echo $</span><span id="wmqeeuq" class="number">1</span><span>  </span></span></li> <li><span>   shift   </span></li> <li><span>done  </span></li> </ol> </div> <pre class="shell" style="display: none" name="code">#!/bin/sh loop=0 while [ $# -ne 0 ] do echo $1 shift done </pre> <br /> 使用shift处理文g大小写{?<br /> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> </div> <ol class="dp-default"> <li><span><span>!#/bin/sh   </span></span></li> <li><span># tr_case   </span></li> <li><span># convert files to either  upper or lower case   </span></li> <li><span>FILES=</span><span id="wmqeeuq" class="string">""</span><span>  </span></span></li> <li><span>TRCASE=</span><span id="wmqeeuq" class="string">""</span><span>  </span></span></li> <li><span>EXT=</span><span id="wmqeeuq" class="string">""</span><span>  </span></span></li> <li><span>OPT=no   </span></li> <li><span>  </span></li> <li><span># gets called when a conversion fails   </span></li> <li><span>error_msg()   </span></li> <li><span>{   </span></li> <li><span>_FILENAME=$</span><span id="wmqeeuq" class="number">1</span><span>  </span></span></li> <li><span>echo </span><span id="wmqeeuq" class="string">"`basename $0`: Error the conversion failed on $_FILENAME"</span><span>  </span></span></li> <li><span>}   </span></li> <li><span>  </span></li> <li><span>if [ $# -eq </span><span id="wmqeeuq" class="number">0</span><span> ]   </span></span></li> <li><span>then    </span></li> <li><span>   echo </span><span id="wmqeeuq" class="string">"For more info try `basename $0` --help"</span><span>  </span></span></li> <li><span>   exit </span><span id="wmqeeuq" class="number">1</span><span>  </span></span></li> <li><span>fi   </span></li> <li><span>  </span></li> <li><span>while [ $# -gt </span><span id="wmqeeuq" class="number">0</span><span> ]   </span></span></li> <li><span>do   </span></li> <li><span>  case $</span><span id="wmqeeuq" class="number">1</span><span> in   </span></span></li> <li><span>  #set the variables based on what option was used   </span></li> <li><span>  -u)TRCASE=upper   </span></li> <li><span>     EXT=</span><span id="wmqeeuq" class="string">".UC"</span><span>  </span></span></li> <li><span>     OPT=yes   </span></li> <li><span>     shift   </span></li> <li><span>     ;;   </span></li> <li><span>  -l)TRCASE=lower   </span></li> <li><span>     EXT=</span><span id="wmqeeuq" class="string">".LC"</span><span>  </span></span></li> <li><span>     OPT=yes   </span></li> <li><span>     shift   </span></li> <li><span>     ;;   </span></li> <li><span>  -help) echo </span><span id="wmqeeuq" class="string">"convert a file(s) to uppercase from lowercase"</span><span>  </span></span></li> <li><span>         echo </span><span id="wmqeeuq" class="string">"convert a file(s) from lowercase to uppercase"</span><span>  </span></span></li> <li><span>         echo </span><span id="wmqeeuq" class="string">"will convert all characters according to the sepcified command option."</span><span>  </span></span></li> <li><span>         echo </span><span id="wmqeeuq" class="string">"where option is"</span><span>  </span></span></li> <li><span>         echo </span><span id="wmqeeuq" class="string">"-l Convert to lowercase"</span><span>  </span></span></li> <li><span>         echo </span><span id="wmqeeuq" class="string">"-u Convert to uppercase"</span><span>  </span></span></li> <li><span>         echo </span><span id="wmqeeuq" class="string">"The original file(s) is not touched. A new file(s)"</span><span>  </span></span></li> <li><span>         echo </span><span id="wmqeeuq" class="string">"will be created with either a .UC or .LC extension"</span><span>  </span></span></li> <li><span>         echo </span><span id="wmqeeuq" class="string">"usage: $0 -[l|u] file [file..]"</span><span>  </span></span></li> <li><span>     exit </span><span id="wmqeeuq" class="number">0</span><span>  </span></span></li> <li><span>     ;;   </span></li> <li><span>    -*) echo </span><span id="wmqeeuq" class="string">"usage: `basename $0` -[l|u] file [file..]"</span><span>  </span></span></li> <li><span>     exit </span><span id="wmqeeuq" class="number">1</span><span>  </span></span></li> <li><span>     ;;   </span></li> <li><span>  </span></li> <li><span>     *) # collect the files to process   </span></li> <li><span>     if [ -f $</span><span id="wmqeeuq" class="number">1</span><span> ]   </span></span></li> <li><span>       then   </span></li> <li><span>           # add the filenames to a variable list   </span></li> <li><span>           FILES=$FILES</span><span id="wmqeeuq" class="string">" "</span><span>$</span><span id="wmqeeuq" class="number">1</span><span>  </span></span></li> <li><span>       else   </span></li> <li><span>           echo </span><span id="wmqeeuq" class="string">"`basename $0` : Error cannot find the file $1"</span><span>  </span></span></li> <li><span>     fi   </span></li> <li><span>     shift   </span></li> <li><span>     ;;   </span></li> <li><span>   esac   </span></li> <li><span>done   </span></li> <li><span>  </span></li> <li><span>if [ </span><span id="wmqeeuq" class="string">"$OPT"</span><span> = </span><span id="wmqeeuq" class="string">"no"</span><span> ]   </span></span></li> <li><span>then   </span></li> <li><span>   echo </span><span id="wmqeeuq" class="string">"`basename $0`: Error you need to specify an option. No action taken"</span><span>  </span></span></li> <li><span>   echo </span><span id="wmqeeuq" class="string">"`basename` --help"</span><span>  </span></span></li> <li><span>   exit </span><span id="wmqeeuq" class="number">1</span><span>  </span></span></li> <li><span>fi   </span></li> <li><span>             </span></li> <li><span># now read in all the file(s)   </span></li> <li><span># use the variable LOOP, I just love the word LOOP   </span></li> <li><span>for LOOP in $FILES   </span></li> <li><span>do   </span></li> <li><span> case $TRCASE in   </span></li> <li><span> lower) cat $LOOP|tr </span><span id="wmqeeuq" class="string">"[a-z]"</span><span> </span><span id="wmqeeuq" class="string">"[A-Z]"</span><span> >$LOOP$EXT   </span></span></li> <li><span>    if [ $? != </span><span id="wmqeeuq" class="number">0</span><span> ]   </span></span></li> <li><span>       then    </span></li> <li><span>       error_msg $LOOP   </span></li> <li><span>    else   </span></li> <li><span>       echo </span><span id="wmqeeuq" class="string">"Converted file called $LOOP$EXT"</span><span>  </span></span></li> <li><span>    fi   </span></li> <li><span>    ;;   </span></li> <li><span> upper) cat $LOOP|tr </span><span id="wmqeeuq" class="string">"[A-Z]"</span><span> </span><span id="wmqeeuq" class="string">"[a-z]"</span><span> > $LOOP$EXT   </span></span></li> <li><span>    if [ $? != </span><span id="wmqeeuq" class="number">0</span><span> ]   </span></span></li> <li><span>    then   </span></li> <li><span>       error_msg $LOOP   </span></li> <li><span>    else   </span></li> <li><span>       echo </span><span id="wmqeeuq" class="string">"Converted file called $LOOP$EXT"</span><span>  </span></span></li> <li><span>    fi   </span></li> <li><span>    ;;   </span></li> <li><span>  esac   </span></li> <li><span>done  </span></li> </ol> </div> <pre class="shell" style="display: none" name="code">!#/bin/sh # tr_case # convert files to either upper or lower case FILES="" TRCASE="" EXT="" OPT=no # gets called when a conversion fails error_msg() { _FILENAME=$1 echo "`basename $0`: Error the conversion failed on $_FILENAME" } if [ $# -eq 0 ] then echo "For more info try `basename $0` --help" exit 1 fi while [ $# -gt 0 ] do case $1 in #set the variables based on what option was used -u)TRCASE=upper EXT=".UC" OPT=yes shift ;; -l)TRCASE=lower EXT=".LC" OPT=yes shift ;; -help) echo "convert a file(s) to uppercase from lowercase" echo "convert a file(s) from lowercase to uppercase" echo "will convert all characters according to the sepcified command option." echo "where option is" echo "-l Convert to lowercase" echo "-u Convert to uppercase" echo "The original file(s) is not touched. A new file(s)" echo "will be created with either a .UC or .LC extension" echo "usage: $0 -[l|u] file [file..]" exit 0 ;; -*) echo "usage: `basename $0` -[l|u] file [file..]" exit 1 ;; *) # collect the files to process if [ -f $1 ] then # add the filenames to a variable list FILES=$FILES" "$1 else echo "`basename $0` : Error cannot find the file $1" fi shift ;; esac done if [ "$OPT" = "no" ] then echo "`basename $0`: Error you need to specify an option. No action taken" echo "`basename` --help" exit 1 fi # now read in all the file(s) # use the variable LOOP, I just love the word LOOP for LOOP in $FILES do case $TRCASE in lower) cat $LOOP|tr "[a-z]" "[A-Z]" >$LOOP$EXT if [ $? != 0 ] then error_msg $LOOP else echo "Converted file called $LOOP$EXT" fi ;; upper) cat $LOOP|tr "[A-Z]" "[a-z]" > $LOOP$EXT if [ $? != 0 ] then error_msg $LOOP else echo "Converted file called $LOOP$EXT" fi ;; esac done </pre> <br /> <strong><span style="font-size: medium">getopts命o</span></strong> <br /> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> </div> <ol class="dp-default"> <li><span><span>#!/bin/sh   </span></span></li> <li><span>#getopts1   </span></li> <li><span>#set the vars   </span></li> <li><span>ALL=false   </span></li> <li><span>HELP=false   </span></li> <li><span>FILE=false   </span></li> <li><span>VERBROSE=false   </span></li> <li><span>  </span></li> <li><span>while getopts ahfgv OPTION   </span></li> <li><span>do   </span></li> <li><span>  case $OPTION in   </span></li> <li><span>  a)ALL=true   </span></li> <li><span>    echo </span><span id="wmqeeuq" class="string">"ALL is $ALL"</span><span>  </span></span></li> <li><span>    ;;   </span></li> <li><span>  h)HELP=true   </span></li> <li><span>    echo </span><span id="wmqeeuq" class="string">"HELP is $HELP"</span><span>  </span></span></li> <li><span>    ;;   </span></li> <li><span>  f)FILE=true   </span></li> <li><span>    echo </span><span id="wmqeeuq" class="string">"FILE is $FILE"</span><span>  </span></span></li> <li><span>    ;;   </span></li> <li><span>  v)VERBOSE=true   </span></li> <li><span>    echo </span><span id="wmqeeuq" class="string">"VERROSE is $VERROSE"</span><span>  </span></span></li> <li><span>    ;;   </span></li> <li><span>  esac   </span></li> <li><span>done  </span></li> </ol> </div> <pre class="shell" style="display: none" name="code">#!/bin/sh #getopts1 #set the vars ALL=false HELP=false FILE=false VERBROSE=false while getopts ahfgv OPTION do case $OPTION in a)ALL=true echo "ALL is $ALL" ;; h)HELP=true echo "HELP is $HELP" ;; f)FILE=true echo "FILE is $FILE" ;; v)VERBOSE=true echo "VERROSE is $VERROSE" ;; esac done </pre> <br /> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> </div> <ol class="dp-default"> <li><span><span>/home/l/g/tomotoboy/getopts >getopts1 -a   </span></span></li> <li><span>ALL is true   </span></li> <li><span>/home/l/g/tomotoboy/getopts >getopts1 -v   </span></li> <li><span>VERROSE is   </span></li> <li><span>/home/l/g/tomotoboy/getopts >getopts1 -v -a -h   </span></li> <li><span>VERROSE is   </span></li> <li><span>ALL is true   </span></li> <li><span>HELP is true  </span></li> </ol> </div> <pre class="shell" style="display: none" name="code">/home/l/g/tomotoboy/getopts >getopts1 -a ALL is true /home/l/g/tomotoboy/getopts >getopts1 -v VERROSE is /home/l/g/tomotoboy/getopts >getopts1 -v -a -h VERROSE is ALL is true HELP is true </pre> getopts一般格式ؓQ?<br /> getopts  option_string variable <br /> 在上qC子中使用脚本Q?<br /> while getopts ahfgv OPTION <br /> 可以看出while循环用于d命o行,option_string为指定的5个选项Q? aQ? hQ? fQ? gQ? vQ?脚本中variable为OPTION。注意这里ƈ没有用连字符指定每一单个选项?<br /> <br /> <strong>使用getopts指定变量取?/strong> <br /> 有时有必要在脚本中指定命令行选项取倹{getopts为此提供了一U方式,卛_option_string中将一个冒h在选项后。例如: <br /> getopts ahfvc: OPTION <br /> 上面一行脚本指出,选项 a、h、f、v可以不加实际D行传递,而选项 c必须取倹{用选项取值时Q必M用变?OPTARG保存该倹{如果试图不取g递此选项Q会q回一个错误信息。错误信息提Cƈ不明,因此可以用自q反馈信息屏蔽它,Ҏ如下Q?<br /> 冒h在option_string开始部分?<br /> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> </div> <ol class="dp-default"> <li><span><span>while getopts :ahfgvc:  OPTION  </span></span></li> </ol> </div> <pre class="shell" style="display: none" name="code">while getopts :ahfgvc: OPTION</pre> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> </div> <ol class="dp-default"> <li><span><span>#!/bin/sh   </span></span></li> <li><span>#getopts1   </span></li> <li><span>#set the vars   </span></li> <li><span>ALL=false   </span></li> <li><span>HELP=false   </span></li> <li><span>FILE=false   </span></li> <li><span>VERBROSE=false   </span></li> <li><span>COPIES=</span><span id="wmqeeuq" class="number">0</span><span> #the value for the -c option is set to zero   </span></span></li> <li><span>while getopts :ahfgvc: OPTION   </span></li> <li><span>do   </span></li> <li><span>  case $OPTION in   </span></li> <li><span>  a)ALL=true   </span></li> <li><span>    echo </span><span id="wmqeeuq" class="string">"ALL is $ALL"</span><span>  </span></span></li> <li><span>    ;;   </span></li> <li><span>  h)HELP=true   </span></li> <li><span>    echo </span><span id="wmqeeuq" class="string">"HELP is $HELP"</span><span>  </span></span></li> <li><span>    ;;   </span></li> <li><span>  f)FILE=true   </span></li> <li><span>    echo </span><span id="wmqeeuq" class="string">"FILE is $FILE"</span><span>  </span></span></li> <li><span>    ;;   </span></li> <li><span>  v)VERBOSE=true   </span></li> <li><span>    echo </span><span id="wmqeeuq" class="string">"VERROSE is $VERROSE"</span><span>  </span></span></li> <li><span>    ;;   </span></li> <li><span>  c)COPIES=$OPTARG   </span></li> <li><span>    echo </span><span id="wmqeeuq" class="string">"COPIES is $COPIES"</span><span>  </span></span></li> <li><span>    ;;   </span></li> <li><span>  \?) #usage stagement   </span></li> <li><span>    echo </span><span id="wmqeeuq" class="string">"`basename $0` -[a h f v] -[c value] file"</span><span> >&</span><span id="wmqeeuq" class="number">2</span><span>  </span></span></li> <li><span>    ;;   </span></li> <li><span> esac   </span></li> <li><span>done    </span></li> </ol> </div> <pre class="shell" style="display: none" name="code">#!/bin/sh #getopts1 #set the vars ALL=false HELP=false FILE=false VERBROSE=false COPIES=0 #the value for the -c option is set to zero while getopts :ahfgvc: OPTION do case $OPTION in a)ALL=true echo "ALL is $ALL" ;; h)HELP=true echo "HELP is $HELP" ;; f)FILE=true echo "FILE is $FILE" ;; v)VERBOSE=true echo "VERROSE is $VERROSE" ;; c)COPIES=$OPTARG echo "COPIES is $COPIES" ;; \?) #usage stagement echo "`basename $0` -[a h f v] -[c value] file" >&2 ;; esac done </pre> <br /> <br /> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> </div> <ol class="dp-default"> <li><span><span>/home/l/g/tomotoboy/getopts >chmod </span><span id="wmqeeuq" class="number">755</span><span> getopts2   </span></span></li> <li><span>/home/l/g/tomotoboy/getopts >getopts2 -c hello   </span></li> <li><span>COPIES is hello   </span></li> <li><span>/home/l/g/tomotoboy/getopts >getopts2 -h -c hello   </span></li> <li><span>HELP is true   </span></li> <li><span>COPIES is hello  </span></li> </ol> </div> <pre class="shell" style="display: none" name="code">/home/l/g/tomotoboy/getopts >chmod 755 getopts2 /home/l/g/tomotoboy/getopts >getopts2 -c hello COPIES is hello /home/l/g/tomotoboy/getopts >getopts2 -h -c hello HELP is true COPIES is hello</pre> <br /> <br /> <strong>讉K取值方?/strong> <br /> getopts的一U功能是q行后台脚本。这样可以用户加入选项Q指定不同的带讑֤以备份数据。用getopts实现此Q务的基本框架如下Q?<br /> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> </div> <ol class="dp-default"> <li><span><span>#!/bin/sh   </span></span></li> <li><span>QUITE=n   </span></li> <li><span>DEVICE=awa   </span></li> <li><span>LOGFILE=/tmp/logbackup   </span></li> <li><span>usage()   </span></li> <li><span>{   </span></li> <li><span> echo </span><span id="wmqeeuq" class="string">"Usage: `basename $0` -d [device] -l [logfile] -q"</span><span>  </span></span></li> <li><span> exit </span><span id="wmqeeuq" class="number">1</span><span>  </span></span></li> <li><span>  </span></li> <li><span>}   </span></li> <li><span>if [ $# = </span><span id="wmqeeuq" class="number">0</span><span> ]   </span></span></li> <li><span>then    </span></li> <li><span>  usage   </span></li> <li><span>fi   </span></li> <li><span>  </span></li> <li><span>while getopts :qd:l: OPTION   </span></li> <li><span>do   </span></li> <li><span>  case $OPTION in   </span></li> <li><span>  q) QUIET=y   </span></li> <li><span>     LOGFILE=</span><span id="wmqeeuq" class="string">"/tmp/backup.log"</span><span>  </span></span></li> <li><span>     ;;   </span></li> <li><span>  d) DEVICE=$OPTARG   </span></li> <li><span>     ;;   </span></li> <li><span>  l) LOGFILE=$OPTARG      </span></li> <li><span>     ;;   </span></li> <li><span>  \?)usage   </span></li> <li><span>     ;;   </span></li> <li><span>   esac   </span></li> <li><span>done   </span></li> <li><span>echo </span><span id="wmqeeuq" class="string">"you chose the following options...I can now process these"</span><span>  </span></span></li> <li><span>echo </span><span id="wmqeeuq" class="string">"Quite = $QUIET $DEVICE $LOGFILE"</span><span>  </span></span></li> </ol> </div> </div> <img src ="http://www.aygfsteel.com/jzone/aggbug/304093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jzone/" target="_blank">Gavin.lee</a> 2009-11-29 12:10 <a href="http://www.aygfsteel.com/jzone/articles/304093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell函数http://www.aygfsteel.com/jzone/articles/304092.htmlGavin.leeGavin.leeSun, 29 Nov 2009 04:09:00 GMThttp://www.aygfsteel.com/jzone/articles/304092.html 
函数׃部分l成Q?
  • 函数标题?
  • 函数体?

标题是函数名。函C是函数内的命令集合。标题名应该唯一Q如果不是,会hl,因ؓ脚本在查看调用脚本前首先搜索函数调用相应的 s h e l l?
定义函数的格式ؓQ?
Shell代码
  1. 函数名(Q?  
  2. {    
  3. 命o1  
  4. . . .   
  5. }   
  6. 或?  
  7. function 函数名(Q?  
  8. {   ...   
  9. }  


两者方式都可行。如果愿意,可在函数名前加上关键字functionQ这取决于用者?

创徏函数文g
下面创徏包容函数的函数文件ƈ之载入shellQ进行测试,再做改动Q之后再重新载入?
函数文g名ؓfunctions.mainQ内容如?
Shell代码
  1. #!/bin/sh   
  2. #functions.main   
  3. #   
  4. #findit: this is front end for the basic find command   
  5. findit() {   
  6. #findit   
  7. if [ $# -lt 1 ]; then   
  8. echo "usage : findit file"  
  9. return 1;   
  10. fi   
  11. find . -name $1 -print   
  12. }  
定位文g
定位文g格式为:
. /pahname/filename
现在文g已经创徏好了Q要之载入shellQ试键入Q?
$. functions.main
如果q回信息file not foundQ再试:
$. /functions.main
此即<?gt; <I格> <斜线> <文g?gt;Q现在文件应该已载入shell。如果仍有错误,则应该仔l检查是否键入了完整路径?

查蝲入函?
使用set命o保函数已蝲入。set命o在shell中显C所有的载入函数?
Shell代码
  1. /home/l/g/tomotoboy/function >. function.main   
  2. /home/l/g/tomotoboy/function >set   
  3. ……   
  4. _=function.main   
  5. findit ()   
  6. {   
  7.     if [ $# -lt 1 ]; then   
  8.         echo "usage : findit file";   
  9.         return 1;   
  10.     fi;   
  11.     find . -name $1 -print   
  12. }  
执行shell函数
要执行函敎ͼ单地键入函数名即可。这里是带有一个参数的 findit函数Q参数是某个文g
Shell代码
  1. /home/l/g/tomotoboy/function >cd .   
  2. /home/l/g/tomotoboy/function >cd ..   
  3. /home/l/g/tomotoboy >findit sed.txt   
  4. ./testdirec/sed.txt   
  5. ./sed.txt  


删除shell函数
现在对函数做一些改动。首先删除函敎ͼ使其对shell不可利用。用unset命o完成此功能。删除函数时unset命o格式为:
unset  function_name
$unset findit
如果现在键入set命oQ函数将不再昄?
Shell代码
  1. /home/l/g/tomotoboy >unset findit   
  2. /home/l/g/tomotoboy >set   
  3. ……   
  4. _=findit   
  5. /home/l/g/tomotoboy >findit sed.txt   
  6. -bash: findit: command not found  


再次定位函数
Shell代码
  1. /home/l/g/tomotoboy >. function/function.main   
  2. /home/l/g/tomotoboy >findit sed.txt   
  3. ./testdirec/sed.txt   
  4. ./sed.txt  

如果函数从试l果中反馈输出,那么使用替换命o可保存结果。函数调用的替换格式为:
variable_name = variable_name
函数function_name输出被设|到变量variable_name中?
Shell代码
  1. char_name(){   
  2. # char_name   
  3. # to call: char_name string   
  4. # assign the argument across to new variable   
  5. _LETTER_ONLY=$1  
  6. # user awk to test for character only!   
  7. _LETTER_ONLY=`echo $1|awk '{if ($0~/[^a-z A-Z]/) print 1}'`   
  8. if [ "$_LETTER_ONLY" != "" ]   
  9. then   
  10.     # oops  errors   
  11.     return 1  
  12. else   
  13.     # constains only chars   
  14.     return 0  
  15. fi   
  16. }  

Shell代码
  1. if char_name $F_NAME; then   
  2.  echo "OK"  
  3. else   
  4.   echo "ERROR"  
  5. fi  
试一?
Shell代码
  1. /home/l/g/tomotoboy/function >char_name hello   
  2. /home/l/g/tomotoboy/function >echo $?   
  3. 0  
注意^W号的用,当直接用在第一个括号里Q意指否定或不匹配括号里内容。[^a-z A-Z] 匚wM非字母型字符Q而[^0-9]匚wM非数字型字符?


Gavin.lee 2009-11-29 12:09 发表评论
]]>
后台执行命o——守护进E创?/title><link>http://www.aygfsteel.com/jzone/articles/304091.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sun, 29 Nov 2009 04:08:00 GMT</pubDate><guid>http://www.aygfsteel.com/jzone/articles/304091.html</guid><description><![CDATA[<h3 class="" title="随笔"><a ></a> </h3> <div id="wmqeeuq" class="blog_content">当你在终端或控制台工作时Q可能不希望׃q行一个作业而占住了屏幕Q因为可能还有更重要的事情要做,比如阅读电子邮g。对于密集访问磁盘的q程Q你可能希望它能够在每天的非负荷高峰旉D运行。ؓ了ɘq些q程能够在后台运行,也就是说不在l端屏幕上运行,有几U选择Ҏ可供使用Q?<br /> <ul> <li>讄crontab文gQƈ用它来提交作业? <li>使用at命o来提交作业? <li>在后台提交作业? <li>使用nohup命o提交作业?</li> </ul> <br /> 名词解释Q?<br /> <ul> <li>cronpȝ调度q程。可以用它在每天的非高峰负h间段q行作业Q或在一周或一月中的不同时D运行? <li>at命o。用它在一个特定的旉q行一些特D的作业Q或在晚一些的非负荷高峰时间段或高峰负h间段q行? <li>& 使用它在后台q行一个占用时间不长的q程? <li>Nohup 使用它在后台q行一个命令,即在用户退出时也不受媄响?</li> </ul> <br /> 一个D一个例?<br /> <strong>crontab</strong> <br /> 用crontab提交一个Q务在每天晚上7点对zhangwanzhi说i love you <br /> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> </div> <ol class="dp-default"> <li><span><span>/home/l/g/tomotoboy >touch tomotoboycron   </span></span></li> <li><span>/home/l/g/tomotoboy >cat > tomotoboycron   </span></li> <li><span id="wmqeeuq" class="number">0</span><span> </span><span id="wmqeeuq" class="number">19</span><span> * * * echo </span><span id="wmqeeuq" class="string">"I love zhangwanzhi"</span><span>  </span></span></li> <li><span>/home/l/g/tomotoboy >crontab tomotoboycron   </span></li> <li><span>cron may not be running - call your system administrator   </span></li> <li><span>/home/l/g/tomotoboy >crontab -l   </span></li> <li><span id="wmqeeuq" class="number">0</span><span> </span><span id="wmqeeuq" class="number">19</span><span> * * * echo </span><span id="wmqeeuq" class="string">"I love zhangwanzhi"</span><span>  </span></span></li> </ol> </div> <pre class="shell" style="display: none" name="code">/home/l/g/tomotoboy >touch tomotoboycron /home/l/g/tomotoboy >cat > tomotoboycron 0 19 * * * echo "I love zhangwanzhi" /home/l/g/tomotoboy >crontab tomotoboycron cron may not be running - call your system administrator /home/l/g/tomotoboy >crontab -l 0 19 * * * echo "I love zhangwanzhi"</pre> <br /> <br /> 删除crontab 文g <br /> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> </div> <ol class="dp-default"> <li><span><span>/home/l/g/tomotoboy >crontab -r   </span></span></li> <li><span>cron may not be running - call your system administrator   </span></li> <li><span>/home/l/g/tomotoboy >crontab -l   </span></li> <li><span>crontab: can't open your crontab file.  </span></li> </ol> </div> <pre class="shell" style="display: none" name="code">/home/l/g/tomotoboy >crontab -r cron may not be running - call your system administrator /home/l/g/tomotoboy >crontab -l crontab: can't open your crontab file.</pre> <br /> <br /> 恢复丢失的crontab文g <br /> 如果不小心误删了crontab文gQ假设你在自q$HOME目录下还有一个备份,那么可以其拯?var/spool/cron/<username >Q其?lt;username>是用户名。如果由于权限问题无法完成拷贝,可以用: <br /> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> </div> <ol class="dp-default"> <li><span><span>$ crontab <filename>  </span></span></li> </ol> </div> <pre class="shell" style="display: none" name="code">$ crontab <filename></pre> <br /> 现在我们来恢复tomotoboycron <br /> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> </div> <ol class="dp-default"> <li><span><span>/home/l/g/tomotoboy >crontab tomotoboycron   </span></span></li> <li><span>cron may not be running - call your system administrator   </span></li> <li><span>/home/l/g/tomotoboy >crontab -l   </span></li> <li><span id="wmqeeuq" class="number">0</span><span> </span><span id="wmqeeuq" class="number">19</span><span> * * * echo </span><span id="wmqeeuq" class="string">"I love zhangwanzhi"</span><span>  </span></span></li> </ol> </div> <pre class="shell" style="display: none" name="code">/home/l/g/tomotoboy >crontab tomotoboycron cron may not be running - call your system administrator /home/l/g/tomotoboy >crontab -l 0 19 * * * echo "I love zhangwanzhi"</pre> <br /> <strong>at</strong> <br /> 在命令提交一分钟后执?<br /> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> </div> <ol class="dp-default"> <li><span><span>/home/l/g/tomotoboy >ls -l|grep </span><span id="wmqeeuq" class="string">"tomotoboy"</span><span>|at now +</span><span id="wmqeeuq" class="number">1</span><span> minute   </span></span></li> <li><span>cron may not be running - call your system administrator   </span></li> <li><span>commands will be executed using /bin/bash   </span></li> <li><span>job </span><span id="wmqeeuq" class="number">1249815115</span><span>.a at Sun Aug  </span><span id="wmqeeuq" class="number">9</span><span> </span><span id="wmqeeuq" class="number">18</span><span>:</span><span id="wmqeeuq" class="number">51</span><span>:</span><span id="wmqeeuq" class="number">55</span><span> </span><span id="wmqeeuq" class="number">2009</span><span>  </span></span></li> </ol> </div> <pre class="shell" style="display: none" name="code">/home/l/g/tomotoboy >ls -l|grep "tomotoboy"|at now +1 minute cron may not be running - call your system administrator commands will be executed using /bin/bash job 1249815115.a at Sun Aug 9 18:51:55 2009</pre> <br /> <br /> 列出已经提交的atdQ?<br /> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> </div> <ol class="dp-default"> <li><span><span>/home/l/g/tomotoboy >at -l   </span></span></li> <li><span id="wmqeeuq" class="number">1249815115</span><span>.a    Sun Aug  </span><span id="wmqeeuq" class="number">9</span><span> </span><span id="wmqeeuq" class="number">18</span><span>:</span><span id="wmqeeuq" class="number">51</span><span>:</span><span id="wmqeeuq" class="number">55</span><span> </span><span id="wmqeeuq" class="number">2009</span><span>  </span></span></li> <li><span id="wmqeeuq" class="number">1249813233</span><span>.a    Sun Aug  </span><span id="wmqeeuq" class="number">9</span><span> </span><span id="wmqeeuq" class="number">18</span><span>:</span><span id="wmqeeuq" class="number">20</span><span>:</span><span id="wmqeeuq" class="number">33</span><span> </span><span id="wmqeeuq" class="number">2009</span><span>  </span></span></li> <li><span id="wmqeeuq" class="number">1249813261</span><span>.a    Sun Aug  </span><span id="wmqeeuq" class="number">9</span><span> </span><span id="wmqeeuq" class="number">18</span><span>:</span><span id="wmqeeuq" class="number">21</span><span>:</span><span id="wmqeeuq" class="number">01</span><span> </span><span id="wmqeeuq" class="number">2009</span><span>  </span></span></li> </ol> </div> <pre class="shell" style="display: none" name="code">/home/l/g/tomotoboy >at -l 1249815115.a Sun Aug 9 18:51:55 2009 1249813233.a Sun Aug 9 18:20:33 2009 1249813261.a Sun Aug 9 18:21:01 2009</pre> <br /> <br /> 使用atrm删除一个Q务: <br /> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> </div> <ol class="dp-default"> <li><span><span>/home/l/g/tomotoboy >atrm </span><span id="wmqeeuq" class="number">1249815115</span><span>.a   </span></span></li> <li><span>cron may not be running - call your system administrator   </span></li> <li><span id="wmqeeuq" class="number">1249815115</span><span>.a: removed   </span></span></li> <li><span>/home/l/g/tomotoboy >at -l   </span></li> <li><span id="wmqeeuq" class="number">1249813233</span><span>.a    Sun Aug  </span><span id="wmqeeuq" class="number">9</span><span> </span><span id="wmqeeuq" class="number">18</span><span>:</span><span id="wmqeeuq" class="number">20</span><span>:</span><span id="wmqeeuq" class="number">33</span><span> </span><span id="wmqeeuq" class="number">2009</span><span>  </span></span></li> <li><span id="wmqeeuq" class="number">1249813261</span><span>.a    Sun Aug  </span><span id="wmqeeuq" class="number">9</span><span> </span><span id="wmqeeuq" class="number">18</span><span>:</span><span id="wmqeeuq" class="number">21</span><span>:</span><span id="wmqeeuq" class="number">01</span><span> </span><span id="wmqeeuq" class="number">2009</span><span>  </span></span></li> </ol> </div> <pre class="shell" style="display: none" name="code">/home/l/g/tomotoboy >atrm 1249815115.a cron may not be running - call your system administrator 1249815115.a: removed /home/l/g/tomotoboy >at -l 1249813233.a Sun Aug 9 18:20:33 2009 1249813261.a Sun Aug 9 18:21:01 2009</pre> <br /> <br /> <strong>&和nohup</strong> <br /> 在后台运行echo "I love you zhangwanzhi" Q用户退出时不终止: <br /> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> </div> <ol class="dp-default"> <li><span><span>/home/l/g/tomotoboy >nohup echo </span><span id="wmqeeuq" class="string">"I love you zhangwanzhi"</span><span> &   </span></span></li> <li><span>[</span><span id="wmqeeuq" class="number">1</span><span>] </span><span id="wmqeeuq" class="number">20784</span><span>  </span></span></li> <li><span>/home/l/g/tomotoboy >Sending output to nohup.out   </span></li> <li><span>/home/l/g/tomotoboy >cat nohup.out   </span></li> <li><span>Ilove you zhangwanzhi  </span></li> </ol> </div> </div> <img src ="http://www.aygfsteel.com/jzone/aggbug/304091.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jzone/" target="_blank">Gavin.lee</a> 2009-11-29 12:08 <a href="http://www.aygfsteel.com/jzone/articles/304091.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>控制结构——until、while、break、continuehttp://www.aygfsteel.com/jzone/articles/304090.htmlGavin.leeGavin.leeSun, 29 Nov 2009 04:07:00 GMThttp://www.aygfsteel.com/jzone/articles/304090.html 
until循环
条g?为真Q?为假
until循环执行一pd命o直至条g为真时停止?until循环与while循环在处理方式上刚好相反。一般while循环优于until循环Q但在某些时候—也只是极少数情况下Quntil循环更加有用?
until循环格式为:
Shell代码
  1. until  条g   
  2. do   
  3.     命o1  
  4.     . . .   
  5. done  
条g可ؓL试条gQ测试发生在循环末尾Q因此@环至执行一ơ—请注意q一?
监视文g
下面例子中,until循环不断挂v做睡眠,直至文gprocess.LCK 被删除。文件删除后Q脚本进入正常处理过E?
Shell代码
  1. /home/l/g/tomotoboy/until >ls   
  2. until_lck  untilwho   
  3. /home/l/g/tomotoboy/until >[ -f untilwho ]   
  4. /home/l/g/tomotoboy/until >echo $?   
  5. 0  
  6. /home/l/g/tomotoboy/until >[ ! -f untilwho ]   
  7. /home/l/g/tomotoboy/until >echo $?   
  8. 1  
  9. /home/l/g/tomotoboy/until >rm untilwho   
  10. /home/l/g/tomotoboy/until >[ ! -f untilwho ]   
  11. /home/l/g/tomotoboy/until >echo $?   
  12. 0  
  13.   
  14. #!/bin/sh   
  15. #until_lck   
  16. touch `pwd`/process.LCK   
  17. LOCK_FILE=`pwd`/process.LCK   
  18. until [ ! -f $LOCK_FILE ]   
  19. do   
  20.      sleep 1  
  21. done   
  22. echo "file deleted"  

查找tomotoboy有没有登录,登陆后给自己发个邮g
Shell代码
  1. /home/l/g/tomotoboy/until >cat untilwho   
  2. #!/bin/sh   
  3. #until_who   
  4. IS_TOMOTOBOY=`who | grep tomotoboy`   
  5. until [  "$IS_TOMOTOBOY" ]   
  6. do   
  7.     sleep 5  
  8. done   
  9. echo "Wtch it. tomotoboy in " | mail tomotoboy  

while循环
while循环用于不断执行一pd命oQ也用于从输入文件中d数据Q其格式为:
Shell代码
  1. while  命o   
  2. do   
  3. 命o1  
  4. 命o2  
  5. . . .   
  6. done  
虽然通常只用一个命令,但在 while和do之间可以攑և个命令。命令通常用作试条g。只有当命o的退出状态ؓ 0Ӟdo和done之间命o才被执行Q如果退出状态不?0Q则循环l止?
Shell代码
  1. #!/bin/sh   
  2. #whilecount   
  3. COUNT=0  
  4. while [ $COUNT -lt 5 ]   
  5. do   
  6.   echo "$COUNT"  
  7.   COUNT=`expr $COUNT + 1`   
  8. done   
  9.   
  10. /home/l/g/tomotoboy >whilecount   
  11. 0  
  12. 1  
  13. 2  
  14. 3  
  15. 4  

L?
Shell代码
  1. #!/bin/sh   
  2. #whileread   
  3. while read LINE   
  4. do   
  5.   echo "$LINE"  
  6. done < sed.txt  



break
break命o允许跛_循环。break通常在进行一些处理后退出@环或 case语句。如果是在一个嵌入@环里Q可以指定蟩出的循环个数。例如如果在两层循环内,?break刚好跛_整个循环?
跛_case语句
下面的例子中Q脚本进入死循环直至用户输入数字大于 5。要跛_q个循环Q返回到shell提示W下Qbreak使用脚本如下Q?
Shell代码
  1. #!/bin/sh   
  2. #breakout   
  3. #while : means loop forever   
  4. while :   
  5. do   
  6.    echo -n "Enter any number [1..5]: "  
  7.    read ANS   
  8.    case $ANS in   
  9.    1|2|3|4|5) echo " great you entered a number between 1 and 5"  
  10.    ;;   
  11.    *)echo "Wrong number..bye"  
  12.    break   
  13.   ;;   
  14.  esac   
  15. done  

Shell代码
  1. /home/l/g/tomotoboy >breakout   
  2. -n Enter any number [1..5]:   
  3. 3  
  4.  great you entered a number between 1 and 5  
  5. -n Enter any number [1..5]:   
  6. 6  
  7. Wrong number..bye  

continue
continue命ocM于break命oQ只有一炚w要差别,它不会蟩出@环,只是跌q个循环步?


Gavin.lee 2009-11-29 12:07 发表评论
]]>
控制结构——forhttp://www.aygfsteel.com/jzone/articles/304089.htmlGavin.leeGavin.leeSun, 29 Nov 2009 04:06:00 GMThttp://www.aygfsteel.com/jzone/articles/304089.html 
for循环
for 变量?in 列表
do
       命o 1
       命o 2
done
当变量值在列表里,for循环x行一ơ所有命令,使用变量名访问列表中取倹{命令可ZQ何有效的shell命o和语句。变量名ZQ何单词。in列表用法是可选的Q如果不用它Q?for循环使用命o行的位置参数。in列表可以包含替换、字W串和文件名Q下面看一些例子?
Shell代码
  1. /home/l/g/tomotoboy/for >cat fortest   
  2. #!/bin/sh   
  3. #for_i   
  4. for loop in 1 2 3 4 5 6  
  5. do   
  6.     echo $loop   
  7. done   
  8.   
  9. #forlist   
  10. for loop in "orange red blue grey"  
  11. do   
  12.    echo $loop   
  13. done   
  14.   
  15. #forls   
  16. for loop in `ls`   
  17. do   
  18.      echo $loop   
  19. done   
  20.   
  21.   
  22. #forparam   
  23. for params   
  24. do   
  25.      echo "you supplied $params as command line option"  
  26.      echo $params   
  27. done   
  28.   
  29. for params in "$@"  
  30. do   
  31.      echo "you supplied $params as command line option"  
  32.      echo $params   
  33. done   
  34.   
  35. #forcommand   
  36. for loop   
  37. do   
  38.       find `pwd` -name $loop -print   
  39. done   
  40.   
  41.   
  42. /home/l/g/tomotoboy/for >fortest fortest   
  43. 1  
  44. 2  
  45. 3  
  46. 4  
  47. 5  
  48. 6  
  49. orange red blue grey   
  50. fortest   
  51. you supplied fortest as command line option   
  52. fortest   
  53. you supplied fortest as command line option   
  54. fortest  


使用for循环q接服务?
因ؓfor循环可以处理列表中的取|现设变量为网l服务器名称Qƈ使用for循环q接每一服务器?
Shell代码
  1. #!/bin/sh   
  2. #forping   
  3. HOSTS="sina.com cqu.edu.cn baidu.com"  
  4. for loop in $HOSTS   
  5. do   
  6.      ping -c 2 $loop   
  7. done  
多文件{?
匚w所有以.sedl尾文gq将其{换ؓ大写。这里用了 l s和cat命o。l s用于查询出相xӞcat用于之道输出至trr命o。目标文件扩展名?UCQ注意在for循环中用l s命o时反引号的用法?
Shell代码
  1. #!/bin/sh   
  2. #forstr   
  3. for files in `ls *.sed`   
  4. do   
  5.     cat $files |tr "[a-z]"  "[A-Z]" >$files.UC   
  6. done   
  7.   
  8. /home/l/g/tomotoboy >cat change.sed   
  9. #!/bin/sed -f   
  10. #change.sed   
  11. /tomotoboy/ c\   
  12. I love China,Ilove Wanzhi.   
  13. /home/l/g/tomotoboy >ls *.UC   
  14. append.sed.UC  change.sed.UC   
  15. /home/l/g/tomotoboy >cat change.sed.UC   
  16. #!/BIN/SED -F   
  17. #CHANGE.SED   
  18. /TOMOTOBOY/ C\   
  19. I LOVE CHINA,ILOVE WANZHI.  


多sed删除操作
下面的例子中Qsed用于删除所有空文gQƈ输出导至以 . HOLD.为扩展名的新文gQmv这些文件移臛_始文件中?
Shell代码
  1. #!/bin/sh   
  2. #forsed   
  3. for files in `ls *.sed`   
  4. do   
  5.    sed -e "/^$/d" $files > $files.HOLD   
  6.    mv $files.HOLD $files   
  7. done  


循环计数
前面讨论expr时指出,循环时如果要加入计数Q用此命o。下面?l s在for循环中列出文件及其数目?
Shell代码
  1. /home/l/g/tomotoboy >cat forcount   
  2. #!/bin/sh   
  3. #forcount   
  4. count=0  
  5. for files in *   
  6. do   
  7.   count=`expr $count + 1`   
  8. done   
  9. echo "There are $count files in `pwd` we need to process"  



Gavin.lee 2009-11-29 12:06 发表评论
]]>
控制结构——if then elsehttp://www.aygfsteel.com/jzone/articles/304087.htmlGavin.leeGavin.leeSun, 29 Nov 2009 04:05:00 GMThttp://www.aygfsteel.com/jzone/articles/304087.html 
if then else语句
Shell代码
  1. If  条g1    //如果条g1为真   
  2. Then         //那么   
  3. 命o1       //执行命o1  
  4. elif  条g2    //如果条g1不成?  
  5. then           //那么   
  6. 命o2        //执行命o2  
  7. else           //如果条g1Q?/span>2均不成立   
  8. 命o3       //那么执行命o3  
  9. fi             //完成  



单的if语句
最普通的if语句是:
if条g
then  命o
if
使用if语句Ӟ必须then部分攑֜新行Q否则会产生错误。如果要不分行,必须使用命o分隔W。本

书其余部分将采取q种形式。现在简?if语句变ؓQ?
if  条gQthen
命o
if

Shell代码
  1. /home/l/g/tomotoboy >cat iftest   
  2. #!/bin/sh   
  3. #iftest   
  4. #this is a comment line,all comment lines start with a#   
  5. if [ "12" -lt "14" ]   
  6. then   
  7.  #yes 12 is less than 14  
  8.  echo  "Yes, 12 is less than 14"  
  9. fi   
  10.   
  11. /home/l/g/tomotoboy >chmod u+x iftest   
  12. /home/l/g/tomotoboy > ./iftest   
  13. Yes, 12 is less than 14  
变量值测?
不必拘惔于变量或数值测试,也可以测知系l命令是否成功返回。对 grep使用if语句扑ևgrep是否成功

q回信息。下面的例子?grep用于查看tomotoboy是否在数据文件sed.txt中,注意'tomotoboy'用于_?

匹配?
Shell代码
  1. /home/l/g/tomotoboy >cat grepif   
  2. #!/bin/sh   
  3. #grep if   
  4. if grep 'tomotoboy' sed.txt >/dev/null 2>&1  
  5. then   
  6.  echo "tomotoboy is  in the file"  
  7. else   
  8.  echo "tomotoboy is not in the file"  
  9. fi   
  10.   
  11. /home/l/g/tomotoboy >./grepif   
  12. tomotoboy is  in the file  

用变量测试grep输出
正像前面看到的,可以用grep作字W串操作。下面的脚本中,用户输入一个名字列表,grep在变量中查找Q要求其查找指定字符?

Shell代码
  1. /home/l/g/tomotoboy >cat grepstr   
  2. #!/bin/sh   
  3. #grepstr   
  4. echo -n "Enter a piece of text file:"  
  5. read TEXT   
  6. echo -n "Enter a string to query: "  
  7. read QUERY   
  8. if grep $QUERY $TEXT >/dev/null 2>&1  
  9. then   
  10.    echo "$QUERY is in $TEXT"  
  11.    #could do some processing here...   
  12. else   
  13.    echo "$QUERY is not in  $TEXT"  
  14. fi   
  15.   
  16. /home/l/g/tomotoboy >./grepstr   
  17. -n Enter a piece of text file:   
  18. sed.txt   
  19. -n Enter a string to query:   
  20. tomotoboy   
  21. tomotoboy is in sed.txt  

文g拯输出?
下面试文g拯是否正常Q如?cp命oq没有拷贝文件myfile到myfile.bakQ则打印错误信息。注意错误信息中` basename $0`打印脚本名。如果脚本错误退出,一个好习惯是显C本名q将之定向到标准错误中。用户应该知道生错误的脚本名?
Shell代码
  1. /home/l/g/tomotoboy >chmod u+x ifcp   
  2. /home/l/g/tomotoboy >ifcp   
  3. cp: cannot access myfile   
  4. ifcp: error could not copy the file   
  5. /home/l/g/tomotoboy >cat ifcp   
  6. #!/bin/sh   
  7. #ifcp   
  8. if cp myfile myfile.bak; then   
  9.  echo "good copy"  
  10. else   
  11.  echo "`basename $0`: error could not copy the file" >&2  
  12. fi   
  13. /home/l/g/tomotoboy >touch myfile   
  14. /home/l/g/tomotoboy >ifcp   
  15. good copy   
  16. /home/l/g/tomotoboy >  


当前目录试
当运行一些管理脚本时Q可能要在根目录下运行它Q特别是Ud某种全局文g或进行权限改变时。一个简单的试可以L是否q行在根目录下。下面脚本中变量DIRECTORY使用当前目录的命令替换操作,然后此变量g " / "字符串比较(/为根目录Q?。如果变量g字符串不{,则用户退本,退出状态ؓ1意味错误信息产生?
Shell代码
  1. /home/l/g/tomotoboy >ifpwd   
  2. You need to be in the root directory not /home/l/g/tomotoboy to run this script   
  3. /home/l/g/tomotoboy >cd /etc   
  4. /etc >cd /   
  5. / >/home/l/g/tomotoboy/ifpwd   
  6. / >cat ifpwd   
  7. cat: cannot open ifpwd   
  8. / >cat /home/l/g/tomotoboy/ifpwd   
  9. #!/bin/sh   
  10. #ifpwd   
  11. DIRECTORY=`pwd`   
  12. #grab the current directory   
  13. if [ "$DIRECTORY" != "/" ];then   
  14. #is it the root directory?   
  15. #no ,the direct output to standard  error,which is the screen by default.   
  16. echo "You need to be in the root directory not $DIRECTORY to run this script" >&2  
  17. #exit with a value of 1, an error   
  18. exit 1  
  19. fi  


文g权限试
可以用i f语句试文g权限Q下面简单测试文件sed.txt是否可写
Shell代码
  1. /home/l/g/tomotoboy >ifwr sed.txt   
  2. You can write to sed.txt   
  3. /home/l/g/tomotoboy >cat ifwr   
  4. #!/bin/sh   
  5. #ifwr   
  6. if [ ! -w "$1" ]; then   
  7.   echo "You cannot write to $1" >&2  
  8. else   
  9.   echo "You can write to $1"  
  10. fi  


试传递到脚本中的参数
if语句可用来测试传入脚本中参数的个数。用特定变?#Q表C用参数的个数。可以测试所需参数个数与调用参C数是否相{。以下测试确保脚本有三个参数。如果没有,则返回一个可用信息到标准错误Q然后代码退出ƈ昄退出状态。如果参数数目等?Q则昄所有参数?
Shell代码
  1. /home/l/g/tomotoboy >cat ifparam   
  2. #!/bin/sh   
  3. #ifparam   
  4. if [ $# -lt 3 ]; then   
  5. #less than 3 parameters called,echo  a usage message and exit   
  6. echo "Usage: `basename $0` arg1 arg2 arg3" >&2  
  7. exit   
  8. fi   
  9. #good ,receive 3 params, let's echo them   
  10. echo "arg1: $1"  
  11. echo "arg2: $2"  
  12. echo "arg3: $3"  
  13. /home/l/g/tomotoboy >ifparam yang shi hai   
  14. arg1: yang   
  15. arg2: shi   
  16. arg3: hai  


军_脚本是否Z互模?
有时需要知道脚本运行是交互模式Q终端模式)q是非交互模式(cron或atQ?。脚本也讔R要这个信息以军_从哪里取得输入以及输出到哪里Q用test命oq带?t选项很容易确认这一炏V如果testq回gؓ1Q则Z互模式?
Shell代码
  1. /home/l/g/tomotoboy >cat ifinteractive   
  2. #!/bin/sh   
  3. #ifinteractive   
  4. if [ -t ];then   
  5. echo "We are interactive with a terminal"  
  6. else   
  7. echo "We must be running from some background process probably cron or at"  
  8. fi   
  9. /home/l/g/tomotoboy >ifinteractive   
  10. We are interactive with a terminal  

单的if else语句
下一个if语句有可能是使用最q泛的:
Shell代码
  1. if条g   
  2. then   
  3. 命o1  
  4. else   
  5. 命o2  
  6. fi  
使用if语句的else部分可在条g试为假旉取适当动作?
变量讄试Q下面的例子试环境变量EDITOR是否已设|。如果EDITOR变量为空Q将此信息通知用户。如果已讄Q在屏幕上显C编辑类型?
Shell代码
  1. /home/l/g/tomotoboy >echo $EDITOR   
  2.   
  3. /home/l/g/tomotoboy >cat ifeditor   
  4. #!/bin/sh   
  5. #ifeditor   
  6. if [ -z "$EDITOR" ];then   
  7. #the variable has not been set   
  8. echo "Your EDITOR environment is not set"  
  9. else   
  10. #let's  us see what is it   
  11. echo "Using $EDITOR as the default editor"  
  12. fi   
  13. /home/l/g/tomotoboy >ifeditor   
  14. Your EDITOR environment is not set   
  15. /home/l/g/tomotoboy >  


最后命令状?/strong>
前面目录名传入脚本创徏了一个目录,脚本然后提示用户是否应创建目录。下面的例子创徏一个目录,q从当前目录所?*.txt文g拷入新目录。但是这D脚本中用最后状态命令检了每一个脚本是否成功执行。如果命令失败则通知用户?
Shell代码
  1. /home/l/g/tomotoboy >cat ifmkdir   
  2. #!/bin/sh   
  3. #ifmkdir   
  4. DIR_NAME=testdirec   
  5. #where we are?   
  6. THERE=`pwd`   
  7. #send all output to system dustbin   
  8. mkdir $DIR_NAME >/dev/null 2>&1  
  9. #is it a directory?   
  10. if [ -d $DIR_NAME ];then   
  11. #can we cd to the directory   
  12.   cd $DIR_NAME   
  13.   if [ $? = 0 ];then   
  14.   #yes we can   
  15.   HERE=`pwd`   
  16.   echo "$HERE"  
  17.   cp $THERE/*.txt $HERE   
  18.   else   
  19.    echo "Cannot cd to $DIR_NAME" >&2  
  20.    exit 1  
  21.   fi   
  22. else   
  23.   echo "Cannot create directory $DIR_NAME" >&2  
  24.   exit 1  
  25. fi  

单的安全d脚本
以下是用L录时启动应用前加入相应安全限制功能的基本框架。首先提C入用户名和密码,如果用户名和密码均匹配脚本中相应字符Ԍ用户d成功Q否则用户退出。脚本首先设|变量ؓ假—L假定用户输入错误Qstty当前讄被保存,以便隐藏passwd域中字符Q然后重C存stty讄。如果用户I D和密码正(密码是mydayQ?Q明亮INVALID_USER和INVALID_PASSWD讄为no表示有效用户或密码,然后执行试Q如果两个变量其中之一为yesQ缺省情况下Q脚本退出用戗键入有效的ID和密码,用户允许进入。这是一U登录脚本的基本框架。下面的例子中有效用户ID为dave或tomotoboy?
Shell代码
  1. #!/bin/sh   
  2. #ifpass   
  3. #set the variables to false   
  4. INVALID_USER=yes   
  5. INVALID_PASSWD=yes   
  6. #set the current stty settings   
  7. SAVEDSTTY=`stty -g`   
  8. echo "You are logging into a sensitive area"  
  9. echo -n "Enter your ID name:"  
  10. read NAME   
  11. #hide the characters typed in   
  12. stty -echo   
  13. echo "Enter your password :"  
  14. read PASSWORD   
  15. #back on again   
  16. stty $SAVEDSTTY   
  17. if [ "$NAME" = "tomotoboy" ] || [ "$NAME" = "dave" ]; then   
  18.  #if a valid then set variable   
  19.     INVALID_USER=no   
  20. fi   
  21. if [ "$PASSWORD" = "myday" ];then   
  22.  #if valid password then set variable   
  23.     INVALID_PASSWD=no   
  24. fi   
  25. if [ "$INVALID_USER" = "yes" ] || [ "$INVALID_PASSWD" = "yes" ];then   
  26.    echo "`basename $0` : Sorry wrong password or userid"  
  27.    exit 1  
  28. fi   
  29. echo "corrent user id and password given"  



Gavin.lee 2009-11-29 12:05 发表评论
]]>
控制结构——casehttp://www.aygfsteel.com/jzone/articles/304088.htmlGavin.leeGavin.leeSun, 29 Nov 2009 04:05:00 GMThttp://www.aygfsteel.com/jzone/articles/304088.html 
case语句
case语句为多选择语句。可以用case语句匚w一个g一个模式,如果匚w成功Q执行相匚w的命令。case语句格式如下Q?
Shell代码
  1. case ?nbsp;in   
  2. 模式1 )   
  3.   命o1  
  4.   . . .   
  5.   ;;   
  6. 模式2 )   
  7.   命o2  
  8.   . . .   
  9.   ;;   
  10. esac  


case工作方式如上所C。取值后面必Mؓ单词 inQ每一模式必须以右括号l束。取值可以ؓ变量或常数。匹配发现取值符合某一模式后,光所有命令开始执行直?;

取值将匹配的每一个模式。一旦模式匹配,则执行完匚w模式相应命o后不再l其他模式。如果无一匚w模式Q用星?捕获该|再接受其他输入。模式部分可能包括元字符Q与在命令行文g扩展名例子中使用q的匚w模式cd相同Q即Q?
* L字符?/td>
Q?/td> L单字W?/td>
[..] cL范围中Q意字W?/td>

来看一个简单的case语句Q?/strong>
Shell代码
  1. /home/l/g/tomotoboy >cat caseselect   
  2. #!/bin/sh   
  3. #caseselect   
  4. echo - n "Enter a number from 1 to 5 :"  
  5. read ANS   
  6.  case $ANS in   
  7. 1) echo "you select 1"  
  8. ;;   
  9. 2) echo "you select 2"  
  10. ;;   
  11. 3) echo "you select 3"  
  12. ;;   
  13. 4) echo "you select 4"  
  14. ;;   
  15. 5) echo "you select 5"  
  16. ;;   
  17. *) echo "`basename $0`: This is not between 1 and 5" >&2  
  18. ;;   
  19. esac   
  20.   
  21. /home/l/g/tomotoboy >caseselect   
  22. - n Enter a number from 1 to 5 :   
  23. 4  
  24. you select 4  
  25. /home/l/g/tomotoboy >caseselect   
  26. - n Enter a number from 1 to 5 :   
  27. 7  
  28. caseselect: This is not between 1 and 5  


对匹配模式用|
Shell代码
  1. /home/l/g/tomotoboy >cat caseterm   
  2. #!/bin/sh   
  3. #caseterm   
  4. echo "choices are.. vt100, vt102, vt220"  
  5. echo -n "enter your terminal type :"  
  6. read TERMINAL   
  7.  case $TERMINAL in   
  8.  vt100|vt102) TERM=vt100   
  9.  ;;   
  10.  vt220) TERM=vt220   
  11.  ;;   
  12.  *) echo "`basename $0`: Unknown reponse" >&2  
  13.    echo "setting it to vt100 anyway,so there"  
  14.    TERM=vt100   
  15.  ;;   
  16. esac   
  17. export TERM   
  18. echo "Your terminal is set to $TERM'   
  19. "caseterm" 17 lines, 348 characters   
  20.   
  21. /home/l/g/tomotoboy >caseterm   
  22. choices are.. vt100, vt102, vt220   
  23. -n enter your terminal type :   
  24. vt100   
  25. Your terminal is set to vt100'  

提示键入y或n
case的一个有效用法是提示用户响应以决定是否l进E。这里提C入y以l处理n退出。如果用戯入Y、y或yesQ处理l执行case语句后面部分。如果用戯入N、n或no或其他响应,用户退本?
Shell代码
  1. /home/l/g/tomotoboy >cat caseans   
  2. #!/bin/sh   
  3. #caseans   
  4. echo -n "Do you wish to proceed [y..n]"  
  5. read ANS   
  6.  case $ANS in   
  7.  y|Y|yes|Yes) echo "yes is selected"  
  8.  ;;   
  9.  n|N|no|No) echo "no is selectd"  
  10.  ;;   
  11.  *) echo "`basename $0` : Unknown response" >&2  
  12.  ;;   
  13.  esac   
  14.   
  15. /home/l/g/tomotoboy >caseans   
  16. -n Do you wish to proceed [y..n]   
  17. y   
  18. yes is selected  


case与命令参C?/strong>
Shell代码
  1. /home/l/g/tomotoboy >cat >> caseparam   
  2. #!/bin/sh   
  3. #caseparam   
  4. if [ $# != 1 ];then   
  5.    echo "Usage:`basename $0` [start|stop|help]" >&2  
  6. fi   
  7. OPT=$1  
  8. case $OPT in   
  9.  start) echo "starting..`basename $0`"  
  10. ;;   
  11.  stop) echo "stopping..`basename $0`"  
  12. ;;   
  13.  help) echo "stopping..`basename $0`"  
  14.  echo "Usage:`basename $0` [start|stop|help]"  
  15. ;;   
  16.  *) echo "stopping..`basename $0`"  
  17.  echo "Usage:`basename $0` [start|stop|help]"  
  18. ;;   
  19. esac   
  20. /home/l/g/tomotoboy >chmod u+x caseparam   
  21. /home/l/g/tomotoboy >caseparam help   
  22. stopping..caseparam   
  23. Usage:caseparam [start|stop|help]   
  24. /home/l/g/tomotoboy >caseparam start   
  25. starting..caseparam  


捕获输入q执行空命o
不一定要在匹配模式后加入命oQ如果你原本不想做什么,只是在进一步处理前qo出意外响应,q样做是一U好办法。如果要q行对应于一个会计部门的帐目报表Q必首先在军_q行报表的类型前认用户输入一个有效的部门P匚w所有可能|其他值无效。用case可以很容易实Cq功能。下面的脚本中如果用戯入部门号不是234?53?55?54Q用户退出ƈq回可用信息。一旦响应了用户的有效部门号Q脚本应用同L技术取得报表类型,在case语句末尾昄有效的部门号和报表类型。脚本如下:
Shell代码
  1. #!/bin/sh   
  2. # casevalid   
  3. echo -n "enter the account dept No: "  
  4. read ACC   
  5.  case $ACC in   
  6.       234);;   
  7.       453);;   
  8.       655);;   
  9.       454);;   
  10.          *) echo "basename $01`: Unknon dept No"  
  11.               echo "try..234,453,655,454"  
  12.               exit 1  
  13.               ;;   
  14. esac   
  15. #if we are here, then we have a validdated the dept no   
  16. echo " 1 . post"  
  17. echo " 2 . prior"  
  18. echo -n "enter the type of report: "  
  19. read ACC_TYPE   
  20.    case $ACC_TYPE in   
  21.    1)TYPE=post;;   
  22.    2)TYPE=prior;;   
  23.    *) echo "`basename $0`: Unknown account type." >&2  
  24. "casevalid" 29 lines, 665 characters   
  25. /home/l/g/tomotoboy >casevalid   
  26. -n enter the account dept No:   
  27. 454  
  28.  1 . post   
  29.  2 . prior   
  30. -n enter the type of report:   
  31. 1  
  32. now running report for dept 454 for the type post  


Gavin.lee 2009-11-29 12:05 发表评论
]]>
条g控制QtestQexpr……)http://www.aygfsteel.com/jzone/articles/304086.htmlGavin.leeGavin.leeSun, 29 Nov 2009 04:01:00 GMThttp://www.aygfsteel.com/jzone/articles/304086.html 
试文g状?/strong>
test
test一般有两种格式Q即Q?
test condition
?
[ condition ]
使用ҎhQ要注意在条件两边加上空根{测试文件状态的条g表达式很多,但是最常用的可在下表中查到?
-d 目录 -s 文g长度大于0、非I?/td>
-f 正规文g -w 可写
-L W号q接 -u 文g有suid位设|?/td>
-r 可读 -x 可执?/td>

Shell代码
  1. /home/l/g/tomotoboy >test -d sed.out   
  2. /home/l/g/tomotoboy >echo $?   
  3. 1  
  4.   
  5. /home/l/g/tomotoboy >test -f sed.out   
  6. /home/l/g/tomotoboy >echo $?   
  7. 0  
  8.   
  9. /home/l/g/tomotoboy >[ -f sed.out ]   
  10. /home/l/g/tomotoboy >echo $?   
  11. 0  
  12. /home/l/g/tomotoboy >[ -d sed.out ]   
  13. /home/l/g/tomotoboy >echo $?   
  14. 1  
  15.   
  16. /home/l/g/tomotoboy >[ -x sed.out ]   
  17. /home/l/g/tomotoboy >echo $?   
  18. 1  
  19.   
  20. /home/l/g/tomotoboy >[ -r sed.out ]   
  21. /home/l/g/tomotoboy >echo $?   
  22. 0  
  23.   
  24. /home/l/g/tomotoboy >[ -w sed.out ]   
  25. /home/l/g/tomotoboy >echo $?   
  26. 0  

试时用逻辑操作W?/strong>
试文g状态是否ؓOKQ但是有时要比较两个文g状态。shell提供三种逻辑操作完成此功能?
-a   逻辑与,操作W两边均为真Q结果ؓ真,否则为假?
-o   逻辑或,操作W两边一边ؓ真,l果为真Q否则ؓ假?
! 逻辑否,条g为假Q结果ؓ真?
下面比较两个文gsed.out、sed.txtQ?
Shell代码
  1. /home/l/g/tomotoboy >ls -al sed.out sed.txt   
  2. -rw-r--r--   1 tomotoboy member       159 Jul 30 16:47 sed.out   
  3. -rw-r--r--   1 tomotoboy member       655 Jul 31 14:44 sed.txt   
  4. /home/l/g/tomotoboy >[ -w sed.out -a -w sed.txt ]   
  5. /home/l/g/tomotoboy >echo $?   
  6. 0  
  7.   
  8. /home/l/g/tomotoboy >[ -x sed.out -a -r sed.txt]   
  9. -bash: [: missing `]'   
  10. /home/l/g/tomotoboy >[ -x sed.out -a -r sed.txt ]   
  11. /home/l/g/tomotoboy >echo $?   
  12. 1  
  13.   
  14. /home/l/g/tomotoboy >[ -x sed.out -o -r sed.txt ]   
  15. /home/l/g/tomotoboy >echo $?   
  16. 0  

字符串测?/strong>
字符串测试是错误捕获很重要的一部分Q特别在试用户输入或比较变量时ؓ重要。字W串试?U格式:
test "string"
test string_operator "string"
test "string" string_operator "string"
[ string_operator "string" ]
[ "string" string_operator "string" ]
q里Qstring_operator可ؓQ?
=     两个字符串相{?/td>
!=    两个字符串不{?/td>
-z    IZ?/td>
-n    非空丌Ӏ?/td>

Shell代码
  1. /home/l/g/tomotoboy >[ -z $HELLO ]   
  2. /home/l/g/tomotoboy >echo $?   
  3. 0  
  4.   
  5. /home/l/g/tomotoboy >HELLO="hello"  
  6. /home/l/g/tomotoboy >[ -z $HELLO ]   
  7. /home/l/g/tomotoboy >echo $?   
  8. 1  
  9.   
  10. /home/l/g/tomotoboy >[ -n $HELLO ]   
  11. /home/l/g/tomotoboy >echo $?   
  12. 0  
  13.   
  14. /home/l/g/tomotoboy >[ !-n $HELLO ]   
  15. [ nohup -p 1 $HELLO ]   
  16. -bash: [: too many arguments   
  17. /home/l/g/tomotoboy >[ ![ -n $HELLO ] ]   
  18. [ [ -z $HELLO ] -n $HELLO ] ]   
  19. -bash: [: too many arguments   
  20. /home/l/g/tomotoboy >HI="hi"  
  21. /home/l/g/tomotoboy >[ $HELLO = $HI]   
  22. -bash: [: missing `]'   
  23. /home/l/g/tomotoboy >[ $HELLO = $HI ]   
  24. /home/l/g/tomotoboy >echo $?   
  25. 1  
  26.   
  27. /home/l/g/tomotoboy >[ $HELLO != $HI ]   
  28. /home/l/g/tomotoboy >echo $?   
  29. 0  

试数?/strong>
试数值可以用许多操作符Q一般格式如下:
"number" numeric_operator "number"
或?
[ "number" numeric_operator "number" ]
numeric_operator可ؓQ?
-eq   数值相{?/td>
-ne   数g相等?/td>
-gt   W一个数大于W二个数?/td>
-lt   W一个数于W二个数?/td>
-le   W一个数于{于W二个数?/td>
-ge   W一个数大于{于W二个数?/td>

Shell代码
  1. /home/l/g/tomotoboy >Nbr=10  
  2. /home/l/g/tomotoboy >Nbr1=20  
  3. /home/l/g/tomotoboy >echo $?   
  4. 0  
  5.   
  6. /home/l/g/tomotoboy >Nbr -ne Nbr1   
  7. -bash: Nbr: command not found   
  8. /home/l/g/tomotoboy >$Nbr -ne $Nbr1   
  9. -bash: 10: command not found   
  10. /home/l/g/tomotoboy >[ "$Nbr" -ne "$Nbr1" ]   
  11. /home/l/g/tomotoboy >echo $?   
  12. 0  
  13.   
  14. /home/l/g/tomotoboy >[ "$Nbr" -e "$Nbr1" ]   
  15. -bash: [: -e: binary operator expected   
  16. /home/l/g/tomotoboy >[ "$Nbr" -eq "$Nbr1" ]   
  17. /home/l/g/tomotoboy >echo $?   
  18. 1  
  19. /home/l/g/tomotoboy >[ "$Nbr" -gt "$Nbr1" ]   
  20. /home/l/g/tomotoboy >echo 4?   
  21. 4?   
  22. /home/l/g/tomotoboy >echo $?   
  23. 0  
  24.   
  25. /home/l/g/tomotoboy >[ "$Nbr" -gt "$Nbr1" ]   
  26. /home/l/g/tomotoboy >echo $?   
  27. 1  
  28.   
  29. /home/l/g/tomotoboy >[ "$Nbr" -lt "$Nbr1" ]   
  30. /home/l/g/tomotoboy >echo $?   
  31. 0  

可以不必整数值放入变量,直接用数字比较即可,但要加引受?
Shell代码
  1. /home/l/g/tomotoboy >[ "99" -ge "60" ]   
  2. /home/l/g/tomotoboy >echo $?   
  3. 0  


expr用法
expr命o一般用于整数|但也可用于字W串。一般格式ؓQ?
expr argument operator argument
expr也是一个手工命令行计数器?
Shell代码
  1. /home/l/g/tomotoboy >expr 10 + 10  
  2. 20  
  3.   
  4. /home/l/g/tomotoboy >expr 45 / 4  
  5. 11  

使用乘号Ӟ必须用反斜线屏蔽其特定含义。因为shell可能会误解显C星L意义
Shell代码
  1. /home/l/g/tomotoboy >expr 30 \* 100  
  2. 3000  

增量计数expr在@环中用于增量计算。首先,循环初始化ؓ 0Q然后@环值加1Q反引号的用法意x代命令。最基本的一U是从(exprQ命令接受输出ƈ之攑օ循环变量
Shell代码
  1. /home/l/g/tomotoboy >loop=0  
  2. /home/l/g/tomotoboy >loop=`expr $loop + 1`   
  3. /home/l/g/tomotoboy >echo   
  4.   
  5. /home/l/g/tomotoboy >echo $?   
  6. 0  
  7. /home/l/g/tomotoboy >echo $loop   
  8. 1  
数值测?/strong>
可以用expr试一个数。如果试图计非整数Q将q回错误?
/
Shell代码
  1. home/l/g/tomotoboy >f=1.1  
  2. /home/l/g/tomotoboy >expr f + 10  
  3. expr: non-numeric argument   
  4. /home/l/g/tomotoboy >echo $?   
  5. 2  
  6.   
  7. /home/l/g/tomotoboy >expr $HELLO + 10  
  8. expr: non-numeric argument   
  9. /home/l/g/tomotoboy >echo $?   
  10. 2  
  11.   
  12. /home/l/g/tomotoboy >expr "$HELLO"  + 10  
  13. expr: non-numeric argument   
  14. /home/l/g/tomotoboy >echo $?   
  15. 2  
  16.   
  17. /home/l/g/tomotoboy >expr $f + 10  
  18. expr: non-numeric argument  

expr也可以返回其本n的退出状态,不幸的是q回gpȝ最后退出命令刚好相反,成功q回1QQ何其他gؓ无效或错误。下面的例子试两个字符串是否相{,q里字符串ؓ“hello”?#8220;hello” ?

Shell代码
  1. /home/l/g/tomotoboy >expr $HELLO = "hello"  
  2. 1  
  3. /home/l/g/tomotoboy >echo $?   
  4. 0  

模式匚w
expr也有模式匚w功能。可以用expr通过指定冒号选项计算字符串中字符数?*意即M字符重复0ơ或多次.
Shell代码
  1. /home/l/g/tomotoboy >cat sed.txt   
  2. 605408211   pts/16       Jul 31 13:54   (218.0.1.42)   
  3. caodejun   pts/44       Jul 31 14:16    (219.148.133.31)   
  4. duke1988   pts/45       Jul 31 14:41    (218.104.163.66)   
  5. liuzk423   pts/6        Jul 20 08:27    (219.245.104.240)   
  6. nefu_luyanshen   pts/23       Jul 31 14:33      (218.25.6.142)   
  7. nefu_luyanshen   pts/48       Jul 31 12:59      (218.25.6.142)   
  8. shuzigui   pts/21       Jul 31 12:11    (121.35.248.193)   
  9. tomotoboy   pts/41       Jul 31 13:31   (219.221.99.155)   
  10. waterlooz   pts/25       Jul 31 08:48   (121.0.29.225)   
  11. wsoangel   pts/35       Jul 31 13:40    (116.233.219.10)   
  12. xp55699312   pts/42       Jul 31 14:12  (61.152.132.103)   
  13. zyy0904    pts/43       Jul 31 13:53    (125.33.195.36)   
  14.   
  15. /home/l/g/tomotoboy >VALUE=sed.txt   
  16. /home/l/g/tomotoboy >expr $VALUE : tomotoboy , '.*'  
  17. expr: syntax error   
  18. /home/l/g/tomotoboy >expr $VALUE : tomotoboy   
  19. 0  
  20.   
  21. /home/l/g/tomotoboy >   
  22. /home/l/g/tomotoboy >expr $VALUE:tomotoboy   
  23. sed.txt:tomotoboy   
  24. /home/l/g/tomotoboy >expr $VALUE: tomotoboy   
  25. expr: syntax error   
  26. /home/l/g/tomotoboy >expr $VALUE : tomotoboy   
  27. 0  
  28. /home/l/g/tomotoboy >expr $VALUE :tomotoboy   
  29. expr: syntax error   
  30. /home/l/g/tomotoboy >expr $VALUE : tomotoboy   
  31. 0  
  32. /home/l/g/tomotoboy >expr $VALUE : tomotoboy, '.*'  
  33. expr: syntax error   
  34. /home/l/g/tomotoboy >expr $VALUE : tomotoboy , '.*'  
  35. expr: syntax error   
  36.   
  37. /home/l/g/tomotoboy >expr $VALUE :  '.*'  
  38. 7  
  39.   
  40. /home/l/g/tomotoboy >expr $VALUE : tomotoboy   
  41. 0  
  42.   
  43. /home/l/g/tomotoboy >expr $VALUE : "tomotoboy"  
  44. 0  
  45.   
  46. /home/l/g/tomotoboy >expr $VALUE : "nefu_luyanshen"  
  47. 0  
q里没有搞懂Qtomotoboy和nefu_luyanshenQ明明存在而结果是0


Gavin.lee 2009-11-29 12:01 发表评论
]]>
shell变量及环境变?/title><link>http://www.aygfsteel.com/jzone/articles/304084.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sun, 29 Nov 2009 04:00:00 GMT</pubDate><guid>http://www.aygfsteel.com/jzone/articles/304084.html</guid><description><![CDATA[<h3 class="type_original" title="原创"><a ></a> </h3> <div id="wmqeeuq" class="blog_content"><strong>本地变量</strong> <br /> 昄变量 <br /> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> </div> <ol class="dp-default"> <li><span><span>$GREAT_PICTURE =</span><span id="wmqeeuq" class="string">"die hard"</span><span>  </span></span></li> <li><span>$echo ${GREAT_PICTURE}   </span></li> <li><span>die hard   </span></li> <li><span>  </span></li> <li><span>$DOLLAR=</span><span id="wmqeeuq" class="number">99</span><span>  </span></span></li> <li><span>$echo ${DOLLAR}   </span></li> <li><span id="wmqeeuq" class="number">99</span><span>  </span></span></li> <li><span>  </span></li> <li><span>$LAST_FILE=ZLPSO.txt   </span></li> <li><span>$echo ${LAST_FILE}   </span></li> <li><span>ZLPSO.txt  </span></li> </ol> </div> <pre class="shell" style="display: none" name="code">$GREAT_PICTURE ="die hard" $echo ${GREAT_PICTURE} die hard $DOLLAR=99 $echo ${DOLLAR} 99 $LAST_FILE=ZLPSO.txt $echo ${LAST_FILE} ZLPSO.txt</pre> <br /> 清除变量 <br /> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> </div> <ol class="dp-default"> <li><span><span>unset variable-name   </span></span></li> <li><span>$PC=enterprise   </span></li> <li><span>$echo ${PC}   </span></li> <li><span>enterprise   </span></li> <li><span>$unset PC   </span></li> <li><span>$echp ${PC}   </span></li> <li><span>$  </span></li> </ol> </div> <pre class="shell" style="display: none" name="code">unset variable-name $PC=enterprise $echo ${PC} enterprise $unset PC $echp ${PC} $</pre> <br /> 昄所有本地shell变量 <br /> 使用set命o昄所有本地定义的shell变量 <br /> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> </div> <ol class="dp-default"> <li><span><span>$set  </span></span></li> </ol> </div> <pre class="shell" style="display: none" name="code">$set</pre> <br /> <br /> l合变量?<br /> 变量ƈ排可以变量l合在一?<br /> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> </div> <ol class="dp-default"> <li><span><span>echo ${variable-name}${variable-name}   </span></span></li> <li><span>  </span></li> <li><span>$FIRST=</span><span id="wmqeeuq" class="string">"Bruce"</span><span>  </span></span></li> <li><span>$SURNAME=Willis   </span></li> <li><span>$echo ${FIRST}${SURNAME}   </span></li> <li><span>Bruce Willis  </span></li> </ol> </div> <pre class="shell" style="display: none" name="code">echo ${variable-name}${variable-name} $FIRST="Bruce" $SURNAME=Willis $echo ${FIRST}${SURNAME} Bruce Willis</pre> <br /> 试变量是否已经讄 <br /> 有时要测试是否已讄或初始化变量。如果未讄或初始化Q就可以使用另一倹{此?<br /> 令格式ؓQ?<br /> ${variable:-value} <br /> <br /> <strong>环境变量</strong> <br /> <br /> 嵌入shell变量 <br /> Brourne shell有一些预留的环境变量名,q些变量名不能用作其他用途。通常?etc/profile中徏立这些嵌入的环境变量Q但也不完全是,q取决于用户自己。以下是嵌入 shell变量列表?<br /> <br /> 讄环境变量 <br /> VARIABLE-NAME= valueQexport VARIABLE-NAME <br /> 在两个命令之间是一个分P也可以这样写Q?<br /> VARIABLE-NAME= value <br /> Export VARIABLE-NAME <br /> <br /> 昄和清除环境变量与本地变量一?<br /> <br /> set命o <br /> ?HOME.profile文g中设|环境变量时Q还有另一U方法导些变量。用set命o- a选项Q即set -a指明所有变量直接被导出。不要在/etc/profile中用这U方法,最好只在自q$HOME.profile文g中?<br /> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"> <div id="wmqeeuq" class="tools">Shell代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" ></a></div> </div> <ol class="dp-default"> <li><span><span>$pg .profile   </span></span></li> <li><span># .profile   </span></li> <li><span>MAIL=/usr/mail/${LOGNAME:?}   </span></li> <li><span>PS1=</span><span id="wmqeeuq" class="string">"`hostname`>"</span><span>  </span></span></li> </ol> </div> <pre class="shell" style="display: none" name="code">$pg .profile # .profile MAIL=/usr/mail/${LOGNAME:?} PS1="`hostname`>"</pre> <br /> <strong>位置变量参数</strong> <br /> 在脚本中位置参数 <br /> <table class="bbcode"> <tbody> <tr> <td>$0 </td> <td>$1 </td> <td>&2 </td> <td>$3 </td> <td>$4 </td> <td>$5 </td> <td>$6 </td> <td>$6 </td> <td>$7 </td> <td>$8 </td> <td>$9 </td> <td>${10} </td> <td>${11}</td> <td>……</td> </tr> <tr> <td>脚本文g?</td> <td>W一个参?</td> <td>W二个参?</td> <td>……</td> <td>  </td> <td>  </td> <td>  </td> <td>  </td> <td>  </td> <td>  </td> <td></td> <td></td> <td></td> </tr> </tbody> </table> <br /> <br /> 特定变量函数 <br /> <table class="bbcode"> <tbody> <tr> <td>$#</td> <td>传递到脚本的参C?/td> </tr> <tr> <td>$*</td> <td>以一个单字符串显C所有向脚本传递的参数。与位置变量不同Q此选项参数可超q?9?/td> </tr> <tr> <td>$$</td> <td>脚本q行的当前进EID?/td> </tr> <tr> <td>$!</td> <td>后台q行的最后一个进E的q程ID?/td> </tr> <tr> <td>$@</td> <td>?#相同Q但是用时加引Pq在引号中返回每个参?/td> </tr> <tr> <td>$-</td> <td>昄shell使用的当前选项Q与set命o功能相同</td> </tr> <tr> <td>$?</td> <td>昄最后命令的退出状态?表示没有错误Q其他Q何D明有错误?/td> </tr> </tbody> </table> </div> <img src ="http://www.aygfsteel.com/jzone/aggbug/304084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jzone/" target="_blank">Gavin.lee</a> 2009-11-29 12:00 <a href="http://www.aygfsteel.com/jzone/articles/304084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>登陆环境http://www.aygfsteel.com/jzone/articles/304083.htmlGavin.leeGavin.leeSun, 29 Nov 2009 03:59:00 GMThttp://www.aygfsteel.com/jzone/articles/304083.html 它保存着用户名、加密后的密码等信息Q我们登录系l所有信息都要在里面查找
Shell代码
  1. -bash-3.00$ cat /etc/passwd | tr ":" "\t" | sort -k0   
  2. adm     x       4       4       Admin   /var/adm   
  3. bin     x       2       2               /usr/bin   
  4. daemon  x       1       1               /   
  5. gdm     x       50      50      GDM Reserved UID        /   
  6. jiang   x       100     1               /       /bin/sh   
  7. listen  x       37      4       Network Admin   /usr/net/nls   
  8. lp      x       71      8       Line Printer Admin      /usr/spool/lp   
  9. noaccess        x       60002   60002   No Access User  /   
  10. nobody  x       60001   60001   NFS Anonymous Access User       /   
  11. nobody4 x       65534   65534   SunOS 4.x NFS Anonymous Access User     /   
  12. nuucp   x       9       9       uucp Admin      /var/spool/uucppublic      
  13.   
  14. /usr/lib/uucp/uucico   
  15. root    x       0       0       Super-User      /       /bin/bash   
  16. smmsp   x       25      25      SendMail Message Submission Program     /   
  17. sys     x       3       3               /   
  18. ttaserv x       101     100             /       /bin/sh   
  19. ttasys  x       102     100             /       /bin/sh   
  20. uucp    x       5       5       uucp Admin      /usr/lib/uucp   
  21. webservd        x       80      80      WebServer Reserved UID  /   
  22. www     x       81      81      WebServer User  /   
  23. -bash-3.00$ cat /etc/passwd | sed -n  '/jiang/'p   
  24. jiang:x:100:1::/:/bin/sh   
  25. -bash-3.00$ cat /etc/passwd | sed -n  '/jiang/'p | tr ':' '\t'  
  26. jiang   x       100     1               /       /bin/sh  


用户d时自动读?etc/profile 此文件包含:
  • 全局或局部环境变量?
  • PATH信息
  • l端讄
  • 安全命o
  • 日期信息或放弃操作信?

让我们来看一个详l的profile
Shell代码
  1. -bash-3.00$ cat /etc/profile   
  2. #ident  "@(#)profile    1.19    01/03/13 SMI"   /* SVr4.0 1.3   */   
  3.   
  4. # The profile that all logins get before using their own .profile.   
  5.   
  6. trap ""  2 3 #忽略两个信号Q即使用QUIT退出或<Ctrl-c>键停止文件执?  
  7.   
  8.   
  9. ulimit -d 100000 #限制内存溢出Q设|数据段的最大|单位kbytes   
  10. export LOGNAME PATH #导出LOGNAME ?nbsp;PATH   
  11. export LANG=C #讄语言环境   
  12. if [ "$TERM" = "" ] #讄l端cd   
  13. then   
  14.         if /bin/i386   
  15.         then   
  16.                 TERM=sun-color   
  17.         else   
  18.                 TERM=sun   
  19.         fi   
  20.         export TERM   
  21. fi   
  22.   
  23. #       Login and -su shells get /etc/profile services.   
  24. #       -rsh is given its environment in its .profile.   
  25.   
  26. case "$0" in   
  27.   
  28. -sh | -ksh | -jsh | -bash)   
  29.   
  30.         if [ ! -f .hushlogin ]   
  31.         then   
  32.                 /usr/sbin/quota   
  33.                 #       Allow the user to break the Message-Of-The-Day only.   
  34.                 trap "trap '' 2"  2  
  35.                 /bin/cat -s /etc/motd   
  36.                 trap "" 2  
  37.   
  38.                 /bin/mail -E   
  39.                 case $? in #建立邮g信息Q当有新邮g到达时显C提CZ息)   
  40.                 0)   
  41.                         echo "You have new mail."  
  42.                         ;;   
  43.                 2)   
  44.                         echo "You have mail."  
  45.                         ;;   
  46.                 esac   
  47.         fi   
  48. esac   
  49.   
  50. umask 022 #讄umask|使文件创建时带有一定的~省权限位集   
  51. trap  2 3 #重新讄捕捉信号<Ctrl-C>和QUITQ即恢复信号量的默认操作   
  52.   
  53. # add by jianghua   
  54.   
  55. export   
  56. PATH=$PATH:/usr/local/bin:/usr/local/mysql/bin:/opt/SunStudio_11/SUNWspro/bin:/usr/ccs/bin:   
  57.   
  58. /usr/sfw/bin:.   
  59. export HISTSIZE=1000  
  60. export HISTFILESIZE=1000  
  61. #   
  62. # Show Unix-Center.Net Welcome Message in Chinese   
  63. #   
  64. show_welcome_message  


用户?HOME.profile
下面昄如何在命令提C符中设|主机名Q?
Shell代码
  1. -bash-3.00$ PS1='$PWD >'  
  2. /home/l/g/tomotoboy >export PS1  


stty用于讄l端Ҏ。要查询现在的stty选项Q用stty -a
Shell代码
  1. /home/l/g/tomotoboy >stty -a   
  2. speed 9600 baud;   
  3. rows = 25; columns = 82; ypixels = 0; xpixels = 0;   
  4. csdata ?   
  5. eucw 1:0:0:0, scrw 1:0:0:0  
  6. intr = ^c; quit = ^\; erase = ^?; kill = ^u;   
  7. eof = ^d; eol = <undef>; eol2 = <undef>; swtch = <undef>;   
  8. start = ^q; stop = ^s; susp = ^z; dsusp = ^y;   
  9. rprnt = ^r; flush = ^o; werase = ^w; lnext = ^v;   
  10. -parenb -parodd cs8 -cstopb -hupcl cread -clocal -loblk -crtscts -crtsxoff -parext   
  11.   
  12. -ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl -iuclc   
  13. ixon -ixany -ixoff imaxbel   
  14. isig icanon -xcase echo echoe echok -echonl -noflsh   
  15. -tostop echoctl -echoprt echoke -defecho -flusho -pendin iexten   
  16. opost -olcuc onlcr -ocrnl -onocr -onlret -ofill -ofdel tab3  


创徏.logout文g
Shell代码
  1. trap "$HOME /.logout " 0  
  2.   
  3. /home/l/g/tomotoboy >cat .logout   
  4. rm -f $HOME/*.txt   
  5. rm -f $HOME/*.tmp   
  6. rm -f $HOME/x*   
  7. echo "Bye...bye $LOGNAME"  


Gavin.lee 2009-11-29 11:59 发表评论
]]>
shell合ƈ和分?/title><link>http://www.aygfsteel.com/jzone/articles/304080.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sun, 29 Nov 2009 03:57:00 GMT</pubDate><guid>http://www.aygfsteel.com/jzone/articles/304080.html</guid><description><![CDATA[<h3 class="type_original" title="原创"><a ></a> </h3> <div id="wmqeeuq" class="blog_content">• 实用的分c(sortQ操作?<br /> sort命o的一般格式ؓQ?<br /> sort -cmu -o output_file [other options] +pos1 +pos2 input_files <br /> 下面要介l一下s o r t的参敎ͼ <br /> -c 试文g是否已经分类?<br /> -m 合ƈ两个分类文g?<br /> -u 删除所有复制行?<br /> -o 存储s o r tl果的输出文件名?<br /> 其他选项有: <br /> -b 使用域进行分cLQ忽略第一个空根{?<br /> -n 指定分类是域上的数字分类?<br /> -t 域分隔符Q用非空格或t a b键分隔域?<br /> -r 对分cL序或比较求逆?<br /> +n n为域受用此域号开始分cR?<br /> n n为域受在分类比较时忽略此域,一般与+ n一起用?<br /> post1  传递到mQn。m为域Pn为开始分cdW数Q例?Q?意即以第5域分c,从第7 <br /> 个字W开始?<br /> 举例Q?<br /> 按第一个域分类 <br /> -bash-3.00$ sort -k0 sed.txt <br /> 打印分类后的最后第一?<br /> -bash-3.00$ sort -k0 sed.txt | tail -1 <br /> 打印分类后的W一?<br /> -bash-3.00$ sort -k0 sed.txt | head -1 <br /> awk使用sort输出l果 <br /> -bash-3.00$ sort -k0 sed.txt | head -1 | awk '{if($1=="caodejun")print $1}' <br /> 两个分cL件合q?<br /> -bash-3.00$ sort -m  sed.txt sort.txt <br /> 文件合q前Q它们必d被分cR合q文件可用于事务处理和Q何种cȝ修改操作?<br /> 下面q个例子Q因为忘了把两个家电名称加入文gQ它们被攑֜一个单独的文g里,现在?<br /> 之ƈ入一个文件。分cȝ合ƈ格式?#8216;sort -m sorted_file1 sorted_file2’?<br /> <br /> 删除重复?<br /> -bash-3.00$ sort -u sed.txt <br /> <br /> <br /> • uniq <br /> uniq用来从一个文本文件中去除或禁止重复行。一般uniq假定文g已分c,q且l果正确。我们ƈ不强制要求这样做Q如果愿意,可以使用M非排序文本,甚至是无规律行?<br /> -bash-3.00$ who | awk '{print $1} ' |uniq <br /> liuzk423 <br /> 605408211 <br /> shuzigui <br /> nefu_luyanshen <br /> waterlooz <br /> wsoangel <br /> tomotoboy <br /> xp55699312 <br /> zyy0904 <br /> caodejun <br /> duke1988 <br /> 605408211 <br /> nefu_luyanshen <br /> zyy0904 <br /> lonelysand <br /> <br /> <br /> 昄不唯一的行 <br /> -bash-3.00$ who | awk '{print $1} ' |uniq -d <br /> <br /> -c打印每一重复行出现次数?<br /> -bash-3.00$ who | awk '{print $1} ' |uniq -c <br />    1 liuzk423 <br />    1 605408211 <br />    1 shuzigui <br />    1 nefu_luyanshen <br />    1 waterlooz <br />    1 wsoangel <br />    1 tomotoboy <br />    1 xp55699312 <br />    1 zyy0904 <br />    1 caodejun <br />    1 duke1988 <br />    1 605408211 <br />    1 nefu_luyanshen <br />    1 zyy0904 <br />    1 lonelysand <br /> <span style="color: red">q里没有搞懂nefu_luyanshen明明重复Q却昄重复行数目ؓ1</span> <br /> <br /> 对特定域q行试Q?n只测试一行一部分的唯一性?<br /> -bash-3.00$ who | awk '{print $1} ' |uniq -n2 <br /> liuzk423 <br /> <br /> <br /> • join <br /> 两个已l分好类的文件连接在一起哈。一些系l要求用join时文件域要少?0Qؓ公^赯Q如果域大于20Q应使用DBMSpȝQ其一般格式如下: <br /> join [options] in_file1 in_file2 <br /> <br /> -bash-3.00$ cat sed.txt <br /> 605408211   pts/16       Jul 31 13:54   (218.0.1.42) <br /> caodejun   pts/44       Jul 31 14:16    (219.148.133.31) <br /> duke1988   pts/45       Jul 31 14:41    (218.104.163.66) <br /> liuzk423   pts/6        Jul 20 08:27    (219.245.104.240) <br /> nefu_luyanshen   pts/23       Jul 31 14:33      (218.25.6.142) <br /> nefu_luyanshen   pts/48       Jul 31 12:59      (218.25.6.142) <br /> shuzigui   pts/21       Jul 31 12:11    (121.35.248.193) <br /> tomotoboy   pts/41       Jul 31 13:31   (219.221.99.155) <br /> waterlooz   pts/25       Jul 31 08:48   (121.0.29.225) <br /> wsoangel   pts/35       Jul 31 13:40    (116.233.219.10) <br /> xp55699312   pts/42       Jul 31 14:12  (61.152.132.103) <br /> zyy0904    pts/43       Jul 31 13:53    (125.33.195.36) <br /> -bash-3.00$ cat sort.txt <br /> 605408211   pts/16       Jul 31 13:54   (218.0.1.42) <br /> caodejun   pts/44       Jul 31 14:16    (219.148.133.31) <br /> duke1988   pts/45       Jul 31 14:41    (218.104.163.66) <br /> -bash-3.00$ join sed.txt sort.txt <br /> 605408211 pts/16 Jul 31 13:54 (218.0.1.42) pts/16 Jul 31 13:54 (218.0.1.42) <br /> caodejun pts/44 Jul 31 14:16 (219.148.133.31) pts/44 Jul 31 14:16 (219.148.133.31) <br /> duke1988 pts/45 Jul 31 14:41 (218.104.163.66) pts/45 Jul 31 14:41 (218.104.163.66) <br /> <br /> 选择匚w <br /> -bash-3.00$ join -a1 -a2  sed.txt sort.txt <br /> 605408211 pts/16 Jul 31 13:54 (218.0.1.42) pts/16 Jul 31 13:54 (218.0.1.42) <br /> caodejun pts/44 Jul 31 14:16 (219.148.133.31) pts/44 Jul 31 14:16 (219.148.133.31) <br /> duke1988 pts/45 Jul 31 14:41 (218.104.163.66) pts/45 Jul 31 14:41 (218.104.163.66) <br /> liuzk423 pts/6 Jul 20 08:27 (219.245.104.240) <br /> nefu_luyanshen pts/23 Jul 31 14:33 (218.25.6.142) <br /> nefu_luyanshen pts/48 Jul 31 12:59 (218.25.6.142) <br /> shuzigui pts/21 Jul 31 12:11 (121.35.248.193) <br /> tomotoboy pts/41 Jul 31 13:31 (219.221.99.155) <br /> waterlooz pts/25 Jul 31 08:48 (121.0.29.225) <br /> wsoangel pts/35 Jul 31 13:40 (116.233.219.10) <br /> xp55699312 pts/42 Jul 31 14:12 (61.152.132.103) <br /> zyy0904 pts/43 Jul 31 13:53 (125.33.195.36) <br /> -bash-3.00$ join -o 1.1 2.2  sed.txt sort.txt <br /> 605408211 pts/16 <br /> caodejun pts/44 <br /> duke1988 pts/45 <br /> -bash-3.00$ join -o 1.1 2.2  2.3 sed.txt sort.txt <br /> 605408211 pts/16 Jul <br /> caodejun pts/44 Jul <br /> duke1988 pts/45 Jul <br /> <br /> <br /> • cut <br /> cut用来从标准输入或文本文g中剪切列或域。剪切文本可以将之粘贴到一个文本文件?<br /> 下一节将介绍_脓用法?<br /> cut一般格式ؓQ?<br /> cut [options] file1 file2 <br /> 下面介绍其可用选项Q?<br /> -c list  指定剪切字符数?<br /> -f field  指定剪切域数?<br /> -d   指定与空格和t a b键不同的域分隔符?<br /> - c用来指定剪切范围Q如下所C: <br /> - c 1Q?-7  剪切W?个字W,然后是第5到第7个字W?<br /> -c1-50  剪切? 0个字W?<br /> -f 格式? c相同?<br /> -f 1Q?  剪切 W?域,W?域?<br /> - f 1Q?0-12  剪切W?域,W? 0域到W? 2域?<br /> <br /> -bash-3.00$ ps -ef | cut -c1-8 <br /> -bash-3.00$ ps -ef | cut -d: -f1 <br /> -bash-3.00$ ps -ef | cut -d: -f1Q? <br /> <br /> <br /> • paste <br /> cut用来从文本文件或标准输出中抽取数据列或者域Q然后再?paste可以这些数据粘?<br /> h形成相关文g。粘贴两个不同来源的数据Ӟ首先需其分类Qƈ保两个文g行数?<br /> 同?<br /> paste按行将不同文g行信息放在一行。缺省情况下Q?pasteq接Ӟ用空格或tab键分?<br /> 新行中不同文本,除非指定- d选项Q它成为域分隔W。paste格式为: <br /> paste -d -s -file1 file2 <br /> 选项含义如下Q?<br /> -d   指定不同于空格或t a b键的域分隔符。例如用@分隔域,使用- d @?<br /> -s   每个文件合q成行而不是按行粘贴?<br />             - 使用标准输入。例如ls -l |paste Q意卛_在一列上昄输出?<br /> <br /> <br /> • split <br /> split用来大文g分割成小文g。有时文件越来越大,传送这些文件时Q首先将其分割可 <br /> 能更Ҏ。用v i或其他工兯如sortӞ如果文g对于工作~冲区太大,也会存在一些问题?<br /> 因此有时没有选择余地Q必d文g分割成小的碎片?<br /> split命o一般格式: <br /> split -output_file-size input-filename output-filename <br /> q里output_file-size 指的是文本文件被分割的行数?<br /> -bash-3.00$ ps -ef |split -10 <br /> -bash-3.00$ ls <br /> <table class="bbcode"> <tbody> <tr> <td>a.out            greeting.sh      main.c           sort.txt         xac              xai              xao <tr> <td> <tr> <td>append.sed       grepgrepstrings  nohup.out        test             xad              xaj              xap <tr> <td> <tr> <td>change.sed       grepstr          readme.sh        test.sh          xae              xak              xaq <tr> <td> <tr> <td>core.log         hello            seawolf          user.online      xaf              xal              xar <tr> <td> <tr> <td>factorial        hello.cpp        sed.out          xaa              xag              xam <tr> <td> <tr> <td>factorial.c      main             sed.txt          xab              xah              xan</td> </tr> </tbody> </table> </div> <img src ="http://www.aygfsteel.com/jzone/aggbug/304080.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jzone/" target="_blank">Gavin.lee</a> 2009-11-29 11:57 <a href="http://www.aygfsteel.com/jzone/articles/304080.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">ij</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>