Shell脚本例子集合
shell循环详解及实例

shell循环详解及实例⼀、条件选择、判断(if、case)1.1 if语句⽤法及实例当我们在脚本中遇到需要判断的时候,我们就可以⽤if语句来实现。
具体的语法如下:单分⽀if 判断条件;then 条件为真的分⽀代码 fi双分⽀if 判断条件; then条件为真的分⽀代码else条件为假的分⽀代码fi多分⽀if 判断条件1; then条件为真的分⽀代码elif 判断条件2; then条件为真的分⽀代码elif 判断条件3; then条件为真的分⽀代码else以上条件都为假的分⽀代码fi在多分⽀中,系统会逐条判断你写⼊的条件,第⼀次遇到“真”条件时,执⾏该分⽀,⽽后结束整个if语句。
注意:1、if和fi是成对出现的2、if语句可以嵌套。
Example:1)判断两个数字的⼤⼩1 #!/bin/bash2 #定义变量3 read -p "Please input the first num:" num14 read -p "Please input the second num:" num25 #判断数字是否符合标准6 if [[ $num1 =~ ^[0-9]+$ && $num2 =~ ^[0-9]+$ ]];then7 # 判断两个数字的⼤⼩并输出判断结果8 if [ $num1 -lt $num2 ];then9 echo "The num2 is biger than the num1"10 elif [ $num1 -eq $num2 ];then11 echo "Two numbers equal"12 else13 echo "The num1 is biger than the num2"14 fi15 else16 echo "Please enter the correct number"17 fi1819 #删除变量20 unset num1 num22)编写脚本/root/bin/createuser.sh,实现如下功能:使⽤⼀个⽤户名做为参数,如果指定参数的⽤户存在,就显⽰其存在,否则添加之;显⽰添加的⽤户的id号等信息1 #!/bin/bash2 #定义变量3 read -p "请输⼊⼀个⽤户名:" name4 #判断⽤户名是否存在5 if `id $name &> /dev/null`;then6 # 若存在,则输出ID等信息7 echo "⽤户存在,⽤户的ID信息为:`id $name`"8 else9 # 若不存在,则添加⽤户,设置密码为随机8位,下次登录时提⽰修改密码,同时显⽰ID等信息10 passwd=`cat /dev/urandom |tr -cd [:alpha:] |head -c8`11 `useradd $name &> /dev/null`12 `echo "$passwd" | passwd --stdin $name &> /dev/null`13 echo "⽤户名:$name 密码: $passwd" >> user.txt14 `chage -d 0 $name`15 echo "⽤户已添加,⽤户的ID信息为:`id $name` 密码为:$passwd"16 fi1718 #删除变量19 unset name passwd1.2 case⽤法及实例当涉及到多个条件匹配的时候,我们⽤if可能就很⿇烦了,这个时候,我们就可以⽤case来编写这个脚本。
Shell 经典实例

Thizlinux 系统教程 Shell 经典实例----------------Milo经典小shell1 列目录树的shell脚本如下:#!/bin/sh# dtree: Usage: dtree [any directory]dir=${1:-.}(cd $dir; pwd)find $dir -type d -print | sort -f | sed -e "s,^$1,," -e "/^$/d" -e "s,[^/]*/([^/]*)$,`----1," -e "s,[^/]*/,| ,g"2 while中使用read (file是一个文件)cat file | while read linedoecho $lineecho " :: Please input any key(s):c"str4read=""while truedochr4read=`dd if=/dev/tty bs=1 count=1 2>/dev/null`str4read=$str4read$chr4readif [ "$chr4read" = "" ] ;then break; fidoneecho " :: |$str4read|"done3 将多个空格替换为字符sed 's/[ ][ ]*/ /g'如果空格与tab共存时用sed -e 's/[[:space:]][[:space:]]*/ /g' filename4用脚本实现分割文件#!/bin/bashif [ $# -ne 2 ]; thenecho 'Usage: split file size(in bytes)'exitfifile=$1size=$2if [ ! -f $file ]; thenecho "$file doesn't exist"exitfi#TODO: test if $size is a valid integerfilesize=`/bin/ls -l $file | awk '{print $5}'` echo filesize: $filesizelet pieces=$filesize/$sizelet remain=$filesize-$pieces*$sizeif [ $remain -gt 0 ]; thenlet pieces=$pieces+1fiecho pieces: $piecesi=0while [ $i -lt $pieces ];doecho split: $file.$i:dd if=$file of=$file.$i bs=$size count=1 skip=$i let i=$i+1doneecho "#!/bin/bash" > mergeecho "i=0" >> mergeecho "while [ $i -lt $pieces ];" >> mergeecho "do" >> mergeecho " echo merge: $file.$i" >> mergeecho " if [ ! -f $file.$i ]; then" >> mergeecho " echo merge: $file.$i missed" >> mergeecho " rm -f $file.merged" >> mergeecho " exit" >> mergeecho " fi" >> mergeecho " dd if=$file.$i of=$file.merged bs=$size count=1 seek=$i" >> merge echo " let i=$i+1" >> mergeecho "done" >> mergechmod u+x merge'5得到上月未日期,格式为YYYYMMDDget_lastday_of_lastmonth(){yy=`date +%Y`mm=`date +%m-1|bc`[ $mm -lt 1 ] && mm=12;yy=`expr $yy - 1`aaa=`cal $mm $yy`dd=`echo $aaa|awk '{print $NF}'`echo $yy$mm$dd}print $NF的$NF是打印最后一个列。
经典shell 脚本实例

fi
done
#!/bin/bash
if [ $# -le 0 ]
then
echo "Not enough parameters"
exit 1
fi
#string="2 3 4 5 6"
#set string
sum=0
while [ $# -gt 0 ]
do
sum=`expr $sum + $1`
shift
印出该数值,然后再次要求用户输入数值。直到用户输入"end"停止。#!/bin/sh
unset var
while [ "$var" != "end" ]
do
echo -n "please input a number: "
ቤተ መጻሕፍቲ ባይዱ
read var
if [ "$var" = "end" ]
then
break
fi
Linux shell 脚本实例
1. 写一个脚本,利用循环计算 10 的阶乘#!/bin/sh
factorial=1
for a in `seq 1 10`
do
factorial=`expr $factorial \* $a`
done
echo "10! = $factorial"
2. 写一个脚本,执行后,打印一行提示“Please input a number:",要求用户输入数值,然后打
esac done #! /bin/sh a=10 b=20 c=30 value1=`expr $a + $b + $c` echo "The value of value1 is $value1" value2=`expr $c / $b` echo "The value of value2 is $value2" value3=`expr $c * $b` echo "The value of value3 is $value3" value4=`expr $a + $c / $b` echo "The value of value4 is $value4" var4=`expr $value4 - $value2` echo $var4
centosshell脚本编程1正则shell脚本结构read命令date命令的用法she。。。

centosshell脚本编程1正则shell脚本结构read命令date命令的⽤法she。
centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的⽤法 shell中的逻辑判断 if 判断⽂件、⽬录属性 shell数组简单⽤法 $( )和${ } 和$(( )) 与 sh -n sh -x sh -v 第三⼗五节课Shebang/Sha-bang在计算机科学中, Shebang (也称为Hashbang)是⼀个由井号和叹号构成的字符串⾏(#!), 其出现在⽂本⽂件的第⼀⾏的前两个字符.在⽂件中存在Shebang的情况下, 类Unix操作系统的程序载⼊器会分析Shebang后的内容, 将这些内容作为解释器指令, 并调⽤该指令, 并将载有Shebang的⽂件路径作为该解释器的参数. 例如, 以指令#!/bin/sh开头的⽂件在执⾏时会实际调⽤/bin/sh程序.)#!⽤于帮助内核找到相应的解释器,只有被直接执⾏的⽂件中才有必要加⼊#!Shebang指明了执⾏这个脚本⽂件的解释程序。
1. 如果脚本⽂件中没有#!这⼀⾏,那么它执⾏时会默认⽤当前Shell去解释这个脚本(即:$SHELL环境变量)。
2. 如果#!之后的解释程序是⼀个可执⾏⽂件,那么执⾏这个脚本时,它就会把⽂件名及其参数⼀起作为参数传给那个解释程序去执⾏。
3. 如果#!指定的解释程序没有可执⾏权限,则会报错“bad interpreter: Permission denied”。
如果#!指定的解释程序不是⼀个可执⾏⽂件,那么指定的解释程序会被忽略,转⽽交给当前的SHELL去执⾏这个脚本。
4. 如果#!指定的解释程序不存在,那么会报错“bad interpreter: No such file or directory”。
注意:#!之后的解释程序,需要写其绝对路径(如:#!/bin/bash),它是不会⾃动到$PATH中寻找解释器的。
shell脚本常用命令

shell脚本常⽤命令shell基本命令1.#!/bin/sh是指此脚本使⽤/bin/sh来解释执⾏。
解释:#! 是⼀个约定的标记,它告诉系统这个脚本需要什么解释器来执⾏,即使⽤哪⼀种 Shell。
2.echo 命令⽤于向窗⼝输出⽂本。
举例:echo "Hello World !"3.your_name="qinjx"赋值变量echo ${your_name}打印变量;使⽤变量的时候加括号和美元符4.chmod +x ./test.sh #使脚本具有执⾏权限./test.sh #执⾏脚本chmod 777 /tmp -R 意思是把tmp⽂件夹及其⼦bai⽂件夹的权限全部修改为777解释语句⼀:ping -c 5 > /dev/null 2>&11. ping -c 5 -c<完成次数>:设置完成要求回应的次数;2. >/dev/null这条命令的作⽤是将标准输出1重定向到/dev/null中。
/dev/null代表linux的空设备⽂件,所有往这个⽂件⾥⾯写⼊的内容都会丢失,俗称“⿊洞”。
那么执⾏了>/dev/null之后,标准输出就会不再存在,没有任何地⽅能够找到输出的内容。
3. 2>&1这条命令⽤到了重定向绑定,采⽤&可以将两个输出绑定在⼀起。
这条命令的作⽤是错误输出将和标准输出同⽤⼀个⽂件描述符,说⼈话就是错误输出将会和标准输出输出到同⼀个地⽅。
linux在执⾏shell命令之前,就会确定好所有的输⼊输出位置,并且从左到右依次执⾏重定向的命令,所以>/dev/null 2>&1的作⽤就是让标准输出重定向到/dev/null中(丢弃标准输出),然后错误输出由于重⽤了标准输出的描述符,所以错误输出也被定向到了/dev/null中,错误输出同样也被丢弃了。
执⾏了这条命令之后,该条shell命令将不会输出任何信息到控制台,也不会有任何信息输出到⽂件中。
常用shell脚本指令

常用shell脚本命令1、显示包含文字aaa的下一行的内容:sed -n '/aaa/{n;p;}' filename2、删除当前行与下一行的内容:sed -i '/aaa/{N;d;}' filename3、删除当前行与下两行的内容:sed -i '/aaa/{N;N;d;}' filename依次类推,删除三行,则为{N;N;N;d;},分析知:N为next4、得出以空格为分割的字符串中单词的个数,即统计个数:awk ' { print NF } '如显示字符串VALUE中的单词个数,其中VALUE为:aaa bbb ccc ddd ee f则执行 echo $VALUE | awk ' { print NF } ' 后的结果为65、在linux中建立一个文件与另一文件的链接,即符号链接ln -s /var/named/chroot/etc/named.conf named.conf这要就建立了当前目录的文件named.conf对/var/named/chroot/etc/named.conf 的符号链接。
即操作named.conf就意味着操作实际文件/var/named/chroot/etc/named.conf ,这时用ll命令查看的结果如:lrwxrwxrwx 1 root root 32 Mar 22 12:29 named.conf ->/var/named/chroot/etc/named.conf注意:当用sed来通过named.conf来删除一部分信息时,会将符号链接的关系丢掉,即会将named.conf变成一个实际文件。
所以需对实际文件进行删除操作。
6、显示指定字符范围内的内容:如:显示文件test.txt中字符#test begin与#test end之间所有的字符sed -n "/#test begin/,/#test end/p" test.txt或 awk "/#test begin/,/#test end/" test.txt在日常系统管理工作中,需要编写脚本来完成特定的功能,编写shell脚本是一个基本功了!在编写的过程中,掌握一些常用的技巧和语法就可以完成大部分功能了,也就是2/8原则.1. 单引号和双引号的区别单引号与双引号的最大不同在于双引号仍然可以引用变量的内容,但单引号内仅是普通字符,不会作变量的引用,直接输出字符窜。
shell脚本100例、练习使用

shell脚本100例、练习使⽤1、编写hello world脚本#!/bin/bashecho"hello world"2、通过位置变量创建linux系统账户和密码#!/bin/bash#$1是执⾏脚本第⼀个参数 $2是执⾏脚本第⼆个参数useradd "$1"echo"$2" | passwd --stdin "$1"#测试脚本[root@template-host sh1]# sh2.sh aaa 123Changing password for user aaa.passwd: all authentication tokens updated successfully.#测试登录[root@template-host sh1]# su - aaa[aaa@template-host ~]$3、每周五使⽤tar命令备份 /var/log下的所有⽇志⽂件#!/bin/bashtar -czPf log-`date +%y%m%d`.tar.gz /var/log #加P是因为如果不加会出现错误:tar: Removing leading `/' from member names date和+之间注意有空格。
修改系统参数[root@template-host sh1]# crontab -e00 03 * * 5 /data/sh1/3.sh4、⼀键部署LNMP(RPM包版本)#!/bin/bash#此脚本需要提前配置yum源,否则⽆法配置成功。
本脚本使⽤于7.4yum -y install httpdyum -y install mariadb mariadb-devel mariadb-serveryum -y install php php-mysqlsystemctl start httpd mariadb #启动httpd、mariadbsystemctl enable httpd mariadb #加⼊开机⾃启动systemctl status httpd mariadb #查看是否成功5、实时监控本机硬盘内存剩余空间,剩余内存空间⼩于500M,根分区剩余空间⼩于1000M时,发送警报信息到命令⾏#!bin/bash#提取分区剩余空间单位:kbdisk_size=$(df / | awk'/\//{print $4}')#提取内存空间单位Mmem_size=$(free -m | awk'/Mem/{print $4}')while :doif [ $disk_size -le 512000 -o $mem_size -le 1024 ];thenecho"警报:资源不⾜"sleep5fidone6、随机⽣成⼀个100以内的随机数,提⽰⽤户猜数字,提⽰⽤户猜⼤了、猜⼩了、猜对了,直⾄⽤户猜对,脚本结束。
一些基础但有趣的shell脚本

⼀些基础但有趣的shell脚本⼀.打印9*9乘法表1 #!/bin/bash2for i in `seq 9`3do4for j in `seq $i`5do6echo -n "$i*$j=$[i*j]"7done8echo9done⼆.剪⼑⽯头布⼩游戏1 #!/bin/bash2 game=(⽯头剪⼑布)3 num=$[RANDOM%3]4 computer=${game[$num]}5 #随机⽣成出拳可能并存⼊数组game[$num]:game[0],game[1],game[2]分别代表⽯头,剪⼑,布6echo"请根据以下提⽰选择出拳⼿势"7echo"⽯头:1 剪⼑:2 布:3"8 read -p "请出拳:(1,2,3)": person9case $person in101)11if [ $num -eq 0 ];then12echo"平局"13elif [ $num -eq 1 ];then14echo"你赢"15else16echo"计算机赢"17fi;;182)19if [ $num -eq 0 ];then20echo"计算机赢"21elif [ $num -eq 1 ];then22echo"平局"23else24echo"你赢"25fi;;263)27if [ $num -eq 0 ];then28echo"你赢"29elif [ $num -eq 1 ];then30echo"计算机赢"31else32echo"平局"三.猜数字⼩游戏1 #!/bin/bash2 #脚本⽣成⼀个100以内的随机数,提⽰⽤户猜数字,根据⽤户的输⼊,>提⽰猜对了,猜⼤了或猜⼩了,直到⽤户猜对为⽌.3 num=$[RANDOM%100+1] #1~100的随机数4 read -p "计算机已⽣成⼀个1~100的随机数,请您猜:" cai15 l=06while :7do8 let l++9if [ $l -eq 1 ];then10if [ $cai1 -eq $num ];then11echo"恭喜,猜对了"12 exit13elif [ $cai1 -gt $num ];then14echo"猜⼤了"15else16echo"猜⼩了"17fi18else19 read -p "请继续:" cai220if [ $cai2 -eq $num ];then21echo"恭喜,猜对了"22 exit23elif [ $cai2 -gt $num ];then24echo"猜⼤了"25else26echo"猜⼩了"27fi28fi29done四.给三个随机数字排序1.交互式1 #!/bin/bash2 #依次提⽰⽤户输⼊三个整数,脚本根据数字⼤⼩排序输出3个数字3 read -p "请输⼊⼀个整数:" num14 read -p "请输⼊⼀个整数:" num25 read -p "请输⼊⼀个整数:" num36 #从⼩到⼤排序,设定最后输出num1,num2,num3,脚本运⾏中将最⼩,中间,最⼤值分别赋予这三个变量,引⼊对调变量tmp7 tmp=08 #如果num1⼤于num2则对调1和2,保持num1最⼩9if [ $num1 -gt $num2 ];then10 tmp=$num111 num1=$num212 num2=$tmp13fi14 #如果num1⼤于num3则对调1和3,保持num1最⼩15if [ $num1 -gt $num3 ];then16 tmp=$num117 num1=$num318 num3=$tmp19fi20 #如果num2⼤于num3则对调2和3,保持num2更⼩21if [ $num2 -gt $num3 ];then22 tmp=$num223 num2=$num324 num3=$tmp25fi26echo"排序后的数据为:$num1,$num2,$num3"2.⾮交互式1 #!/binbash2 l=03 tmp=04for i in `cat /home/student/桌⾯/shell脚本/⽂档/paixu.txt` #⼀个含3个数字的⽂件 6do7 let l++8if [ $l -eq 1 ];then9 num1=$i10fi11if [ $l -eq 2 ];then12 num2=$i13if [ $num1 -gt $num2 ];then14 tmp=$num115 num1=$num216 num2=$tmp17fi18fi19if [ $l -eq 3 ];then20 num3=$i21if [ $num1 -gt $num3 ];then22 tmp=$num123 num1=$num324 num3=$tmp25fi26if [ $num2 -gt $num3 ];then27 tmp=$num228 num2=$num329 num3=$tmp30fi31fi32done33echo"从⼩到⼤排序:$num1,$num2,$num3"五.点名器1 #!/bin/bash2 #提前准备⽂件user.txt,⼀⾏⼀个姓名3 read -p "请输⼊想要抽到的⼈数:" xxx4 l=15while [ $l -le $xxx ]6do7 let l++8 line=`cat /home/student/桌⾯/shell脚本/⽂档/user.txt | wc -l`9 num=$[RANDOM%line+1]10sed -n "${num}p" /home/student/桌⾯/shell脚本/⽂档/user.txt11sleep0.512done六.打印国际象棋棋盘1 #!/bin/bash2 #两个变量i和j代表⾏和列3for i in {1..8}4do5for j in {1..8}6do7sum=$[i+j]8if [ $[sum%2] -eq 0 ];then #偶数9echo -ne "\033[46m \033[0m"10else11echo -ne "\033[47m \033[0m"12fi13done14echo15done七.fork炸弹(会快速消耗计算机资源,导致计算机死机)(请在虚拟机中实验,千万不要在真机尝试,若操作失误请重启计算机)1 .(){2 .|.&3 }4 .⼋.打印斐波那契数列(后⼀个数字永远是前两个数字之和)1 #!/bin/bash2 list=(01)3for i in `seq211`4do5 list[$i]=`expr ${list[-1]} + ${list[-2]}`6done7echo ${list[@]}九.打印⼀些特殊图形1 #!/bin/bash2clear3for ((i=1;i<=9;i++))4do5for((j=1;j<=i;j++))6do7echo -n "$i"8done9echo""10done11 #图11213 read -n1 "按任意键继续" key14clear15for ((i=1;i<=5;i++))16do17for((j=1;j<=i;j++))18do19echo -n "|"20done21echo"_"22done23 #图22425 read -n1 "按任意键继续" key 26clear27for ((i=1;i<=5;i++))28do29for((j=1;j<=i;j++))30do31echo -n "*"32done33echo""34done3536for ((i=5;i>=1;i--))37do38for((j=1;j<=i;j++))39do40echo -n "*"41done42echo""43done44 #图3。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
# 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命令是程序在本循体内忽略下面的语句,从循环头开始执行.。