《Linuxshell编程学习笔记15506.pdf》由会员分享,可在线阅读,更多相关《Linuxshell编程学习笔记15506.pdf(28页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Linux shell 编程学习笔记 第一章:shell基础 umask -查看当前用户创建文件或文件夹时的默认权限 eg:testszbirdora 1$umask 0002 testszbirdora 1$ls-lh-rw-rw-r-test test myfile drwxrwxr-x test test 1 上面的例子中我们看到由test默认创建的文件myfile和文件夹1 的权限分别为664,775.而通过 umask查到的默认权限为 002.所以可以推断出 umask的计算算法为:umask file directory 0 6 7 1 5 6 2 4 5 3 3 4 4 2 3
2、1 2 0 1 0 0 连接 ln 硬连接 ln sourcefile targetfile 连接后的 target文件大小和 source文件一样 软连接 ln-s sourcefile targetfile 类似于 windows的快捷方式 shell script 基本结构#!/bin/bash -bash shell开头必须部分#description -注释部分(可有可无,为了阅读方便最好加以说明)variable name=value -变量部分,声明变量,赋值 control segment -流程控制结构,如判断、循环、顺序 eg.helloworld.sh#!/bin/bas
3、h#This is a helloworld shell script printchar=hello world echo$printchar testszbirdora 1$sh helloworld.sh hello world shell 特性 别名 alias eg.alias ll=“ls-l”管道 a|b 将 a 命令的输出作为 b 命令的输入 eg.ls|sort 将 ls 列举的项排序 命令替换 a b 将 b 命令的输出作为 a 命令的输入 eg.ls cat myfile 列举出 cat myfile的输出项 后台运行 nohup command&可通过 jobs-l 查
4、看后台运行的脚本 重定向 ,PWD -当前目录 MAILCHECK -每隔多少秒检查是否有新邮件 testszbirdora 1$echo$MAILCHECK 60 SHELL MANPATH -帮助文档位置 TERMINFO -终端信息 特殊变量$#传递到脚本的参数个数$*以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过 9 个$脚本运行的当前进程 ID 号$!后台运行的最后一个进程的进程 ID 号$传递到脚本的参数列表,并在引号中返回每个参数$-显示 shell使用的当前选项,与 set命令功能相同$?显示最后命令的退出状态,0 表示没有错误,其他表示有错误 eg.#!/
5、bin/bash#parm echo this is shellname:$0 echo this is parm1:$1 echo this is parm2:$2 echo show parm number:$#echo show parm list:$*echo show process id:$echo show precomm stat:$?testszbirdora 1$sh parm.sh a b this is shellname:parm.sh this is parm1:a this is parm2:b show parm number:2 show parm list:
6、a b show process id:24544 show precomm stat:0 影响变量的命令 declare 设置或显示变量 -f 只显示函数名 -r 创建只读变量 -x 创建转出变量 -i 创建整数变量 使用+替代-,可以颠倒选项的含义 export -p 显示全部全局变量 shiftn 移动位置变量,调整位置变量,使$3 赋予$2,使$2 赋予$1 n 前移 n typeset 和 declare同义 注意:双引号不能解析$,三个字符,所以在双引号中可以引用变量、转义字符、替换变量 单引号可以解析,所以单引号中引用变量等无效 testszbirdora 1$echo$test
7、 test testszbirdora 1$echo$test$test 运算符类型 按位运算符 取反 右移运算符&与|或 异或$表示形式告诉 shell对方括号中表达式求值$a+b 2.逻辑运算符&|,mylogfile.txt testszbirdora$sh echod.sh this echos 3 newlne OK this is echos 3 ewlinennn 上面可以看到有-e 则可以解析转移字符,没有不能解析。echo空输出为空 2.read 可以从键盘或文件的某一行文本中读入信息,并将其赋给一个变量 read variable1 variable2 eg.#!/bin/
8、bash#readname echo-n first name:read firstname echo-n last name:read lastname echo this name is$firstname$lastname 3.cat 显示文件的内容,创建内容,还可以显示控制字符 cat optionsfilename1 filename2 -v 显示控制字符(Windows文件)cat命令不会分页显示,要分页可以采用 more、less 4.管道|5.tee 把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中,一般与管道合用 tee options files -a 在文件中
9、追加 eg.testszbirdora 1$echo|tee myfile testszbirdora 1$cat myfile 将 myfile文件置空 6.文件重定向 commandfilename -覆盖输出 commandfilename -追加输出 commandfilename&1 -把标准输出和标准错误重定向 commanddelimiter -输入直到delimiter分解符 commandfilename -输入文件内容到命令 commandnullfile.txt -创建字节为 0 的文件 command1command3 -按从左到右顺序执行 eg.说明:myfile为空
10、间 testszbirdora 1$df-lhmyfile testszbirdora 1$cat myfile Filesystem Size Used Avail Use%Mounted on/dev/sda1 20G 3.3G 16G 18%/none 2.0G 0 2.0G 0%/dev/shm/dev/sda2 79G 17G 59G 23%/u01/dev/sda4 28G 3.9G 22G 15%/u02 testszbirdora 1$df-lhmyfile testszbirdora 1$cat myfile Filesystem Size Used Avail Use%Mo
11、unted on/dev/sda1 20G 3.3G 16G 18%/none 2.0G 0 2.0G 0%/dev/shm/dev/sda2 79G 17G 59G 23%/u01/dev/sda4 28G 3.9G 22G 15%/u02 testszbirdora 1$df-lhmyfile testszbirdora 1$cat myfile Filesystem Size Used Avail Use%Mounted on/dev/sda1 20G 3.3G 16G 18%/none 2.0G 0 2.0G 0%/dev/shm/dev/sda2 79G 17G 59G 23%/u0
12、1/dev/sda4 28G 3.9G 22G 15%/u02 Filesystem Size Used Avail Use%Mounted on/dev/sda1 20G 3.3G 16G 18%/none 2.0G 0 2.0G 0%/dev/shm/dev/sda2 79G 17G 59G 23%/u01/dev/sda4 28G 3.9G 22G 15%/u02 testszbirdora 1$cat myfile China Hubei Suizhou exit testszbirdora 1$cat myfile China Hubei Suizhou 7.exec 可以用来替代当
13、前 shell。现有任何环境变量都会清除 第四章 控制流结构 1.if 语句 if 条件 1 then 命令 1 elif 条件 2 then 命令 2 else 命令 3 fi-if 条件 then 命令 fi eg:#!/bin/bash#if test#this is a comment line if 10-lt 12;then#yes 10 is less than 12 echo yes,10 is less than 12 else echo no fi 注意:if 语句必须以 fi 终止 10 前一个空格,“12”后也有一个空格。这个条件都是通过 test 命令来指定。条件表达
14、为 test expression 或者expression 条件表达式中的比较函数 man test NAME test-check file types and compare values SYNOPSIS test EXPRESSION EXPRESSION OPTION DESCRIPTION Exit with the status determined by EXPRESSION.-help display this help and exit -version output version information and exit EXPRESSION is true or f
15、alse and sets exit status.It is one of:(EXPRESSION)EXPRESSION is true !EXPRESSION EXPRESSION is false EXPRESSION1-a EXPRESSION2 both EXPRESSION1 and EXPRESSION2 are true EXPRESSION1-o EXPRESSION2 either EXPRESSION1 or EXPRESSION2 is true -n STRING the length of STRING is nonzero -z STRING the length
16、 of STRING is zero STRING1=STRING2 the strings are equal STRING1!=STRING2 the strings are not equal INTEGER1-eq INTEGER2 INTEGER1 is equal to INTEGER2 INTEGER1-ge INTEGER2 INTEGER1 is greater than or equal to INTEGER2 INTEGER1-gt INTEGER2 INTEGER1 is greater than INTEGER2 INTEGER1-le INTEGER2 INTEGE
17、R1 is less than or equal to INTEGER2 INTEGER1-lt INTEGER2 INTEGER1 is less than INTEGER2 INTEGER1-ne INTEGER2 INTEGER1 is not equal to INTEGER2 FILE1-ef FILE2 FILE1 and FILE2 have the same device and inode numbers FILE1-nt FILE2 FILE1 is newer(modification date)than FILE2 FILE1-ot FILE2 FILE1 is old
18、er than FILE2 -b FILE FILE exists and is block special -c FILE FILE exists and is character special -d FILE FILE exists and is a directory -e FILE FILE exists -f FILE FILE exists and is a regular file -g FILE FILE exists and is set-group-ID -h FILE FILE exists and is a symbolic link(same as-L)-G FIL
19、E FILE exists and is owned by the effective group ID -k FILE FILE exists and has its sticky bit set -L FILE FILE exists and is a symbolic link(same as-h)-O FILE FILE exists and is owned by the effective user ID -p FILE FILE exists and is a named pipe -r FILE FILE exists and is readable -s FILE FILE
20、exists and has a size greater than zero -S FILE FILE exists and is a socket -t FD file descriptor FD(stdout by default)is opened on a terminal -u FILE FILE exists and its set-user-ID bit is set -w FILE FILE exists and is writable -x FILE FILE exists and is executable eg.#!/bin/bash#if test#this is a
21、 comment line echo Enter your filename:read myfile if -e$myfile then if -s$myfile;then echo$myfile exist and size greater than zero else echo$myfile exist but size is zero fi else echo file no exist fi testszbirdora 1$sh iftest.sh Enter your filename:11 11 exist but size is zero 2.case语句 case语句为多选择语
22、句。case 值 in 模式 1)命令 1 ;模式 2)命令 2 ;esac eg.#!/bin/bash#case select echo-n enter a number from 1 to 3:read ans case$ans in 1)echo you select 1;2)echo you select 2;3)echo you select 3;*)echo basename$0:this is not between 1 and 3&2 exit;esac 3.for 循环 for循环一般格式:for 变量名 in 列表(列表以空格作为分割)do 命令 1 命令 2 done
23、eg:#!/bin/bash#forlist1 for loop in 1 2 3 4 5 do echo$loop done 4.until循环 until 条件 do 命令 1 命令 2 .done 条件测试发生在循环末尾,所以循环至少可以执行一次。5.while循环 while 命令(可以是一个命令也可以是多个,做条件测试)do 命令 1 命令 2 .done 注意:如果从文件中读入变量 THE CHARACTER B IS BEST *myfile a THE CHARACTER B IS BEST*b c d e 下一个:n 从一个文件中读文本下一行,并附加在下一行 退出命令 q 打
24、印多少行后退出 eg.testszbirdora 1$sed 3q myfile a alert b best c cook sed script:sed-f scriptfile myfile 5.awk介绍 awk可从文件或字符串值基于指定规则浏览和抽取信息 awk三种调用方式:1.命令行方式 awk-F field-speratorpatternactive input-files awk-F field-speratorcommand input-files awk脚本 所有 awk命令插入一个文件,并使 awk程序可执行,然后用 awk命令解析器作为脚本的首行,以便通过键入脚本名称来
25、调用。awk命令插入一个单独文件 awk-f awk-script-file input-files awk脚本由模式和动作组成 分隔符、域、记录 注意这里的$1,$2是域与位置变量$1,$2不一样。$0 文件中的所有记录 eg:awk print$0 myfile awk BEGIN print IP DATE-print$1t$4ENDprint end-of-report testszbirdora 1$df|awk$1!dev|grep-v Filesystem none 1992400 0 1992400 0%/dev/shm testszbirdora 1$df|awk if($1
26、=/dev/sda1)print$0/dev/sda1 20641788 3367972 16225176 18%/testszbirdora shelltest$cat employee Tom Jones 4424 5/12/66 543354 Mary Adams 5346 11/4/63 28765 Sally Chang 1654 7/22/54 650000 Billy Black 1683 9/23/44 336500 testszbirdora shelltest$awk/Aadams/employee Mary Adams 5346 11/4/63 28765 testszb
27、irdora shelltest$sed-n/Aadams/p employee Mary Adams 5346 11/4/63 28765 testszbirdora shelltest$grep Aadams employee Mary Adams 5346 11/4/63 28765 三种命令方式下,使用模式匹配查询 testszbirdora shelltest$awk print$1 employee Tom Mary Sally Billy 打印文件第一列 testszbirdora shelltest$awk/Sally/print$1t$2 employee Sally Cha
28、ng 打印匹配 Sally的行的第一列和第二列 testszbirdora shelltest$df|awk$420884623 Filesystem 1K-blocks Used Available Use%Mounted on/dev/sda2 82567220 17488436 60884616 23%/u01/dev/sda4 28494620 4589172 22457992 17%/u02 打印 df 输出第四列大于的行 格式输出:打印函数 testszbirdora shelltest$date Mon Mar 10 15:15:47 CST 2008 testszbirdora
29、 shelltest$date|awk print Month:$2nYear:$6 Month:Mar Year:2008 testszbirdora shelltest$awk/Sally/print ttHave a nice day,$1t$2 employee Have a nice day,Sally Chang printf函数 testszbirdora shelltest$echo LINUX|awk printf|%-10s|n,$1|LINUX|testszbirdora shelltest$echo LINUX|awk printf|%10s|n,$1|LINUX|匹配
30、符 testszbirdora shelltest$awk$1/Tom/print$1,$2 employee Tom Jones awk 给表达式赋值 关系运算符:大于=等于!=不等于=大于等于$2)?$1:$2;print max filename 运算符+,-,*,/,%,&,|,!testszbirdora shelltest$cat/etc/passwd|awk-F:NF!=7 printf(line%d does not have 7 fields:%sn,NR,$0)$1!/A-Za-z0-9/printf(line%d,nonalphanumberic user id:%sn,
31、NR,$0)$2=*printf(line%d,no password:%sn,NR,$0)awk编程 递增操作符 x+,+x 递减操作符 x-,-x BEGIN模块 BEGIN模块后面紧跟着动作块,在读入文件前执行。通常被用来改变内建变量的值,如:FSRSOFS,初始化变量的值和打印输出标题。testszbirdora shelltest$awk BEGINprint HELLO WORLD HELLO WORLD testszbirdora shelltest$awk BEGINprint-LIST-printENDprint-END-donors -LIST-Mike Harringto
32、n:(510)548-1278:250:100:175 Christian Dobbins:(408)538-2358:155:90:201 Susan Dalsass:(206)654-6279:250:60:50 Archie McNichol:(206)548-1348:250:100:175 Jody Savage:(206)548-1278:15:188:150 Guy Quigley:(916)343-6410:250:100:175 Dan Savage:(406)298-7744:450:300:275 Nancy McNeil:(206)548-1278:250:80:75
33、John Goldenrod:(916)348-4278:250:100:175 Chet Main:(510)548-5258:50:95:135 Tom Savage:(408)926-3456:250:168:200 Elizabeth Stachelin:(916)440-1763:175:75:300-END-重定向和管道 输出重定向 awk输出重定向到一个文件需要使用输出重定向符,输出文件名需要用双引号括起来。testszbirdora shelltest$awk-F:print$1,$2note donors testszbirdora shelltest$cat note Mi
34、ke Harrington(510)548-1278 Christian Dobbins(408)538-2358 Susan Dalsass(206)654-6279 Archie McNichol(206)548-1348 Jody Savage(206)548-1278 Guy Quigley(916)343-6410 Dan Savage(406)298-7744 Nancy McNeil(206)548-1278 John Goldenrod(916)348-4278 Chet Main(510)548-5258 Tom Savage(408)926-3456 Elizabeth S
35、tachelin(916)440-1763 输入重定向 getline函数 testszbirdora shelltest$awk BEGINdate+%Y|getline d;print d 2008 testszbirdora shelltest$awk-F:BEGINprintf What is your name?;getline name/dev/tty$1 nameprint Foundt name ton line,NR.ENDprint see ya,name.donors What is your name?Jody Found Jody on line 5.see ya,J
36、ody.testszbirdora shelltest$awk BEGINwhile(getline0)lc+;print lc 36 从文件中输入,如果得到一个记录,getline函数就返回 1,如果文件已经到了末尾,则返回 0,如果文件名错误则返回-1.管道:awk命令打开一个管道后要打开下一个管道需要关闭前一个管道,管道符右边可以使用“”关闭管道。在同一时间只有一个管道存在 testszbirdora shelltest$awk print$1,$2|sort-r+1-2+0-1 names tony tram john smith dan savage john oldenrod ba
37、rbara nguyen elizabeth lone susan goldberg george goldberg eliza goldberg alice cheba|后用关闭管道 system函数 system(LINUX command)system(cat$1)system(clear)条件语句 1.if()2.if()else 3.if()else if()else if()else testszbirdora shelltest$awk-F:if($3250)printf%-2s%13sn,$1,-good partmanelseprint$1 donors 循环语句 tests
38、zbirdora shelltest$awk-F:i=1;while(i=NF)print NF,$i;i+donors 循环控制语句 break、continue 程序控制语句 next从输入文件中读取下一行,然后从头开始执行 awk脚本 if($1/Peter/)next elseprint exit 结束 awk语句,但不会结束 END模块的处理。数组:awk namex+=$1;for(i=0;iNR;i+)print i,namei donors (P177)-2008.3.11 awk内建函数 sub(正则表达式,替换字符,$n)-域 n 匹配正则表达式的字符串将被替换。tests
39、zbirdora shelltest$awk sub(/Tom/,Jack,$1);print employee Jack Jones 4424 5/12/66 543354 Mary Adams 5346 11/4/63 28765 Sally Chang 1654 7/22/54 650000 Billy Black 1683 9/23/44 336500 Jack He 3000 8/22/44 320000 index函数 index(字符串,子字符串)子字符串在字符串中的位置 testszbirdora shelltest$awk BEGINa=index(hello,llo);pr
40、int a 3 length函数 length(string)字符串的长度 testszbirdora shelltest$awk BEGINa=length(hello world);print a 11 substr函数 substr(字符串,开始位置,子字符串长度)testszbirdora shelltest$awk BEGINa=substr(hello world,7);print a world testszbirdora shelltest$awk BEGINa=substr(hello world,7,3);print a wor match(string,正则表达式)找出字
41、符串中第一个匹配正则表达式的位置,其内建变量 RSTART为匹配开始位置,RLENGTH为匹配开始后字符数 testszbirdora shelltest$awk a=match($0,/Jon/);if(a!=0)print NR,a employee 1 5 testszbirdora shelltest$awk a=match($0,/Jon/);if(a!=0)print NR,a,RSTART,RLENGTH employee 1 5 5 3 toupper和 tolower函数 testszbirdora shelltest$awk BEGINa=toupper(hello);pr
42、int a HELLO split函数 split(string,array,fieldseperator)testszbirdora shelltest$awk BEGINdate|getline d;split(d,date);print date2 Mar 时间函数 systime()-1970年 1 月 1 日到当前忽略闰年得出的秒数。strftime(格式描述,时间戳)testszbirdora shelltest$awk BEGINd=strftime(%T,systime();print d 13:08:09 testszbirdora shelltest$awk BEGINd=
43、strftime(%D,systime();print d 03/12/08 testszbirdora shelltest$awk BEGINd=strftime(%Y,systime();print d 2008 6.sort介绍 sort:-c 测试文件是否已经排序 -m 合并两个排序文件 -u 删除所有复制行 -o 存储 sort结果的输出文件名 -t 域分隔符;用非空格或 tab键分割域 +n n为域号,使用此域号开始排序 (注意 0 是第一列)-r 逆序排序 n 指定排序是域上的数字排序项 testszbirdora 1$df-lh|grep-v Filesystem|sort+1
44、 none 2.0G 0 2.0G 0%/dev/shm/dev/sda1 20G 3.3G 16G 18%/dev/sda4 28G 3.9G 22G 15%/u02/dev/sda2 79G 17G 59G 23%/u01 uniq optionfiles 从一个文本文件中去除或禁止重复行 -u 只显示不重复行 -d 只显示有重复数据行,每重复行只显示其中一行 -c 打印每一重复行出现次数 -f n为数字,前 n 个域被忽略 注意要先排序 7.split cut join 分割和合并文件命令 testszbirdora 1$split-l 2 myfile split (每两行分割为一个以
45、 split名称开头的文件)testszbirdora 1$ls case.sh df.out helloworld.sh iftest.sh myfile nohup.out nullfile.txt parm.sh splitaa splitab splitac splitad splitae testszbirdora 1$cat splitaa Filesystem Size Used Avail Use%Mounted on/dev/sda1 20G 3.3G 16G 18%/第六章 shell函数 1.定义函数 funcation name()command1 .或 函数名()co
46、mmand1 .eg.#!/bin/bash#hellofun function hello()echo hello,today is date return 1 2.函数调用#!/bin/bash#hellofun function hello()echo hello,today is date return 1 echo now going to the function hello hello echo back from the function 所以调用函数只需要在脚本中使用函数名就可以了。3.参数传递 像函数传递参数就像在脚本中使用位置变量$1,$2.$9 4.函数文件 函数可以文
47、件保存。在调用时使用.函数文件名(.+空格+函数文件名)如:hellofun.sh#!/bin/bash#hellofun function hello()echo hello,today is date return 1 func.sh#!/bin/bash#func.hellofun.sh echo now going to the function hello echo Enter yourname:read name hello$name echo back from the function testszbirdora 1$sh func.sh now going to the fu
48、nction hello Enter yourname:hh hello,hh today is Thu Mar 6 15:59:38 CST 2008 back from the function 5.检查载入函数 set 删除载入函数 unset 函数名 6.函数返回状态值 return 0、return 1 7.脚本参数的传递 shift命令 shift n 每次将参数位置向左偏移 n#!/bin/bash#opt2 usage()echo usage:basename$0 filename totalline=0 if$#-lt 2;then usage fi while$#-ne 0
49、 do line=cat$1|wc-l echo$1:$line totalline=$totalline+$line shift#$#-1 done echo-echo total:$totalline testszbirdora 1$sh opt2.sh myfile df.out myfile:10 df.out:4-total:14 8.getopts命令 获得多个命令行参数 getopts ahfvc OPTION -从 ahfvc一个一个读出赋值给 OPTION.如果参数带有:则把变量赋值给:前的参数-:只能放在末尾。该命令可以做获得命令的参数#!/bin/bash#optgets
50、 ALL=false HELP=false FILE=false while getopts ahf 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 ;?)echo basename$0-a h f file ;esac done testszbirdora 1$sh optgets.sh-a-h-m ALL is true HELP is true optgets.sh:illegal option-m optge