《linux shell编程总结.doc》由会员分享,可在线阅读,更多相关《linux shell编程总结.doc(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、linux shell编程总结 本周学习了unix/linux shell编程,参考的是LINUX与UNIX Shell 编程指南,David Tansley著;徐焱,张春萌等译,由机械工业出版社出版的了,往内页那么一翻,都是2000年3月译的了,原书估计会更老,不过图书馆能找到合适于我这种初学者的也许就这么本了,将就着的吧。 这本书是以Bourne shell这个UNIX系统都支持的标准shell。Bourne Again shell(BASH)、TCSH shell和Z shell它们都是相应的UNIX命令解释程序的增强型版本。BASH shell是Bourne shell的高级版本。TC
2、SH 原来是为UNIX的BSD版本开发的C shell的增强型版本。1.基本unix/linux命令 (1) setuid,guid 作用: suid意味着如果某个用户对属于自己的shell脚本设置了这种权限, 那么其他用户在执行这一脚本时也会具有其属主的相应权限。 guid执行相应脚本的用户将具有该文件所属用户组中用户的权限 例:chmod 4755(2) chmod,chown,chgrp 作用:修改权限 格式:chmod who operator permission filename who:u(文件属主) g(同组用户) o(其他用户) a(所有用户) operator: +(增加权
3、限) -(取消权限) =(设定权限) permission:r(读) w(写) x(执行) s(文件属主和组set-ID) t(粘性位*) l(给文件加锁,使其他用户无法访问) 例:chmod ugo+rwx myfile 将myfile文件给u,g,o用户r,w,x的权限(3) umask 作用:设置所创建文件/目录的缺省权限 格式:umask value 例: umask 022 touch file1 则file1的权限部分变为:-rw-r-r-(4) ln 格式:ln -s source_path target_path(5) touch 作用:创建一个空文档 格式:tough myf
4、ile 注解:tough myfile将创建一个文件myfile(6) find 作用:搜索文件 格式:find pathname -options -print -exec -ok -print:find命令将匹配的文件输出到标准输出 -exec:find命令对匹配的文件执行该参数所给出的shell命令,相应命令的格式为command ; -ok:作用和-exec作用相同。只不过每一步执行都需要用户的确认 -options:(主要的) -name:按文件名查找 -perm:按文件权限查找 -prune:使find命令不在当前指定的目录中查找 -user:按照文件属主查找 -group:按照文
5、件所属组来查找 -mtime -n +n,按照文件的更改时间来查找,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前;此外,还有-atime,-ctime选项,和-mtime选项类似 -type:查找某一类型的文件,诸如:b(块设备文件),d(目录),c(字符设备文件),p(管道文件),l(符号链接文件),f(普通文件) -size nc:查找文件长度为n块的文件 例: 在当前目录及其子目录中查找所有的*.txt文件 find . -name *.txt -print 在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件 fin
6、d . -perm 755 -print 在当前目录下查找除目录以外的所有类型的文件 find . ! -type d -print 用ls -l 命令列出所匹配的文件 find . -type f -exec ls -l ; 在/logs目录中查找更改时间在5日以前的文件并删除它们 find logs -type f -mtime +5 -exec rm ;(7)echo 作用:显示文本行或变量,或者把字符串输入到文件 格式:echo string 例: 给出提示符,并输入值给变量name echo Whats your name:c read name(8)pg 作用:显示文件 格式:pg
7、 filename(9)read 作用:读入值给变量 格式:read var 例: read name 从键盘读入字符到name变量(10)cat 作用:显示文件 格式:cat filename(11)tee 作用:把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中 格式:tee filename 例:who | tee who.out 使用who命令,结果输出到屏幕上,同时保存在who.out文件中(12)grep(全局正则表达式) 作用:允许对文本文件进行模式查找,如果找到匹配模式,grep打印包含模式的所有行 格式: grep options 基本正则表达式 文件 常用opti
8、ons值: -c 只输出匹配行的计数 -i 不区分大小写(只适用于单字符) -h 查询多文件时不显示文件名 -l 查询多文件时只输出包含匹配字符的文件名 -n 显示匹配行及行号 -s 不显示不存在或无匹配文本的错误信息 -v 显示不包含匹配文本的所有行 例:grep sort *.doc 在当前目录下所有的.doc文件中查找字符串sort grep 48 data.f 抽取字符串后有一个键 grep 0-93.0-03. ipfile 要抽取其中所有nnn.nnn的IP地址(原文印刷错误?)(13)awk 格式: awk -f field-separator command input-fil
9、e(s)= awk条件操作符=操作符 描述 操作符 描述= 大于等于= 小于等于 匹配正则表达式= 等于 ! 不匹配正则表达式!= 不等于 = awk内置变量-ARGC 命令行参数个数ARGV 命令行参数排列ENVIRON 支持队列中系统环境变量的使用FILENAME awk浏览的文件名FNR 浏览文件的记录数FS 设置输入域分隔符,等价于命令行-F选项NF 浏览记录的域个数NR 已读的记录数OFS 输出域分隔符ORS 输出记录分隔符RS 控制记录分隔符 注:awk中所采用的正则表达式的符号要比grep和sed多两个:+(匹配一个或多个字符),?(匹配模式出现率)例: awk if($4/Br
10、own/) print $0 grade.txt 如果field-4包含了Brwon,打印该行 awk $3 = 48 print $0 grade.txt 精确匹配,如果field-3等于了 48,则打印该行 awk if( $1=p1 & $4=p2 ) print $0 grade.txt 同时满足两个条件,则打印该行 awk if( $1=p1 | $4=p2 ) print $0 grade.txt 只要满足其中一个条件,则打印该行(14)expr 用于计算或数值测试 格式:expr argument operator argument 例: expr 10 + 10 其结果为20
11、expr 30 / 3 其结果为10 expr 30 * 3 其结果为90,使用乘号时,必须用反斜线屏蔽其特定含义。 expr rr + 1 当rr非整数时,将返回错误,此处为expr:non-numeric argument2.文件名的匹配 特殊的匹配符号: * 匹配文件名中的任何字符串,包括空字符串 ? 匹配文件名中的任何单个字符串 . 匹配中包含的任何字符 !. 匹配中非感吧号!之后的字符 例: 显示所有以.doc结尾的文件名 ls *.doc 显示以cl开头,后面跟任何字符串,最后以.sed结尾的文件名 ls cl*.sed 显示任意两个字符开头,接着是r,后面跟任何字符的文件 ls
12、?r* 显示以i或o开头的文件名 ls io* 匹配所有以log.开头,后面跟随一个数字,然后可以是任意字符串的文件名 ls log.0-9* 匹配所有以log.开头,使用!0-9来表示非数字开头的字符串 ls log.0-9*3.文本过滤 = 基本元字符集及其含义= 只匹配行首$ 只匹配行尾* 一个单字符后紧跟*,匹配0个或多个此单字符 匹配内字符。可以是一个单字符,也可以是字符序列,用-表示范围 如用1-5代替12345 用来屏蔽一个元字符的特殊含义。如$ . * | ( ) + ?. 匹配任意单字符patternn 用来匹配前面pattern出现次数。n为次数patternn,m 含义同
13、上,但次数最少为npatternn,m 含义同上,但pattern出现次数在n与m之间=例: $ 匹配一个空行 .$ 匹配只包含一个字符的行 compu*t 匹配字符u 0次或多次,这个可匹配computer, A2B 匹配字母A出现两次,并以B结尾 A2,4B 匹配字母A出现2到4次之间4.特定shell变量 =$# 传递到脚本的参数个数$* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个$ 脚本运行的当前进程ID号$! 后台运行的最后一个进程的进程ID号$ 与$#相同,但是使用时加引号,并在引号中返回每个参数$- 显示shell使用的当前选项,与set命令功能
14、相同$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误=其他:$0(脚本名字) $1 $2 $3 .$95.shell输入与输出 5.1文件描述符 = 文件描述符 文件 0 输入文件标准输入 1 输出文件标准输出 2 错误输出文件标准错误= 注: 标准输入是文件描述符0,它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出 标准输出是文件描述符1,它是命令的输出,缺省是屏幕,也可以是文件 标准错误是文件描述符2,它是命令错误的输出,缺省是屏幕,也可以是文件5.2 重定向 :,=commandfilename 把标准输出重定向到一个新文件中commandfilename 把标
15、准输出重定向到一个文件中(追加)command 1filename 把标准输出重定向到一个新文件中commandfilename 2&1 把标准输出和标准错误一起重定向到一个文件中command 2filename 把标准错误重定向到一个新文件中command 2filename 把标准错误重定向到一个文件中(追加)command filename 2&1 把标准输出和标准错误一起重定向到一个文件中(追加)command filename 2 command命令以filename文件作为标准输入,以filename2文件作为标准输出command &m 把标准输出重定向到文件描述符m中comm
16、and &- 关闭标准输入=例:#! /bin/sh# f_desc#把文件描述符4指定为标准输入,然后打开stock.txt文件exec 4&0 0stock.txt#读入2行文本read line1 read line2 #作为标准输入的文件描述符4被关闭exec 0跳出指定的循环个数。如break 2则跳出2个循环 continue =跳出循环当前步2)流控制if.then.else.fi if condition1 then command1 elif condition2 then command2 else command3 fi例1:#! /bin/sh# ifwrLOGFILE
17、=test.txtecho $LOGFILEif ! -w $LOGFILE ; then echo You cannot write to $LOGFILE &2fi#例2:#! /bin/sh# ifcp#下面用2&1重定向标准错误,去除了系统产生的错误和系统输出if cp myfile myfile.bak /dev/null 2&1 ; then echo good copyelse echo basename $0:error could not copy the files &2fi#例3: #! /bin/sh# ifcp#将脚本参数传入系统命令#此处检测目录是否为空DIRECT
18、ORY=$1if ls -A $DIRECTORY = ; then #也可用 if $# -lt 1 来代替判断语句 echo $DIRECTORY is indeed emptyelse echo $DIRECTORY is not empty &2fi#例4: #! /bin/sh# ifmkdir#将脚本参数传入系统命令#此处检测目录是否为空DIRECTORY=$1if $DIRECTORY = ; then echo Usage: basename $0 directory to create exit 1fiif -d $DIRECTORY then : # do nothinge
19、lse echo The directory does exist echo -n Create it now? y.n : read ANS if $ANS = y | $ANS = Y then echo creating now mkdir $DIRECTORY /dev/null 2&1 if $? != 0 ; then echo Errors createing the directory $DIRECTORY &2 exit 1 fi else : # do nothing fifi#3)case控制流 case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成
20、功,执行相匹配的命令。 格式:= case 值 in 模式1) 命令1 . ; 模式2) 命令2 . ; esac=注:每一模式必须以右括号结束,取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至“;”取值将检测匹配每一个模式,一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号*捕获该值,再接受其他输入 模式部分可能包括元字符,与在命令行文件扩展名例子中使用过的匹配模式类型相同,即*(任意字符),?(任意单字符),.(类或范围中任意字符) 例1:#! /bin/sh# casetermecho choices are.vt100,vt1
21、02,vt220echo -n enter your terminal type :read TERMINALcase $TERMINAL in vt100|vt102) TERM=vt100 ; vt220) TERM=vt220 ; *) echo basename $0:Unknow response &2 echo setting it to vt100 anyway,so there TERM=vt100 ;esacexport TERMecho Your terminal is set to $TERM#例2:#! /bin/sh# caseparamif $# !=1 ; the
22、n echo Usage:basename $0 start|stop|help &2 exit 1fi#assign the parameter to the variable OPTOPT=$1case $OPT in start) echo starting.basename $0 ; stop) echo stopping.basename $0 ; help) ; *) echo Usage:basename $0 start|stop|help ;esac#4)循环 for格式 =for 变量名 in 列表do 命令1 命令2 . 命令ndone=注:列表可以包含替换,字符串和文件
23、名例1:#! /bin/sh# for_ifor loop in 1 2 3 4 5 #for loop in orange red blue greydo echo $loopdone#例2:#! /bin/sh# for_lsfor loop in ls do echo $loopdone#例3:#for params,不使用in列表选项时,实际上等价于#for params in $ 或#for params in $*#! /bin/sh# for_paramfor loop in $ # 也可以是$*, 这可以从命令行中取得参数do echo $loopdone#until(不常用)
24、格式 =until 条件do 命令1 命令2 . 命令ndone=例1:监视文件系统容量,当它达到一定水平时通知超级用户#! /bin/sh# until_monLOOK_OUT=df | grep /logs | awk print $5 | sed s/%/gecho $LOOK_OUTuntil $LOOK_OUT -gt 90 do echo Filesystem.logs is nearly full | mail root exit 0 done#while格式 =while 命令do 命令1 命令2 . 命令ndone=例1:从文件中读取数据,使用重定向以保证从文件中读取数据#!
25、 /bin/sh | SAVEDIFS=$IFS# whileread | IFS=:while read LINE | while read NAME DEPT IDdo | do echo $LINE | echo -e $NAMEt $DEPTt $IDdone names.txt | done names.txt | IFS=$SAVEDIFS#上面右边使用IFS将域分隔符改为;号而不是空格或tab键测试数据names.txt:Louise Conrad:Accounts:Acc889Peter James:Payroll:PR483#死循环格式 while :do 命令done例2:
26、#! /bin/sh# menu#set the date,user and hostname upMYDATE=date +%d/%m/%YTHIS_HOST=hostname -sUSER=whoami#loop forever !while :do # clear the screen tput clear # here documents starts here cat read CHOICE case $CHOICE in 1) ls ; 2) vi ; 3) who ; H|h) cat MAYDAY this is the help screen,nothing here yet to help you ! MAYDAY ; Q|q) exit 0 ; *) echo -e t007Unknown user response