当前位置:文档之家› Shell脚本例子集合

Shell脚本例子集合

# vi xx.sh退出并保存# chmod +x xx.sh# ./xx.sh-2.调试脚本的方法# bash -x xx.sh就可以调试了.-1.配置secureCRT的设置(我用的是6.2.3 build313版本,汉化版)选项->会话选项(S)...->终端->仿真->终端(T)->把VT100改成Xterm->点中ANSI颜色(A)和使用颜色方案(U)复选框.这样就有颜色显示了.选项->会话选项(S)...->终端->外观->字符编码(H)->从Default变到UTF-8.这样就有中文显示了.1.写一个脚本,执行后,打印一行提示"Please input anumber:",要求用户输入数值,然后打印出该数值,然后再次要求用户输入数值.直到用户输入"end"停止. # vi show_var.sh脚本内容:#!/bin/bashunset varwhile [ "$var" != "end" ]doecho -n "please input a number: "read varif [ "$var" = "end" ]thenbreakfiecho "var is $var"done命令保存后退出,并执行:# chmod +x show_var.sh# ./show_var.shplease input a number: 1var is 1please input a number: svar is splease input a number: end#2.写一个脚本,测试位置参数# vi param.sh脚本内容:#!/bin/bash#test shellecho $0echo $1echo $2echo $?echo $*echo $#命令保存后退出,并执行:# chmod +x param.sh# ./param.sh yema Bhanv edu network./param.sh //程序名称Yema //第一个参数Bhanv //第二个参数0 //程序执行结果yema Bhanv edu network //传递参数所组成的字符串4 //参数个数3.写一个脚本,可以根据参数文件名,以正确的参数调用tar来解压缩tar.gz或tar.bz2文件. # vi tar_gz_bz2.sh脚本内容:#!/bin/shcase ${1##*.tar.} inbz2)tar jxvf $1;;gz)tar zxvf $1;;*)echo "wrong file type"esac命令保存后退出,并执行:# chmod +x tar_gz_bz2.sh# ./tar_gz_bz2.sh# touch "helloA" > a.txt //写一个测试用的文件# tar czvf a.tar.gz a.txt //把a.txt压缩成tar.gz文件# rm -rf a.txt //删除a.txt来测试脚本# ls a.*a.tar.gz# ./tar_gz_bz2.sh a.tar.gz# ls a.*a.tar.gz a.txt //验证了正确性# touch "helloB" > b.txt //写一个测试用的文件# tar cjvf b.tar.bz2 b.txt //把b.txt压缩成tar.bz2文件# rm -rf b.txt //删除b.txt来测试脚本# ls b.*b.tar.bz2# ./tar_gz_bz2.sh b.tar.bz2# ls b.*b.tar.bz2 b.txt //验证了正确性# rm -rf a.txt a.tar.gz //删除测试用的文件# rm -rf b.txt b.tar.bz2 //删除测试用的文件4.小棍子显示# vi showstick.sh#!/bin/bashi=0while [ $i -lt 10 ]dofor j in '-' '\\' '|' '/'doecho -ne "\033[1D$j"usleep 50000done((i++))done保存# chmod +x showstick.sh# ./showstick.sh看效果.5.显示类似wget 的进度# vi showwget.sh#!/bin/bashi=0while [ $i -lt 10 ]dofor j in '-' '\\' '|' '/'doecho -ne "\033[1D$j"usleep 50000done((i++))done保存# chmod +x showwget.sh# ./showwget.sh看效果.6.定义loop的变量1 2 3 4 5是变量列表# vi forlist.sh#!/bin/bash#for with listfor loop in 1 2 3 4 5doecho ${loop}done保存# chmod +x forlist.sh# ./forlist.sh看效果.7.读取文件中的每串字符,去掉了回车或者空格,输出每行就显示一个字符串. 编写文件var.txt# vi var.txt1 223456保存# vi listfile.sh#!/bin/bashfor loop in `cat var.txt`doecho ${loop}done保存# chmod +x listfile.sh# ./listfile.sh看效果.8.编写一个脚本自动生成一个C类IP地址段IP地址段网络部分由用户指定# vi ipaddr.sh#!/bin/bashfor ip in `seq 1 254`doecho ${1}.${ip}done保存# chmod +x ipaddr.sh# ./ipaddr.sh 192.168.1看效果.9.编写一个脚本自动生成一个C类IP地址段IP地址段网络部分由用户指定,主机结束部分由用户指定# vi ipaddr2.sh#!/bin/bashfor ip4 in `seq 1 ${2}`doecho ${1}.${ip4}done保存# chmod +x ipaddr2.sh# ./ipaddr2.sh 192.168.1 100看效果.10.编写一个脚本自动生成一个C类IP地址段IP地址段网络部分由用户指定,主机结束部分由用户指定# vi ipaddr3.sh#!/bin/bashfor ip3 in `seq 1 5`dofor ip4 in `seq 1 ${2}`doecho ${1}.${ip3}.${ip4}donedone保存# chmod +x ipaddr3.sh# ./ipaddr3.sh 192.168 2 100看效果.11.编写一个脚本测试while的性能# vi menu-while.sh#!/bin/bashwhile [ "1" == "1" ]doclearecho "-------menu-----"echo "1) Show Time"echo "2) CPU load"echo "3) Memory free"echo "0) Exit"echo "---------------"echo -n "Enter you chose [0-3]:"read Chosecase ${Chose} in0) exit ;;1) date +%T;;2) uptime | awk -F '[,]' '{print $1}';;3) free -m | awk '$1=="Mem:"{print $4}';;*) echo "This is not between 0-3." ;;esacecho -n "Do you contine [y/n]:"read contineif [ "${contine}" == "n" -o "${contine}" == "N" ] thenexitfidone保存# chmod +x menu-while.sh# ./menu-while.sh看效果.12.echo颜色显示# vi showcolor.sh#!/bin/bashecho -e "\033[40;35mHell,world! \033[0m"echo "Hello,world"保存# chmod +x showcolor.sh# ./showcolor.sh看效果.13.sort排序# vi showsort.sh#!/bin/bashsort -k3 -n -r -t: /etc/passwd保存# chmod +x showsort.sh# ./showsort.sh看效果.14.wc统计字数# vi showwc.sh#!/bin/bashwc /etc/passwd保存# chmod +x showwc.sh# ./showwc.sh看效果.15.diff判断文件的差异# vi a.txtHello World保存# vi b.txtHello You保存# vi showdiff.sh#!/bin/bashdiff a.txt b.txt保存# chmod +x showdiff.sh# ./showdiff.sh看效果.15.diff判断文件的差异# vi showawk.sh#!/bin/bashawk -F: '{print $1,$3}' /etc/passwd保存# chmod +x showawk.sh# ./showawk.sh看效果.16.test判断文件的差异# vi showtest.sh#!/bin/bash#中间是a与操作,则都为0才得0#中间是o或操作,则有一真则真0test -e /etc/passwd -a -e /etc/shadowecho $?test -e /etc/passwd -o -e /etc/groupsecho $?保存# chmod +x showtest.sh# ./showtest.sh看效果.17.输入判断# vi input.sh#!/bin/bash#input testecho -n "Enter your name:"read name#did the user just hit returnif [ "${name}" == "" ]thenecho "You did not enter any information"elseecho "Your name: ${name}"fi保存# chmod +x input.sh# ./input.sh看效果.18.文件拷贝# vi filecopy.sh#!/bin/bash#file copy# 2>/dev/null 丢掉错误提示if cp /etc/passwd passwd.bak 2>/dev/null thenecho "Good Copy!"elseecho "`basename $0`: error,could not copy" fi保存# chmod +x filecopy.sh# ./filecopy.sh看效果.19.case选择效果# vi showcase.sh#!/bin/bash#case selectecho -n "enter a number from 1 to 5:"read NUMcase $NUM in1) echo "you select 1" ;;2) echo "you select 2" ;;3) echo "you select 3" ;;4) echo "you select 4" ;;5) echo "you select 5" ;;*) echo "basename $This is not between 1 and 5"esac保存# chmod +x showcase.sh# ./showcase.sh看效果.20.case选择效果学生的考试成绩是0-100分,在85以上的要提示you are the best!,在70-84显示you get a good mark! ,在60-74的显示come on!,60分以下显示You must study hard!# vi showpoint.sh#!/bin/bashecho -n "please input your mark:"read markcase $mark in# 100、90-99、85-89100|9[0-9]|8[5-9]) echo "you are the best!";;# 80-84、70-798[0-4]|7[0-9]) echo "you get a good mark!";;# 70-74、60-697[0-4]|6[0-9]) echo "come on!";;# 00-59[0-5][0-9]) echo "You must study hard!";;esac保存# chmod +x showpoint.sh# ./showpoint.sh看效果.21.用echo显示颜色# vi showcolors.sh#!/bin/bashT='gYw' # The test textechoecho "default 40m 41m 42m 43m 44m 45m 46m 47m"## FGs 为前景(foreground), BG 为背景(background)for FGs in ' m' ' 1m' ' 30m' '1;30m' ' 31m' '1;31m' ' 32m' '1;32m' '33m' '1;33m' ' 34m' '1;34m' ' 35m' '1;35m' ' 36m' '1;36m' ' 37m''1;37m'doFG=$(echo $FGs|tr -d ' ')echo -en " $FGs \033[$FG $T "for BG in 40m 41m 42m 43m 44m 45m 46m 47m;doecho -en " \033[$FG\033[$BG $T \033[0m"doneechodoneecho保存# chmod +x showcolors.sh# ./showcolors.sh看效果.22.改变终端窗口的名称.这里使用了一个名为help的函数,该函数在脚本中使用了两次: # vi xtitlebar.sh#!/bin/bash# vim: set sw=4 ts=4 et:help(){cat << HELPxtitlebar -- change the name of an xterm, gnome-terminal or kdekonsoleUSAGE: xtitlebar [-h] "string_for_titelbar"OPTIONS: -h help textEXAMPLE: xtitlebar "cvs"HELPexit 0}# in case of error or if -h is given we call the function help:[ -z "$1" ] && help[ "$1" = "-h" ] && help# send the escape sequence to change the xterm titelbar:echo -e "\033[40;35m$1\033[0m"保存# chmod +x xtitlebar.sh# ./xtitlebar.sh看效果.23.shift用法# vi showshift.sh#!/bin/bashuntil [ $# -eq 0 ]doecho "第一个参数为: $1 参数个数为: $#"shiftdone保存# chmod +x showshift.sh# ./showshift.sh 1 2 3 4第一个参数为: 1 参数个数为: 4第一个参数为: 2 参数个数为: 3第一个参数为: 3 参数个数为: 2第一个参数为: 4 参数个数为: 1看效果.来源于网络,回归于网络.我的邮箱:happy.every.day@ QQ:48399956快乐!2010年9月30日对我有用[0] 丢个板砖[0] 引用举报管理TOP 回复次数:3merryboy等级:#1楼得分:0回复于:2010-09-30 16:22:0324.shift用法2 # vi showshift2.sh#!/bin/bashif [ $# -eq 0 ]thenecho "Usage:x_shift2.sh 参数"exit 1fisum=0until [ $# -eq 0 ]dosum=`expr $sum + $1`shiftdoneecho "sum is: $sum"保存# chmod +x showshift2.sh# ./showshift2.sh 10 20 15sum is: 45看效果.25.函数定义,调用# vi showfunction.sh#!/bin/bashmessage(){echo "message"}let i=1while [ $i -le 3 ]domessagelet i=$i+1done保存# chmod +x showfunction.sh# ./showfunction.sh看效果.26.函数定义,调用,参数传递,这里主要实现数的乘方计算.# vi showfunction2.sh#!/bin/bashpower(){x=$1y=$2count=1result=1while [ $count -le $y ]doresult=`expr $result \* $x`count=`expr $count + 1`donereturn $result}echo "Enter two numbers"read num1 num2power $num1 $num2answer=$?echo "$num1 to $num2 is $answer"保存# chmod +x showfunction2.sh# ./showfunction2.shEnter two numbers2 32 to3 is 8看效果.27.函数定义,调用,参数传递,这里主要实现数的乘方计算,使用递归调用.# vi showfunction3.sh#!/bin/bashpower(){x=$1y=$2if [ $y -eq 1 ]thenreturn $xelsey=`expr $y - 1`power $x $yresult=`expr $? \* $x`return $resultfi}echo "Enter two numbers"read num1 num2power $num1 $num2answer=$?echo "$num1 to $num2 is $answer"保存# chmod +x showfunction3.sh# ./showfunction3.shEnter two numbers3 23 to 2 is 9看效果.如果你输入4 5看看结果是什么Enter two numbers4 54 to5 is 0为什么是0,不是1024,我估计是计算溢出了.28.局部变量全局变量的测试.默认情况下,所有函数的变量都是全局变量.你可以用typeset去声明一个局部变量# vi showfunction4.sh#!/bin/basheasy(){typeset aa=`expr 30 `b=`expr 30 `echo "easy a is " $aecho "easy b is " $b}a=10b=20easy $a $becho "global a is " $aecho "global b is " $b保存# chmod +x showfunction4.sh# ./showfunction4.sheasy a is 30easy b is 30global a is 10global b is 30看效果.29.如果要在脚本中多次使用函数,可以把它放在一个函数目录中,像一个普通文件一样,使用的时候把它放在脚本开始的地方模式:. functionfile...具体例子# vi power.sh#!/bin/bashpower(){x=$1y=$2if [ $y -eq 1 ]thenreturn $xelsey=`expr $y - 1`power $x $yresult=`expr $? \* $x`return $resultfi}保存# vi showfunction5.sh#!/bin/bash. power.shecho "Enter two numbers"read num1 num2power $num1 $num2answer=$?echo "$num1 to $num2 is $answer"保存# chmod +x power.sh# chmod +x showfunction5.sh# ./showfunction5.shEnter two numbers2 32 to3 is 8看效果.30. 函数使用# vi showfunction6.sh#!/bin/bash# file name "showfunction6.sh" function nihao() {echo -n "nice to meet you ! "}function mingzi() {echo "小桥流水人家"}function out(){echo "即将退出..."echo "3秒后退出!"sleep 1echo -n "."sleep 1echo -n "."sleep 1echo "."exit}nihaomingziout保存# chmod +x showfunction6.sh# ./showfunction6.sh看效果.31.实现对输入参数的分析,但是下面的使用case表达式的例子无疑是一个不错的方法. # vi param.sh#!/bin/shhelp(){cat << HELPThis is a generic command line parser demo.USAGE EXAMPLE: cmdparser -l hello -f -- -somefile1 somefile2HELPexit 0}while [ -n "$1" ]; docase $1 in-h) help;shift 1;; # function help is called-f) opt_f=1;shift 1;; # variable opt_f is set-l) opt_l=$2;shift 2;; # -l takes an argument -> shift by 2--) shift;break;; # end of options-*) echo "error: no such option $1. -h for help";exit 1;;*) break;;esacdoneecho "opt_f is $opt_f"echo "opt_l is $opt_l"echo "first arg is $1"echo "2nd arg is $2"你可以这样运行该脚本:# chmod +x param.sh# ./param.sh -l hello -f -- -somefile1 somefile2返回结果如下:opt_f is 1opt_l is hellofirst arg is -somefile12nd arg is somefile2这个脚本是如何工作的呢?脚本首先在所有输入命令行参数中进行循环,将输入参数与case表达式进行比较,如果匹配则设置一个变量并且移除该参数.根据unix系统的惯例,首先输入的应该是包含减号的参数.32. DONE OK PASSED FAILED WARNING的shell颜色控制显示(这个是参考/u3/93926/showart_1875228.html文档,自己摸索学会的)# vi colorbase.sh#!/bin/shBOOTUP=color# 第一设置BOOTUP 变量,默认就是colorRES_COL=60# 第二设置设置在屏幕的第几列输出后面的"[ xxx ]" ,默认是第60列MOVE_TO_COL="echo -en \\033[${RES_COL}G"# MOVE_TO_COL 是用于打印"OK" 或者"FAILED" ,或者"PASSED" ,或者"WARNING"之前的部分,不含"["SETCOLOR_SUCCESS="echo -en \\033[1;32m"# SETCOLOR_SUCCESS 设置后面的字体都为绿色SETCOLOR_FAILURE="echo -en \\033[1;31m"# SETCOLOR_FAILURE 设置后面将要输出的字体都为红色SETCOLOR_W ARNING="echo -en \\033[1;33m"# SETCOLOR_W ARNING 设置后面将要输出的字体都为黄色SETCOLOR_NORMAL="echo -en \\033[0;39m"# SETCOLOR_NORMAL 设置后面输出的字体都为白色(默认)echo_success() {# 下面是echo_success 部分[ "$BOOTUP" = "color" ] && $MOVE_TO_COL# 首先是打印"[" 之前的空格echo -n "["# 然后打印"["[ "$BOOTUP" = "color" ] && $SETCOLOR_SUCCESS# 设置字体为红色echo -n $" OK "# 打印OK[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL # 返回字体为白色echo -n "]"# 打印"]"echo -ne "\r"# 换行.return 0# 返回0,其他一律返回1}echo_done() {# 下面是echo_success 部分[ "$BOOTUP" = "color" ] && $MOVE_TO_COL# 首先是打印"[" 之前的空格echo -n "["# 然后打印"["[ "$BOOTUP" = "color" ] && $SETCOLOR_SUCCESS # 设置字体为红色echo -n $" DONE "# 打印DONE[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL # 返回字体为白色echo -n "]"# 打印"]"echo -ne "\r"# 换行.return 0# 返回0,其他一律返回1}echo_failure() {[ "$BOOTUP" = "color" ] && $MOVE_TO_COLecho -n "["[ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE echo -n $" FAILED "[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL echo -n "]"echo -ne "\r"return 1}echo_passed() {[ "$BOOTUP" = "color" ] && $MOVE_TO_COLecho -n "["[ "$BOOTUP" = "color" ] && $SETCOLOR_W ARNING echo -n $" PASSED "[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL echo -n "]"echo -ne "\r"return 1}echo_warning() {[ "$BOOTUP" = "color" ] && $MOVE_TO_COLecho -n "["[ "$BOOTUP" = "color" ] && $SETCOLOR_W ARNING echo -n $" WARNING "[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL echo -n "]"echo -ne "\r"return 1}保存# vi testsuccess.sh#!/bin/sh. colorbase.shecho_successecho "I win."echo_doneecho "I win."echo_failureecho "I think I will win."echo_passedecho "I passed."echo_warningecho "I think I will have no warning."保存# chmod +x colorbase.sh# chmod +x testsuccess.sh# ./testsuccess.shI win. [ OK ]I win. [ DONE ]I think I will win. [ FAILED ]I passed. [ PASSED ]I think I will have no warning. [ WARNING ]看效果.33.如何计算一个日期是星期几# vi whichdate.sh#!/bin/bashgetdayofweek(){# Function dayofweek# Sample input:20020703# Extract the month, day, and yearyear=`echo $1|cut -c1-4`month=`echo $1|cut -c5-6`day=`echo $1|cut -c7-8`b=`cal $month $year|wc -l `cal $month $year |awk '{for(i=1;i<=NF;i++){if($i=='$day'){if(NR=='"$b"'-1){print i-1}else{print 7-NF+i-1}}}}'}getdayofweek $1保存# chmod +x whichdate.sh# ./whichdate.sh 20100930434. 自动让脚本调用其他脚本并输入相关的选择项,如果你没有安装expect的话,请执行# yum install exepct安装就可以了.# vi showfunction7.sh#!/bin/bashecho "Enter one numbers"read num1echo "The number is $num1"保存# vi input.exp#!/usr/bin/expect -fspawn ./showfunction7.shexpect "Enter one numbers";send "2\r";interact;保存# vi autoinput.sh#!/bin/bash./input.exp# chmod +x showfunction7.sh# chmod +x input.exp# chmod +x autoinput.sh# ./autoinput.shspawn ./showfunction7.shEnter one numbers2The number is 2看效果.35. 自动让脚本调用其他脚本并输入相关的选择项,多次调用输入# vi showfunction8.sh#!/bin/bashecho "Enter one numbers"read num1echo "The number is $num1"保存# vi input1.exp#!/usr/bin/expect -fspawn ./showfunction8.shexpect "Enter one numbers";send "2\r";interact;spawn ./showfunction8.shexpect "Enter one numbers";send "3\r";interact;保存# vi autoinput1.sh#!/bin/bash./input1.exp# chmod +x showfunction8.sh# chmod +x input1.exp# chmod +x autoinput1.sh# ./autoinput1.shspawn ./showfunction8.shEnter one numbers2The number is 2spawn ./showfunction8.shEnter one numbers3The number is 3看效果.来源于网络,回归于网络.我的邮箱:happy.every.day@ QQ:48399956快乐!2010年9月30日对我有用[0] 丢个板砖[0] 引用举报管理TOP 精华推荐:借人气宣传一下自己开发的语言Dao merryboy等级:#2楼得分:0回复于:2010-09-30 16:22:12FAQ,参考信息:1.位置参数$1, $2, $3等等...位置参数,从命令行传递给脚本,或者是传递给函数.或者赋职给一个变量.此数目可以任意多,但只有前9个可以被访问,使用shift命令可以改变这个限制.$0$0表示当前执行的进程名,script 本身的名字,或者在正则表达式中表示整行输出$#命令行或者是位置参数的个数.$*所有的位置参数,被作为一个单词.注意:"$*"必须被""引用.$@与$*同义,但是每个参数都是一个独立的""引用字串,这就意味着参数被完整地传递,并没有被解释和扩展.这也意味着,每个参数列表中的每个参数都被当成一个独立的单词.注意:"$@"必须被""引用.其他的特殊参数$-传递给脚本的falg(使用set 命令).显示shell使用的当前选项,与set命令功能相同注意:这起初是ksh 的特征,后来被引进到Bash 中,但不幸的是,在Bash 中它看上去也不能可靠的工作.使用它的一个可能的方法就是让这个脚本进行自我测试(查看是否是交互的).$!在后台运行的最后的工作的PID(进程ID).$_保存之前执行的命令的最后一个参数.$?命令,函数或者脚本本身的退出状态用于检查上一个命令,函数或者脚本执行是否正确.(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错.)$$脚本自身的进程ID.这个变量经常用来构造一个"unique"的临时文件名.这通常比调用mktemp 来得简单.注意事项:[1] 当前运行的脚本的PID 为$$.[2] "argument"和"parameter"这两个单词经常不加区分的使用.在这整本书中,这两个单词的意思完全相同.(在翻译的时候就未加区分,统统翻译成参数)退出和返回退出状态(exit status)函数返回一个被称为退出状态的值. 退出状态可以由return 来指定statement, 否则函数的退出状态是函数最后一个执行命令的退出状态(0 表示成功,非0 表示出错代码). 退出状态(exit status)可以在脚本中由$? 引用. 这个机制使脚本函数也可以像C 函数一样有一个" 返回值".return终止一个函数.return 命令[1]可选地带一个整数参数,这个整数作为函数的"返回值"返回给调用此函数的脚本,并且这个值也被赋给变量$?.while true可以写为while :一、用户登陆进入系统后的系统环境变量$HOME 使用者自己的目录$PA TH 执行命令时所搜寻的目录$TZ 时区$MAILCHECK 每隔多少秒检查是否有新的信件$PS1 在命令列时的提示号$PS2 当命令尚未打完时,Shell 要求再输入时的提示号$MANPA TH man 指令的搜寻路径二、特殊变量$0 这个程序的执行名字$n 这个程序的第n个参数值,n=1..9$* 这个程序的所有参数$# 这个程序的参数个数$$ 这个程序的PID$! 执行上一个指令的PID$? 执行上一个指令的返回值三、shell中的变元* 任意字符串? 一个任意字符[abc] a, b, c三者中之一[a-n] 从a到n的任一字符四、几个特殊字符表示\b 退回\c 打印一行时没有换行符这个我们经常会用到\f 换页\r 回车\t 制表\v 垂直制表五、判断文件的属性格式:-操作符filename-e 文件存在返回1, 否则返回0-r 文件可读返回1,否则返回0-w 文件可写返回1,否则返回0-x 文件可执行返回1,否则返回0-o 文件属于用户本人返回1, 否则返回0-z 文件长度为0返回1, 否则返回0.-f 文件为普通文件返回1, 否则返回0-d 文件为目录文件时返回1, 否则返回0六、测试字符串字符串1 = 字符串2 当两个字串相等时为真字符串1 != 字符串2 当两个字串不等时为真-n 字符串当字符串的长度大于0时为真-z 字符串当字符串的长度为0时为真字符串当串字符串为非空时为真七、测试两个整数关系数字1 -eq 数字2 两数相等为真数字1 -ne 数字2 两数不等为真数字1 -gt 数字2 数字1大于数字2为真数字1 -ge 数字2 数字1大于等于数字2为真数字1 -lt 数字2 数字1小于数字2为真数字1 -le 数字2 数字1小于等于数字2为真八、逻辑测试-a 与-o 或! 非shell中的特殊字符有1、$ 美元符2、\ 反斜杠3、` 反引号4、" 双引号5、,*,?,[,]下面我一一举列说明一、$符号1、echo $? 显示的是上一条指令退出状态2、echo "$?" 效果同上3、echo '$?' 显示的是$?4、echo \$? 显示的是$?5、echo "\$?" 显示的是$?大家可能已经看出$符号在双引号中具有特殊意义双引号对$符号不起作用而单引号可以将特殊字符的的特殊意义屏蔽掉,使其能显示为字符本身,反斜杠也可以将特殊字符的特殊含义屏蔽掉,使特殊字符失去特殊含义.反斜杠的作用是将特殊符号字符的特殊含义屏蔽掉,使其还是原字符A=1234echo \$A 显示为$A 如果不加\将显示为1234echo \` 显示为`echo \" 显示为双引号echo \\ 显示为\三、` 反引号反引号的功能是命令替换,将反引号中的字符串做为命令来执行,我们在用shell编程时经常用的到将系统命令的执行结果赋给一个变量A=`date`echo $A 显示的不是date而是当时的时间串比如有一文件A的内容如下ABCDEFG1234456abcdefgB=`cat A|grep 234` #检索文件A中含有字符串234的行echo $B 将显示为1234456echo "$B" 将显示为什么?echo "\$B" 将显示为什么?读者自己试试四、"双引号在系统中有些特殊字符,为避免引用这些特殊字符往往用双引号或单引号将这些特殊字符引起来,使其不具有特殊含义.但有一部分特殊字符在引号中还是具有特殊含义,用双引号引起来是不起作用的.本文中所列的前四个特殊字符在双引号中还是特殊字符.为了使其不具有特殊含义一是用单引号引进来二是用\反斜线使其失去作用.比如我们想原样输出这些特殊字符echo """echo "$"echo "\"echo "`"以上不是你所期望的结果,因为双引号对它们不起作用,你只能这样才能输出这些特殊字符的原形echo '"'echo '$'echo '\'echo '`'或echo "\""echo "\$"echo "\\"echo "\`"将分别显示为" $ \ `五、其它特殊字符大家注意到,除了前四个特殊字符外,我将其它的特殊字符都放在一块,这是因为前四个特殊字符在双引号中还是具有特殊含义,所以单独拿出来讲,除此以外的特殊字符如果你要输出这些特殊字符的原形,你就可以用双引号或单引号引起来使其失去特殊含义.,*,?,[,]对shell有特殊含义但你可以用双引号引起来输入这些原形一、if条件语句格式:if 条件表达式then #当条件为真时执行以下语句命令列表else #为假时执行以下语句命令列表fiif 语句也可以嵌套使用if条件表达式1thenif 条件表达式2then命令列表elseif 条件表达式3then命令列表else命令列表fifielse命令列表fi你可以进行多层嵌套一个if语句一定要跟一个fi 表示该层条件结束否则会造成语法错误结合前面讲的举例如下: 这里先讲一个条件语句中用到的命令test 表示测试test后面的条件是否为真if test -f "$1"thenlpr $1elseif test -d "$1"thencd $1lpr $1elseecho "$1不是文件或目录"fifi以上的例子还可以改成如下所示if test -f "$1"thenlpr $1elif test -d "$1" #elif 同else ifthen(cd$1;lpr $1)elseecho "$1不是文件或目录"fi以上的例子不知您是否看懂是什么意思吗?假如我们现在将这个例子保存为prfilechmod +x prfile执行刚才的程序./prfile aaa这个例子是检查你的输入的参数是否是一个文件如果是就打印如果是一个目录先转目录再打印如果即不是文件也不是目录给出提示二、多重条件测试语句case格式:case 字串in模式) 命令列表;;模式) 命令列表;;....esac多重条件语句是以case开始以esac结束中间可以有多个条件列表功能是测试字串和和里面的模式有没有匹配的,有就执行里面的命令列表模式也可以是*号表示任意字串,每个模式里面的最后要心;;双引号结束,否则会发生语法错误.现举例如下:case $1 in*.c)cc $1;;*.txt)lpr $1;;*)echo "未知的类型"esac假如将以上内容保存在文件abc中chmod +x abc执行./abc a.c将会对文件a.c进行编译执行./abc readme.txt 将会把文件通过打印机假如我将以上内容改一下,你是否会知道它的执行结果?case $1 in*)cc $1;;*.txt)lpr $1;;*.c)echo"未知的类型"esac一. while 循环while 命令格式while 条件表do命令表done执行过程Shell首先执行条件表,如果条件表的最后一条语句的退出状态为零,则执行盾环体内的命令表,执行完后,再检查条件表,如果退出状态为零将继续执行,如此循环往复直到条件表的最后一条语句的退出状态非零.退出状态为零就是条件为真True.举例说明假如shell文件的内容如下:Sum=0i=0while true #true是系统的关键词表示真doi=`expr $i + 1`Sum=`expr $Sum + $i`if [ $i = "100" ]thenbreak;fidoneecho $i $Sum最后这个程序显示的是100 5050这个程序的运算就是将1到100加起来下面将这个程序再改动一下Sum=0i=0while [ $i != "100" ]doi=`expr $i + 1`Sum=`expr $Sum + $i`doneecho $i $Sum改动后的程序运算结果和上面是一样但程序比上面的要简练在这个循环中还可以以until做为测试条件它正好与while测试的条件相反,也就是当条件为假时将继续执行循环体内的语句,否则就退出循环体,下面还用这个例子.Sum=0i=0until [ $i = "100" ]doi=`expr $i + 1`Sum=`expr $Sum + $i`doneecho $i $Sum当i不等于100时循环就是当条件为假时循环,否则就退出,而第一个例子是当i不等于100时循环,也就是测试条件为真时循环.二.for 循环命令格式:for 变量in 名字列表do命令列表done这里的名字列表是一个由空格分隔的字符串列表,shell在执行for循环时每次依次从名字表中取出一个字符串赋给循环变量作为变量的值.在写for语句时,也可以省略in 名字列表部分,这表示用当前的位置参数来代替这时的名字列表.面举个例子,比如在你的电脑中有两个目录,一个是aa,一个是bb在这两个目录中有5个相同的文件,但其中一个目录中的一个或多个文件刚刚修改过,现在我忘记刚才改的是那几个文件了,那么我靠已知的序码查找.程序如下:for File in a1 a2 a3 a4 a5dodiff aa/$File bb/$Filedone下面再举一个不带名字列表的例子forFiledoecho $Filwdone文件内容保存在a.sh中并可执行我们在执行这个shell程序时命令行如下:a.sh a1 a2 a3 a4 a5执行结果如下:a1a2a3a4a5大家从这个例子中可以看到命令行的参数被逐一读入一次三.循环控制语句break命令不执行当前循环体内break下面的语句从当前循环退出. continue命令是程序在本循体内忽略下面的语句,从循环头开始执行.。

相关主题