UnixShell编程基础培训(基础篇)_第1页
UnixShell编程基础培训(基础篇)_第2页
UnixShell编程基础培训(基础篇)_第3页
UnixShell编程基础培训(基础篇)_第4页
UnixShell编程基础培训(基础篇)_第5页
已阅读5页,还剩141页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

UnixShell编程

基础篇北京神州数码思特奇信息技术股份有限公司研究院课程目标熟练编写UnixShell程序内容提纲Shell介绍Shell脚本介绍Shell特性正则表达式变量与运算符Shell的输入与输出Shell函数脚本调试高级编程技巧Shell工具SHELL介绍Shell-UNIX命令解释器问题引入:DOS系统的命令由command负责执行,并且对重覆性或多个命令运行可写成批处理文件,只要执行这个批处理文件就等於执行这些命令。UNIX系统如何处理?Shell:shell是一种命令语言,同时又是一种程序设计语言。

UNIX系统利用shell命令解释器(command-languageinterpreter),完成用户输入命令的执行,是用户与系统交互的界面,是命令与kernel之间的接口。shell接收用户输入的命令,对命令作出解释,然后发送给kernel执行之。

shell是一个解释型的程序设计语言。

shell程序(脚本)相当于dos的批处理文件,可简单到只有一条命令,也可以包括循环、条件语句、数学运算、控制结构的程序,完成复杂的管理任务。Shell-UNIX命令解释器SHELL脚本介绍Shell脚本介绍为什么使用Shell脚本?批量命令重复、条件等控制Shell脚本的基本内容#!/bin/sh

第一行注释:#

第二行变量 第三行条件判断、循环 第四行脚本的运行方式chmod?+x

脚本./脚本文件名Shell脚本介绍示例:hello.sh#!/bin/bash#这是一个基本的shell脚本op="helloworld"echo$opSHELL特性Shell特性别名命令替换管道重定向后台处理模式匹配变量特殊字符别名aliasEg: aliasll=`ls-alh`命令替换myfile的内容如下:marmfindfile实现替换如下:

ls`catmyfile`-al后台处理什么是后台?一个终端可以同时运行多个程序用法:nohupcommand&可以再后台运行此命令示例:

nohubtar-czf要压缩的文件名压缩后的文件名

&查看后台命令使用:jobs–l变量示例:

#!/bin/bash #这是一个基本的shell脚本

printchar=“helloworld” echo$printchar变量用来存储信息管道(|)把一个命令的输出连接到另一个命令的输入。示例:ls|sortcatfunc.txt|grep-v^# 重定向(<>)与管道相关,可以改变程序运行的输入来源和输出地点示例:sort<myfile.txt 对文件中内容进行排序sort<myfile.txt>myfile_test.txt模式匹配显示以txt为扩展名的文件或显示以a开头的文件,这种情况称为模式匹配。实现方式:正则表达式 如:ls*.txt特殊字符分号(;):允许在一行上放多个命令。eg:cd~/backup

;mkdirstartup

;cp~/.*startup/.&:命令后执行。括号():创建成组的命令。竖杆(|):管道标示符。<>&:表示重定向。*?[]!:表示模式匹配。$:变量名的开头。#:表示注释(第一行除外)。空格,制表符,换行符:当做空白。$((...)):对括号内的表达式求值eg:#!/bin/shx=0while["$x"-ne10];doecho$x

x=$(($x+1))

doneexit0特殊字符**:两个星号在运算时代表"次方"的意思

eg:"sus=2**3"echo"sus=$sus"$sus=8{}大括号:用法一:通配符扩展

eg:lsmy_{finger,toe}s

这条命令相当于如下命令的组合:

lsmy_fingersmy_toeseg:mkdir{userA,userB,userC}-{home,bin,data}用法二:可用于语句块的构造。'string'单引号和"string"双引号双引号:如果想在定义的变量中加入空格,就必须使用单引号或双引号,单、双引号的区别在于双引号转义特殊字符而单引号不转义特殊字符

eg:$heyyou=home$echo'$heyyou'$$heyyou ($没有转义)

eg:$heyyou=home$echo"$heyyou"$home ($转义了输出了heyyou变量的值)特殊字符单引号:由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释。例如:单引号:由双引号括起来的字符,除$,\,'和"这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待。[root@localhost/]#String="$PATH\\\"\$PATH"[root@localhost/]#echo$String/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:\"$PATH特殊字符双引号(“):用来使shell无法认出空格、制表符和其他大多数特殊字符,这样“DavidMedinets”表示一个值。让$反斜杠反引号不失效单引号(‘):用来使shell无法认出所有特殊字符。反引号(`):用来替换命令。反斜杠(\):用来使shell无法认出以上的特殊字符,使其后的特殊字符失去特殊含义。如:David\Medinets[root@sky/root]#touchDavid\Medinets[root@sky/root]#lsDavid\medinets放在指令前,有取消aliases(别名)的作用;放在特殊符号前,则该特殊符号的作用消失;放在指令的最末端,表示指令连接下一行(使得回车符无效,只起换行作用)正则表达式模式匹配:正则表达式正则表达式在shell、工具程序、Perl语言中有非常重要的地位。正则表达式通过一些特殊符号表示特定的字符串模式。常见的特殊字符包括:字符

功能^置于待搜索的字符串之前,匹配行首的字$置于待搜索的字符串之后,匹配行末的字\<匹配一个字的字头\>匹配一个字的字尾.匹配任意单个正文字符[str]匹配字符串str中的任意单个字符[^str]匹配不在字符串str中的任意单个字符[a-c]匹配从a到c之间的任一字符*匹配前一个字符的0次或多次出现\忽略特殊字符的特殊含义,将其看作普通字符模式匹配:正则表达式扩充的特殊字符:字符

功能+ 重复匹配前一项1次以上? 重复匹配前一项0次或1次{j} 重复匹配前一项j次{j,} 重复匹配前一项j次以上{,k} 重复匹配前一项最多k次{j,k} 重复匹配前一项j到k次s|t 匹配s或t中的一项(exp) 将表达式exp作为单项处理基本元字符集元字符含义^只匹配行首$只匹配行尾*匹配0或多个字符[]匹配[]内字符\屏蔽元字符的特殊含义.匹配任意单字符模式\{n\}匹配模式出现次数,n模式\{n,\}m模式次数,至少为n模式\{n,m\}模式出现在n,m之间模式匹配:正则表达式匹配行首/行尾行首:^行尾:$举例查找当前目录下面所有子目录ls–l|grep“^d”查找文本文件中,以a开头的行morea.txt|grep“^a”查找文本文件中,以a结尾的行morea.txt|grep“a$”查找文本文件中,所有的空行morea.txt|grep“^$”模式匹配:正则表达式匹配单个字符模式:举例..abc..可以匹配12abc34,ababc43等模式匹配:正则表达式匹配0或多个字符模式:*举例abc12*可以匹配如下abc123abc14248876abc11abc……模式匹配:正则表达式匹配单词模式:\<\>功能:匹配完整的单词举例\<[dD]ay\>模式匹配:正则表达式屏蔽特殊字符功能:将字符串中的特殊字符去掉特殊意义特殊字符$.‘“*[]^|()\+?举例匹配包含.字符的行:\.匹配包含$的行:\$匹配包含\的行:\\模式匹配:正则表达式匹配范围功能:匹配特定的字符串或字符串集举例[0123456789]或[0-9]: 匹配任意数字[A-Za-z]: 匹配任意字母a[a-zA-Z]t: a开始+任意字母+t[hH]ello: 匹配Hello或者hello[^0-9]: 匹配任一个非数字字符[^a-zA-Z]: 匹配任一个非字母字符模式匹配:正则表达式匹配模式结果出现次数pattern\{n\}匹配模式出现n次。pattern\{n,\}匹配模式出现最少n次。pattern\{n,m\}匹配模式出现n到m次之间,n,m为0-255中任意整数。模式匹配:正则表达式举例A\{2\}BAABA\{4,\}BAAAAB,AAAAAB,AAAAAAB……A\{2,4\}BAAB,AAAB,AAAAB模式匹配:正则表达式练习从如下文本中,选出日期格式符合yyyy.mm.dd的行2006-05-1713910591921chenyq2006071113301131125suwn2006.07.1913123451231aaa2005/11/2513611258734bbb过滤模式:[0-9]\{4\}\.[0-9]\{2\}\.[0-9]\{2\}模式匹配:正则表达式变量与表达式变量与运算符本地变量环境变量变量替换位置变量标准变量特殊变量影响变量的命令引号运算符表达式替换运算符优先级变量什么是shell变量本地变量环境变量变量替换位置变量标准变量特殊变量影响变量的命令本地变量本地变量在用户现在的shell生命期的脚本中存在使用。variable-name=value 设置变量及值set显示本地所有的变量readonlyvariable-name 变量只读设置后不能在设置回来了。本地变量(续)[root@jack/root]#LOCALTEST=“test”[root@jack/root]#echo${LOCALTEST}Test[root@jack/root]#readonlyLOCALTEST[root@jack/root]#LOCALTEST=“test1”Bash:LOCALTEST:readonlyvariable[root@jack/root]#readonly [-p] 查看当前设置的本地变量Declare–rLOCALTEST=“test”Declare–irUID=“0”示例:环境变量用于所有用户进程(称为子进程)。登录进程称为父进程。Shell中执行的用户进程均称为子进程。不像本地变量(只用于当前的shell),环境变量可用于所有子进程,包括编辑器、脚本和各种应用程序。$HOME/.bash_profile(/etc/profile)export 用于显示与设置环境变量env 查看环境变量eg: exportSITECH=“BeiJing” readonlySITECH 设置只读环境变量如果使用了readonly命令的话,变量就不可以被修改或清除了。示例如下:

$exportTEST=“Test...” #增加一个环境变量TEST

$readonlyTEST #将环境变量TEST设为只读

$unsetTEST #会发现此变量不能被删除

-bash:unset:TEST:cannotunset:readonlyvariable

$TEST="New" #会发现此也变量不能被修改

-bash:TEST:readonlyvariable

set、env、export区别set 显示当前shell的变量,包括当前用户的变量env 显示当前用户的变量export 显示当前导出成用户变量的shell变量每个shell有自己特有的变量(set)显示的变量,这个和用户变量是不同的,当前用户变量和你用什么shell无关,不管你用什么shell都在,比如HOME,SHELL等这些变量,但shell自己的变量不同,shell是不同的,比如BASH_ARGC,BASH等,这些变量只有set才会显示,是bash特有的,export不加参数的时候,显示哪些变量被导出成了用户变量,因为一个shell自己的变量可以通过export“导出”变成一个用户变量。

[root@linux~]#aaa=bbb

[root@linux~]#echo$aaa

bbb

[root@linux~]#set|grepaaa

aaa=bbb[root@linux~]#env|grepaaa

[root@linux~]#exportaaa

[root@linux~]#env|grepaaa

aaa=bbb环境变量用C程序来访问和设置环境变量

使用下列三个函数来设置或访问一个环境变量。

◆getenv()访问一个环境变量。输入参数是需要访问的变量名字,返回值是一个字符串。如果所访问的环境变量不存在,则会返回NULL。

◆setenv()在程序里面设置某个环境变量的函数。

◆unsetenv()清除某个特定的环境变量的函数。

有一个指针变量environ,它指向的是包含所有的环境变量的一个列表。下面的程序可以打印出当前运行环境里面的所有环境变量:

#include<stdio.h>

externchar**environ;

intmain()

{

char**var;

for(var=environ;*var!=NULL;++var)

printf("%s\n",*var);

return0;

}

还可以通过修改一些相关的环境定义文件来修改环境变量,比如对于RedHat等Linux发行版本,与环境相关的文件有/etc/profile和~/.bashrc等。修改完毕后重新登录一次就生效了。

变量替换(续)1.echo${variablename} 显示实际值到variablename中2.echo${variablename:+value}如果设置了variablename,则显示其值value,否则显示为空。3.echo${variablename:?value}如果未设置variablename,则显示用户自定义的错误信息value。4.echo${variablename:-value}如果未设置variablename,则显示其值value。否则显示原来值。5.echo${variablename:=value}如果未设置variablename,设置其值为value,并显示。变量替换(续)unset:

删除环境变量unsetvariable-name例如:[root@jack/root]#testvar=“thisisatest”[root@jack/root]#echo${testvar}Thisisatest[root@jack/root]#unsettestvar[root@jack/root]#echo${testvar}[root@jack/root]#如果是readonly的变量是不能进行取消删除的。位置变量位置变量表示形式:$0,$1,$2……$9向脚本中使用位置参数向系统命令传递参数$1、$2、$3……${10}、${11}、${12}……

:表示脚本传入的的各个参数,注意当需表示两位数以后的参数时数字要用花括号括起。$0$1$2$03$04$5$6$7$8$9脚本名字ABCDEF标准变量bash默认建立了一些标准环境变量,可在/etc/profile中定义。EXINITHOME echo${HOME}IFSLOGNAME echo$LOGNAME 获取当前登录名set|grep‘LOG‘ 与之功能等价MAILset|grep‘MAIL‘ MAIL=/usr/spool/mail/account 存放邮箱位置MAILCHECK=600 每隔600秒扫描邮箱一次MAILMSG=‘[YOUHAVENEWMAIL]‘ 邮箱信息MAILCHECK标准变量MAILPATHPATH eg:set|grep‘PATH’ 取得环境路径PS1 eg:set|grep‘PS’

改变命令提示符信息PS2SHELL eg:set|grep‘SHELL’取得当前SHELL信息TERMINFO eg:set|grep‘TERMINFO’TERM eg:set|grep‘TERM’显示终端类型TZ eg:set|grep‘TZ’表示时区EDITORPWD eg:set|grep‘PWD’ 取得当前目录信息MANPATH eg:set|grep‘MANPATH’特殊变量$#: (传递到脚本的参数个数)$*: (以一个单字符串显示所有向脚本传递的参数,与位置变量不同,此选项参数可超过9个)$$: (脚本运行的当前进程ID号)$!: (后台运行的最后一个进程的进程ID)$@: (与$#相同,但是使用时加上引号,并在引号中返回每个参数)$-: (显示shell使用的当前选项,与set命令功能相同)$?: (显示最后命令的退出状态。0表示没有错误,其它任何值表示有错误)影响变量的命令readonly用于显示或设置只读变量--

表明选项结束-f

创建只读变量set设置或重设各种shell影响变量的命令unset用于取消变量的定义--表明选项结束-f删除只读变量,但不能取消从shell环境中删除指定的变量和函数。 如: PATH,PS1,PS2,PPID,UID,EUID等的设置。运算符运算符类型位运算符~,<<,>>,&,|,^$[]表示对方括号中的表达式进行求值$[2^4] 例如:#!/bin/bash#$[]

表示举例echo$[2+8]运算符位运算符运算符说明~op1反运算符,把op1中所有的二进制位的1变为0,0变为1。op1<<op2左移运算符,把op1中的二进制位向左移动op2位,忽略最左端移出的各位,最右端的各位补上0值,每做一次按位左移就有实现op1乘以2op1>>op2右移运算符,把op1中的二进制位向右移动op2位,忽略最右端移出的各位,最左端的各位补上0值,每做一次按位右移就有实现op1除以2op1&op2与比较运算符,比较op1和op2对应位,对于每个二进制位来说,如果二者该位都是1,则结果为1;否则,结果为0。op1^op2异或比较运算符,比较op1和op2对应位,对于每个二进制位来说,如果二者该位互补,则结果为1;否则,结果为0。op1|op2或运算符,比较op1和op2对应位,对于每个二进制位来说,如果二者该位有一个是1或者都是1,则结果为1;否则,结果为0。运算符运算符类型逻辑运算符赋值运算符运算符说明&&与运算符||或运算符>,<,==,!=+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=eg: var=65 letvar+=4 echo$var //69表达式替换$[]和$((**))习惯使用$[],所有shell的求值都是用整数完成。$[]可以接受不同基数的数字[base#n]n表示基数从2到36的任何基数。eg:八进制的10加1,结果为9echo$[10#8+1]9运算符优先级级别运算符说明级别运算符说明13-,+正,负12!,~逻辑非,按位取反或补码11*,/,%乘,除,取模10+,-加,减9<<,>>按位左移,按位右移8<=,>=,<,>7==,!=等于,不等于6&按位与5^按位异或4|按位或3&&逻辑与2||逻辑或1=,+=,-=,*=,/=,%=,^=,<<=,>>=,&=赋值、运算且赋值较高运算级别的运算符优先于低级别的运算符进行求值运算。小结本地变量环境变量变量替换位置变量标准变量特殊变量影响变量的命令引号运算符表达式替换运算符优先级SHELL输入、输出echoreadcat管道tee文件重定向Shell输入、输出控制echo显示文本或变量,或者把字符串输入到文件命令格式echostring-e表示解析转义字符-n回车不换行,linux默认回车换行控制字符:\c-不换行;\t-跳格;\n-换行举例echo“What’syour\nname:\c”readnameecho$LOGNAMEecho示例:echo举例#!/bin/bash#echodecho–e“Thisecho’s3newlines\n\n\n\n”echo“OK”echoecho“Thisecho’s3newlines\n\n\n\n”echo“Thelogfileshaveallbeendone”>mylogfile.txtread从键盘或文件的某一行文本中读入信息,并将其赋给一个变量命令格式read变量1变量2…举例$readname1name2tomjerrybobread示例:#!/bin/bash#readnameecho–n“FirstName”readfirstnameecho–n“LastName:”readlastnameecho–e“YourFirstNameis:${firstname}\n”echo–e“YourLastNameis:${lastname}\n”read举例文件重定向标准输出、输入及错误在shell中执行命令时,每个进程都和三个打开的文件相关联,并使用文件描述符来引用这些文件。由于文件描述符不容易记忆,shell同时也给出了相应的文件名。文件文件描述符输入文件——标准输入0(缺省是键盘,也可以是文件或其他命令的输出)输出文件——标准输出1(缺省是屏幕,也可以是文件)错误输出文件——标准错误2(缺省是屏幕,也可以是文件)文件重定向改变程序运行的输入来源和输出地点1.command>filename把标准输出重定向到一个新文件中2.command>>filename把标准输出重定向到一个文件中(追加)3.command1>filename把标准输出重定向到一个文件中4.command>filename2>&1把标准输出和标准错误一起重定向到一个文件中5.command2>filename把标准错误重定向到一个文件中6.command2>>filename把标准输出重定向到一个文件中(追加)文件重定向改变程序运行的输入来源和输出地点7.Command>>filename2>&1把标准输出和标准错误一起重定向到一个文件中(追加)8.Command<filename>filename2command命令以filename文件作为标准输入,以filename2文件作为标准输出9.Command<<delimiter从标准输入中读入,直至遇到delimiter分界符10.Command<&m把文件描述符m作为标准输入11.Command>&m把标准输出重定向到文件描述符m中12.Command2<&-关闭标准输入例1:将myfle1作为sort的输入。

$sort<myflle1

例2:将date的输出转向到myfile2文件中。

$date>myfile2

例3:将Is-l的输出追加到myfile3文件中。

$Is-l>>myfile3

例4:将myprogram错误输出改向到err_file文件。$myprogram2>err_file文件重定向举例重定向标准输出示例catfile|sort1>sort.out 第3种情况catfile|sort>sort.out 第1种情况pwd>>path.out 第2种情况>nullfile.txt 创建一个文件重定向标准输入示例sort<file 将file文件中的数据作为输入,sort对其进行排序,然后将排序后的结果输出到屏幕上sort<name.txt>name.out 第8种情况对排序后的内容输出到name.out文件中文件重定向举例标准输入示例:

第9种情况[root@jackshell]#cat>>term.txt<<SITECH>Hello,thereIamusinga$TERM!>andmyusernameis$LOGNAME>bye…>SITECH[root@jackshell]#catterm.txtHello,thereIamusingavt100!andmyusernameisrootbye…文件重定向举例重定向标准错误示例:

[root@jackshell]#grep“trd”book.txtGrep:missiles:Nosuchfileordirectory[root@jackshell]#grep“trd”book.txt2>/dev/null解释:表示把错误信息扔给/dev/null,/dev/null不会保存错误信息,实质就是丢失错误信息。如果sky.txt不存在,则错误信息存入到一个指定的文件中,如: ls-alsky.txt2>err_message.txt文件重定向举例结合使用标准输出与标准错误示例:

[root@jackshell]#cataccount_new.txt\Account_old.txt1>accounts.out2>accounts.err[root@jackshell]#cataccounts.out???[root@jackshell]#cataccounts.err???文件重定向举例将2个文件的内容重定向到accounts.out中,如果某一个文件不存在,或出错,则将错误信息重定向到错误文件中accounts.err合并标准输出与标准错误示例:

合并的时候shell是从左到右分析相应命令 grep“standard”standard.txt>grep.out2>&1->如果文件不存在,则把错误信息记录到grep.out中->如果文件存在,也把正确的信息记录到grep.out中文件重定向举例重定向标准输出ls–l>ls.outls–l>>ls.out重定向标准输入sort<name.txt重定向标准错误a.sh2>/dev/null组合重定向find.–name“*.log”>find.log2>&1练习echoreadcat管道 重点掌握tee文件重定向 重点掌握小结SHELL控制结构条件测试shell的内部命令里面有测试条件的语法test给ifwhile用testcondition

或者

[condition]条件测试文件状态测试逻辑操作符字符串测试数值测试expr文件状态测试格式:test状态或[状态]举例test–wstudent.txtecho$?[-xstudent.txt]echo$?[-efile]文件存在

[-d/etc/]目录存在

[-sfile]文件大小大于0

[-rfile]文件可读

[-bfile]区块文件

[-cfile]字符文件

[-ffile]一般文件

[-wfile]文件可写

[-xfile]文件可执行

[-kfile]设定了限定位

[-gfile]设定了组位

[-ufile]设定了userid

[-pfile]管线[-ofile]如果当前用户拥有filename,则为真字符串测试命令格式[操作符字符串][字符串操作符字符串]举例[-z$EDITOR][$EDITOR=“vi”]操作符含义=相等!=不等-z空串-n非空串数值测试命令格式”数字1“

操作符”数字2“[”数字1“

操作符“数字2”]举例[”100“–lt“110”]echo$?$NUMBER=100[“$NUMBER–ge110]echo$?["900"-le"901"-a"100"-gt"99"]echo$?操作符含义-eq等于-ne不等于-gt大于-lt小于-le小于等于-ge大于等于逻辑操作符逻辑操作符-a

逻辑与-o

逻辑或!逻辑否举例[-xstudent-a-wstudent]echo$?expr命令格式expr参数操作符参数增量计数LOOP=0LOOP=`expr$LOOP+1`数值测试模式匹配条件测试-小结文件状态测试逻辑操作符字符串测试数值测试expr控制流结构流控制ifthenelse:条件测试case:匹配模式、单词或值循环for循环until循环while循环ifthenelse语句语法格式:if条件1 then 命令1elif条件2 then 命令2else命令3fi示例:if["10"-lt"11"]thenecho"10islessthan11"fiifthenelse语句#!/bin/sh#ifsamples2echo-n"Enteryourname:"readNAMEif["$NAME"=""]||[-z$NAME]then echo"sorry,youdidnotenteraname"else echo"youentered$NAME"fi示例:#!/bin/sh#ifcpifcpmyfile.bakmyfile;then echo“goodcopy"else echo“‘basename$0’:errorcouldnotcopythefiles”>&2fiifthenelse语句#!/bin/sh#ifelifecho-n"Enteryourname:"readNAMEif["$NAME"=""]||[-z$NAME];then echo“Youdidnotenteraname.“elif["$NAME"=“root"]; echo“Helloroot.“elif["$NAME"=“jack"]; echo“Hellojack.“else echo"youarenotorjack,buthi,$NAME”fi示例:case语句语法格式:case值in

模式1)

命令1 … ;;

模式2)

命令2 … ;;esac模式匹配: *表示任意字符 ?表示任意单个字符 [abc]

a、b或c三字符其中之一

[a-n]

从a到n的任一字符

|

多重选择case语句#!/bin/sh#casetest1echo-n"enteranumberbetween1and3pls.:"readNUMcaseNUMin1)echo"youentered1";;2)echo"youentered2";;3)echo"youentered3";;Y|y)echo“youentered$NUM”;;*)echo"`basename$0`"exit1;;esac示例:for循环语法格式:for变量名in列表do

命令1

命令2 ……donefor循环#!/bin/sh#fortest1forloopin12345do echo$loopdone示例:#!/bin/sh#fortest2forloopin“isthisyourpen?”do echo$loopdone列表换为:isthisyourpen?或`catmyfile`for循环#!/bin/sh#fortest3BAK=".bak"forloopin`ls`do echo"backup$loopto$loop$BAK" cp$loop$loop$BAKdone示例:for循环#!/bin/sh#fortest4counter=0forfilesin*do counter=`expr$counter+1`doneecho"Thereare$counterfilesin`pwd`"示例:for循环将.foo后缀的文件批量改名为.bar后缀。

forfin*.foo;do

base=`basename$f.foo`

mv$f$base.bardone示例:将大写文件名改为小写文件名。

forfin*;do

mv$f`echo$f|tr'[A-Z]''[a-z]'`

doneuntil循环语法until条件命令1命令2…done示例: #!/bin/sh #untiltest2 counter=0 echo$counter until["$counter"-ge"100"] do counter=`expr$counter+1` echo$counter done条件发生在循环末尾,至少执行一次循环until循环示例: #!/bin/sh #until_mon part=“/backup”#得到磁盘使用的百分比

LOOK_OUT=`df|grep$part|awk‘{print$5}’|sed‘s/%//g’` echo$LOOK_OUT until["$LOOK_OUT"-gt“90"] do echo“文件备份已经快满了!”|mailroot LOOK_OUT=`df|grep$part|awk‘{print$5}’|sed‘s/%//g’` sleep3600 donenohup./文件名.sh 后台运行程序休息3600秒while循环语法格式:while条件do

命令1

命令2 ……donewhile循环#!/bin/sh#whiletest1counter=0echo$counterwhile["$counter"-lt"100"]do counter=`expr$counter+1` echo$counterdone示例1:while循环#!/bin/sh#whiletest2whilereadLINEdoecho$LINEdone<a.sh示例2:表示从a.sh文件中一行行读出数据到LINE中,循环输出while循环yymm=200810no=10low=0con_db=dbaccopr/accoprdb152@ACCDBtab_name=all_owedet_tmpsrc=dcustowesqlplus-s${con_db}<<!droptable${tab_name};createtable${tab_name}(……);while[${no}-lt100]doif[$no-lt10]thensqlplus-s${con_db}<<!insertinto${tab_name}select字段,….from${src}${yymm}${low}${no};commit;elif[$no-lt100]theninsertinto${tab_name}selectcontract_no,id_no,fee_code,detail_code,cust_id,payed_status,should_payshould,favour_feefavour,payed_prepayfrom${src}${yymm}${no};

fino=`expr${no}+1`doneexit!示例3while循环yymm=200810num=10low=0con_db=dbaccopr/accoprdb152@ACCDBtab_name=all_owedet_tmpsrc=dcustowesqlplus-s${con_db}<<!while[${num}-lt100]doecho${num};insertinto${tab_name}

selectcontract_no,id_no,fee_code,detail_code,cust_id,payed_status,should_payshould,favour_feefavour,payed_prepayfrom${src}${yymm}${num};commit; num=`expr${num}+1`}doneexit!示例4:循环控制break跳出循环continue不会跳出循环,跳过本次循环,进入下一次循环循环控制举例示例:#!/bin/sh#breakoutwhile:doecho–n“Enteranynumber[1…5]:” readANS case$ANSin 1|2|3|4|5) echo“您键入正确的数字.” ;; *) echo“错误的输入”

break ;; esacdone:表示永远为真循环控制举例示例:#!/bin/sh#breakoutwhile:doecho–n“Enteranynumber[1…5]:” readANS case$ANSin 1|2|3|4|5) echo“您键入正确的数字.” ;; *) echo“错误的输入,是否继续(y/n)?”

readIS_CONTINUE case$IS_CONTINUEin y|yes|Y|YES) continue ;;

*)

break ;;

esac esacdoneSHELL实例设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行。考答案:建立程序如下:

#!/bin/sh

i=1

while[i-le50]

do

if[-d/userdata];then

mkdir-p/userdata/user$i

chmod754/userdata/user$i

echo"user$i"

let"i=i+1"(或i=$(($i+1))

else

mkdir/userdata

mkdir-p/userdata/user$i

chmod754/userdata/user$i

echo"user$i"

let"i=i+1"(或i=$(($i+1))

fi

done练习编写一个菜单界面1:显示当前目录下所有文件2:显示当前目录下所有文件大小3:使用vi编辑器4:查看当前系统中登陆的用户q:退出菜单控制流结构-小结流控制ifthenelse:条件测试case:匹配模式、单词或值循环for循环until循环while循环循环控制breakcontinueSHELL函数shell函数函数定义参数传递函数文件检查载入和删除函数函数的返回函数定义情况一:函数名(){

命令1

命令2

……}情况二:function

函数名(){

命令1

命令2

……}函数定义#!/bin/sh#funcfunctionhello(){echo“你好,今天是:`date`”}echo“======================“helloecho“======================“示例1:函数定义#!/bin/shdisksum(){echo`ls-l|awk'/^[^d]/{total+=$5}END{print"Totalsizeis:"total}'`}disksum示例2:函数定义#!/bin/shdisksum(){echo`ls-l|awk'/^[^d]/{total+=$5}END{print"Totalsizeis:"total}'`}disksum示例:参数传递#!/bin/sh#funcfunctionhelo(){echo“你好,$1今天是:`date`”}echo“======================“hellojackecho“======================“示例:向函数传递参数就是在脚本中使用位置变量:$1,$2,$3……$9函数文件将常用函数整理,放在函数文件中,并载入shell创建函数文件#!/bin/sh定位文件.函数名检查载入函数set执行shell函数函数名删除shell函数unset函数名函数文件举例示例:#!/bin/sh#func.hellofunecho“======================“helloecho“======================“#!/bin/sh#hellofunfunctionhelo(){ echo“你好,$1今天是:`date`” return1}检查载入函数和删除函数查看载入函数Set删除函数unset检查载入函数和删除函数举例示例:#!/bin/sh#func.hellofunset

表示显示载入状态unsethello

表示删除hello函数调用echo“======================“helloecho“======================“#!/bin/sh#hellofunfunctionhelo(){ echo“你好,$1今天是:`date`” return1}函数的返回return返回状态值不能当成变量的返回对待!使用return返回脚本中函数调用的下一语句return:用最后状态命令决定返回值return0:无错误返回return1:有错误返回函数的返回举例示例#!/bin/sh#hellofunctionfunctionhelo(){ echo“你好,$1今天是:`date`” return0}#!/bin/sh#func.hellofunctionsetecho“=============================“helloecho$?echo“=============================“$?取得调用函数返回的状态值shell函数-小结函数定义参数传递函数文件检查载入和删除函数函数的返回目的:将文本的ShellScript文件设为可执行的ShellScript

对任何操作系统而言,文本文件不具备直接执行的功能。Dos系统通过赋予批处理文件(.bat)的类型,使之执行。UNIX系统采用将ShellScript文件权限设定成可执行,或利用shell的内建机制,使ShellScript文件具备执行的功能必要条件:将shellscript文件权限设为可执行

chmodu+xfilename只有用户自己可执行,其它人不能执行

chmodug+xfilename仅用户及同组人可执行,其它人不能执行

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论