shell编程入门_第1页
shell编程入门_第2页
shell编程入门_第3页
shell编程入门_第4页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、Shell 程序设计学习内容 :1. 什么是 shell2. 语法:变量、条件判断、程序控制3. 函数4. 命令和命令的执行5. Here 文档6. 调试7. Grep 命令和正则表达式8. Find 命令一、什么是 shell?Shell 是一个作为用户与Linux 系统间接口的程序,它允许用户向操作系统输入需要执行的命令。在一个linux 系统中可以安装多个shell,这些 shell 和其他程序一起环绕在 linux 内核四周。默认安装的标准是 /bin/sh ,它是 GNU 工具集中的 bash。使用 /bin/bash version 可以查看版本。精选文库Shell 历史版本 :

2、shcsh,、 tcsh、 zshksh、 pdkshbash二、shell 脚本编写、运行、调试1. 脚本均以 #!/bin/bash 开头。2. 脚本中的 #为注释符。3. 使用 exit 为脚本设置返回一个退出码, 注意 0 表示的是执行成功。示例:#!/bin/bash# this is my first shell! echo “helloword! ”exit 04. 设置脚本为可执行 : chmod u+x filename.sh5. 执行: ./filename.sh6. sh x ./filename.sh三、shell 语法1、变量:无需事先声明, 直接使用, 在访问时要加

3、 $在变量前。例如:Str=helloecho$Stra.这两行语句将在屏幕输出一个“hello”,shell 区别大小写,定义变量时应该注意。b.如果为变量所赋的字符串中含有空格, table 或换行符应使用“”标示,例如“helloword! ”-2精选文库c.变量在引号中依然有效如echo “thisis$Str!”依然会输出: thisishello!练习示例: (注:后续的示例中只有关键部分,练习时补全)echo “inputpassword:”read pasdecho “the password is $pasd”d.如果需要输出字符 $Str 可以用单引号和来处理:$Str和

4、$Str 输出的都是$Str 不是变量表示的值,shell中的变量一般都是字符串形式。e: 环境变量,介绍几种:$HOME当前用户的家目录$PATH搜索命令的目录列表$0shell 脚本的名字$#传递给脚本的参数个数$脚本的进程号f:参数变量:$1,$2 脚本的程序参数$*列出所有参数$S*的一种变体,它参数不会挤在一块。g:变量做整形数字使用:a=123let “a +=1”-3精选文库echo “a = $a”2、条件1) 使用 test 或 如 if test f file.cthen .fi以上代码也可写成如下形式(尽量使用这种形式 )if -f file.c (注意 :if 语句和

5、之间有个空格 then.fi完整示例:#!/bin/bashecho“isitmorning? Pleaseansweryesorno”readtimeofdayif $timeofday = “yes” ;thenecho“good morning”elseecho“good afternoon”fiexit 02)elif 语句,在 if,else 语句中增加分支判断。-4精选文库如下示例:#!/bin/bashecho“isitmorning? Please answeryesorno”readtimeofdayif $timeofday = “yes” ;thenecho“good m

6、orning”elif $timeofday = “no”thenecho “Good afternoon”elseecho “sorry ,$timeofday not recognized. Enter yes or no” exit 1fiexit 03、一个与变量有关的问题。如上程序,如果没有输入Yes和 no 直接按回车键,会出现什么结果呢?程序会有出错信息。原因是。 。避免该问题产生的方法对变量使用双引号“ $Str”4、for 语句使用 for 语句可以循环处理一组值, 这组值可以是任意字符串的集合。 它的语法形式如下:forvariableinvalues-5精选文库dosom

7、ethingdone示例:#!/bin/bashFor foo in hello myname 129doecho $foodoneexit 0使用通配符扩展for 循环#!/bin/shfor file in $(ls*.sh);doecho $filedoneexit 05、while 语句语法结构:whilecondition doDosometingdone示例:一个简陋的密码检查程序-6精选文库#!/bin/bashecho“Enter password”readpawordwhile “$paword” != “secret”doecho “sorry, try again ”re

8、ad paworddoneexit 0字符串比较 :string = stringstring != string-n string-z string算数比较num1 eqnum2num1 nenum26、until 语句 ,与 while 循环类似,只是把测试条件反过来了。语法形式如下:until conditiondo-7精选文库Dosomethingdone7、case语句语法结构 :casevariable inpattern1 | pattern)dosomething;pattern2 | pattern)dosomething;esac该语句执行 vairable 与第一个 pa

9、ttern 匹配上的语句。例如:#!/bin/bashecho “is it morning? Please answer yes or no”readtimeofdaycase “$timeofday”inyes ) echo “good moring”;no ) echo “good afternoon”;y) echo “good morning”;n) echo “good afternoon”;*)echo “sorry,answer not recognized”;esacexit 0匹配部分语句也可改写为:-8精选文库case“$timeofday ” inyes | y | Y

10、es | YES ) echo“good morning”;n* | N* )echo “good afternoon”;*)echo “sorry, answer not recognized”;esac也可以将匹配行改为 ; yY|YyEeSs8、命令列表有时需要将好几条命令连接成一个序列。如下if -f this_file ; thenif -f that_file ; thenif -f the_other_file ; thenecho “allfiles present, and correct”fififi9、AND 列表只有在前一条命令执行成功返回true 才执行下一条。语法结

11、构:Statement1&&Statement1&&Statement1&&示例 :#!/bin/bashtouch file_one-9精选文库rm f file_twoif -f file_one && echo “hello”&& -f file_two && echo “there” thenecho “in if ”elseecho “in else”fiexit 010、OR 列表 ,直到有一条命令执行成功为止。语法结构:Statement1 |Statement2 | Statemen

12、t3 |示例:if -f file_one | echo “hello”| echo “there ” thenecho “in if ”elseecho “in else”fi11、语句块如果想在只允许使用单个语句的地方(如 AND,OR)使用多条语句,可以是花括号 来构造一个块。如下:Get_confirm && -10精选文库echo “hello”cat $tmp_file > $tracks_fileadd_record_tracks12、函数要定义一个shell 函数,只需写出它的名字,加上括弧,再把函数要实现的语句放在一对花括号中,如下所示:function

13、_name () Statements示例:#!/bin/bashfoo()echo“function foo is executing”echo“this is foo”fooecho “foo end!”exit 0如果在函数中没有return 命令指定一个返回值, 则函数返回的就是执行的最后一条命令的退出码。示例-11精选文库#!/bin/bash# 函数部分Yes_or_no()Echo “is your name $* ?”while truedoecho n “Enter yes or no: ”read xcase “$x”iny | yes ) return 0;n | no

14、) return 1;*) echo “please input yes or no”esacdone#主程序部分echo“original parameters are $*”ifyes_or_no “$1”thenecho “HI$1,nice name”elseecho “never mind”fi-12精选文库exit 0在函数内部定义的变量,在函数运行后,变量依然有效,如果只想在本函数内使用临时变量,可在变量前加上local#!/bin/bashfoo()localstr=aaaa#如果此处无 local 则 最后的语句是可以输出aaaa的echo "in foo $str

15、"fooecho "over $str"$# 表示参数个数, $1 为第一个参数依次类推。 ($*,$)脚本中无函数的声明,调用某个函数前,该函数需要先被定义,所以函数的定义可以写在脚本的开始。13、一些命令1)break 命令在控制条件为满足之前,可以跳出for ,while,until 循环,后面可带参数值,来表明要跳出的循环层数,但我们不建议这么做。2) :命令冒号(:)命令是一个空命令。 偶尔被运用简化逻辑, 相当于 true 。-13精选文库3)continue 命令类似 C 语言中的同名语句。可使for,while ,until 循环跳到下一次循环继续

16、执行,循环变量取循环列表中的下一个。如 for x in 1 2 3 doecho before $x continue 1 echo after $xdone4).命令默认情况下, shell 脚本程序会在一个新创建的环境中执行,所以当脚本对环境变量所做的任何修改都会丢失,而点 (.)命令允许执行的脚本程序改变当前的环境。5)echo 命令输出一行字符内容并换行,若要使其不换行linux 有两种解决方法: echo n “string to output ”echo e “string to outputc ”(注: -e 是确保启用了反斜杠转义字符,c 代表去掉换行符,t 代表制表符, n

17、 代表回车 )6)eval 命令eval 允许对参数进行求值,如下:foo=10-14精选文库x=fooy=$xecho $y#输出为 foo当使用eval 命令时,如下foo=10x=fooevaly=$xecho $y#输出为107)exec 命令将当前 shell 替换为一个不同的程序如: exec wall “Thanks for the fish”脚本中的这个命令会用wall 命令替换当前的shell。第二种用法是修改当前文件描述符:exec 3< afile修改文件描述符。8)exit n 命令一般使脚本程序以退出码n 结束运行。0 表示成功, 1125 是脚本可以使用的错误

18、代码。126 表示文件不可执行, 127 表示命令未找到128 及以上出现一个信号9)export 命令-15精选文库export 命令可以将变量参数导出到子shell 中,子 shell 中即可访问该变量。如TESTA=testa;export TESTA10) expr 命令expr 命令将它的参数当做一个表达式来求值。11) printf 命令printf “formatstring ”parameter1 parameter212)return 命令return 命令作用是使函数返回,后面可带返回值,如果没有返回值则默认返回最后一条命令的退出码。13)set 命令示例:从系统提供的参数

19、date 中提取出月份。#!/bin/bashecho the date is $(date)set $(date)echo The month is $2exit 014)shift 命令shift 命令把所有参数变量左移一个位置,使$2 变成 $1,$3 变成$2,$1 被丢弃, $0 保持不变。while “$1”!= “”;doecho “$1”shift-16精选文库doneexit 015)trap 命令Trap 命令用于指定在接收信号后将要采取的行动。语法结构: trap command signal第一个参数是收到指定信号要采取的行动。第二个参数是要处理的信号名称。如果要忽略一

20、个信号,则将第一个参数设为空字符串。#!/bin/bashtrap 'rm -f /home/sufeng/my_shell/my_tmp_file_$' INT echo creating file /home/sufeng/my_shell/my_tmp_file_$ date > /home/sufeng/my_shell/my_tmp_file_$echo "press interrupt (ctrl-c) to interrupt ."while -f /home/sufeng/my_shell/my_tmp_file_$ ;do echo

21、File existssleep 1doneecho the file no longer existstrap INT-17精选文库echo creating file /home/sufeng/my_shell/my_tmp_file_$ date > /home/sufeng/my_shell/my_tmp_file_$echo "press interrupt (control-c) to interrupt ."while -f /home/sufeng/my_shell/my_tmp_file_$ ;do echo File existssleep 1do

22、neecho we never get here16)unset 命令unset 命令的作用是从环境中删除变量或函数。但不能删除shell本身定义的只读变量。#!/bin/bashfoo="hello world"echo $foounset fooecho $foo17)find 命令find 语法结构:findpathoptionstestsactionspath 是要搜索的路径。Options 选项 :-18精选文库-depth在查看目录本身之前先搜素目录的内容-follow跟随符号链接-maxdepths N最多搜索 N 层目录-mount( 或-xdev)不搜索其

23、他文件系统中的目录Tests选项:-atime N文件在 N 天之前被访问过-mtime N文件在 N 天之前被修改过-name“pattern”按文件名称匹配-newer otherfile 文件比 otherfile 要新-typec 文件类型为 c-user username文件的拥有者是指定用户。对 tests 部分的组合 :!(-not)测试取反-a(-and)两个测试都必须为真-o(-or)两个测试必须有一个为真动作:-execcommand执行一条命令-okcommand同上,只是处理时回头提示-print打印文件名-ls对当前文件使用命令ls-dils一个 find 的示例:-

24、19精选文库sufenglinux-ecmc:/my_shell> find ( -name "*1.sh" -o -atime 2 ) -type f -exec ls -l ;结果如下:-rwxrwxrwx 1 sufeng users 91 Sep 5 18:54 ./bb1.sh-rwxr-r- 1 sufeng users 258 Sep 4 20:41 ./t_fun1.sh-rwxr-r- 1 sufeng users 174 Sep 4 18:11 ./tm_case1.sh-rwxrwxrwx 1 sufeng users 39 Sep 5 18:3

25、5 ./cc1.sh-rwxrwxrwx 1 sufeng users 167 Sep 1 11:43 ./tm1.sh18)grep 命令grep 语法如下 :grepoptionsPATTERN FILES选项含义-c输出匹配行的数目,而不是输出匹配行-i忽略大小写-v对匹配模式取反-l只列出匹配行的文件名-E启用扩展表达式-h取消输出行普通前缀。示例:grep -c -v in bb.sh cc.shgrep -c in bb.sh cc.sh-20精选文库19)正则表达式字符含义指向一行的开头$指向一行的结尾.任意单个字符方括号包含一个字符范围,其中任何一个字符都可以匹配,如 ae,在

26、字符范围前面加 ,即不在指定范围内。匹配模式含义:alnum:字母与数字字符:alpha:字母:ascii:ASCII 字符:blank:空格或制表符:cntrl:ASCII控制字符:digit:数字:graph:非控制、非空格字符:lower:小写字母:print:可打印字符:punct:标点符号字符:space:空白字符,包括垂直制表符:upper:大写字母:xdigit:十六进制数字-21精选文库选项含义?匹配是可选的,但最多匹配一次*必须匹配 0 次或多次+必须匹配 1 次或多次n必须匹配 n 次n,必须匹配 n 次或 n 次以上n,m必须匹配 n 到 m 之间,包括 n 和 m以上使用的时候需要加.示例:grepe$bb.sh以 e 结尾grepa:blank: bb.sh以 a 结尾grepTh.

温馨提示

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

评论

0/150

提交评论