shell编程入门.doc

上传人:w****2 文档编号:6674820 上传时间:2020-03-02 格式:DOC 页数:25 大小:58KB
返回 下载 相关 举报
shell编程入门.doc_第1页
第1页 / 共25页
shell编程入门.doc_第2页
第2页 / 共25页
shell编程入门.doc_第3页
第3页 / 共25页
点击查看更多>>
资源描述
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 历史版本:sh csh,、tcsh、 zsh ksh、pdksh bash二、 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、 变量:无需事先声明,直接使用,在访问时要加$在变量前。例如:Str=helloecho $Str a.这两行语句将在屏幕输出一个“hello”,shell区别大小写,定义变量时应该注意。b.如果为变量所赋的字符串中含有空格,table或换行符应使用“”标示,例如 “hello word!”c.变量在引号中依然有效如echo “this is $Str!”依然会输出:this is hello!练习示例:(注:后续的示例中只有关键部分,练习时补全)echo “input password:”read pasdecho “the password is $pasd”d.如果需要输出字符$Str可以用单引号 和 来处理: $Str 和$Str 输出的都是 $Str不是变量表示的值,shell中的变量一般都是字符串形式。e: 环境变量,介绍几种:$HOME 当前用户的家目录 $PATH 搜索命令的目录列表$0shell脚本的名字$#传递给脚本的参数个数$脚本的进程号f:参数变量:$1,$2脚本的程序参数$* 列出所有参数$ S*的一种变体,它参数不会挤在一块。g:变量做整形数字使用:a=123let “a +=1”echo “a = $a”2、 条件1) 使用 test 或 如 if test f file.cthen.fi 以上代码也可写成如下形式(尽量使用这种形式) if -f file.c (注意:if语句和之间有个空格 then . fi完整示例:#!/bin/bashecho “is it morning? Please answer yes or no”read timeofdayif $timeofday = “yes” ;then echo “good morning”else echo “good afternoon”fiexit 02) elif语句,在if,else语句中增加分支判断。如下示例: #!/bin/bashecho “is it morning? Please answer yes or no”read timeofdayif $timeofday = “yes” ;then echo “good morning”elif $timeofday = “no” then echo “Good afternoon”else echo “sorry ,$timeofday not recognized. Enter yes or no” exit 1fiexit 03、 一个与变量有关的问题。如上程序,如果没有输入Yes和no直接按回车键,会出现什么结果呢?程序会有出错信息。原因是。避免该问题产生的方法对变量使用双引号“$Str”4、 for语句使用for语句可以循环处理一组值,这组值可以是任意字符串的集合。 它的语法形式如下:for variable in valuesdo somethingdone 示例: #!/bin/bash For foo in hello myname 129 do echo $foo done exit 0使用通配符扩展for循环#!/bin/shfor file in $(ls *.sh);do echo $filedoneexit 05、while语句语法结构:while condition doDosometingdone示例:一个简陋的密码检查程序#!/bin/bashecho “Enter password”read pawordwhile “$paword” != “secret” do echo “sorry, try again ” read paword doneexit 0字符串比较:string = string string != string-n string-z string 算数比较 num1 eq num2 num1 ne num26、until语句,与while循环类似,只是把测试条件反过来了。语法形式如下:until conditiondo Dosomethingdone7、case语句语法结构:case variable inpattern1 | pattern ) dosomething ;pattern2 | pattern ) dosomething ;esac该语句 执行 vairable与第一个pattern匹配上的语句。例如:#!/bin/bashecho “is it morning? Please answer yes or no”read timeofdaycase “$timeofday” in yes ) echo “good moring”; no ) echo “good afternoon”;y) echo “good morning”;n) echo “good afternoon”;*)echo “sorry,answer not recognized” ; esac exit 0 匹配部分语句也可改写为: case “$timeofday” in yes | y | Yes | YES ) echo “good morning”; n* | N* ) echo “good afternoon”; *) echo “sorry, answer not recognized”; esac也可以将匹配行改为; yY|YyEeSs8、命令列表 有时需要将好几条命令连接成一个序列。如下 if -f this_file ; then if -f that_file ; then if -f the_other_file ; then echo “all files present, and correct” fi fifi9、AND列表 只有在前一条命令执行成功返回true才执行下一条。语法结构: Statement1 & Statement1 & Statement1 & 示例:#!/bin/bashtouch file_onerm f file_twoif -f file_one & echo “hello” & -f file_two & echo “there”then echo “in if”else echo “in else”fiexit 010、OR列表 ,直到有一条命令执行成功为止。 语法结构: Statement1 | Statement2 | Statement3 | 示例:if -f file_one | echo “hello” | echo “there”then echo “in if”elseecho “in else”fi11、语句块如果想在只允许使用单个语句的地方(如 AND,OR)使用多条语句,可以是花括号来构造一个块。如下: Get_confirm & echo “hello” cat $tmp_file $tracks_fileadd_record_tracks12、函数要定义一个shell函数,只需写出它的名字,加上括弧,再把函数要实现的语句放在一对花括号中,如下所示:function_name () Statements示例:#!/bin/bashfoo() echo “function foo is executing”echo “ this is foo ”fooecho “foo end!”exit 0如果在函数中没有return命令指定一个返回值,则函数返回的就是执行的最后一条命令的退出码。示例 #!/bin/bash# 函数部分Yes_or_no() Echo “is your name $* ?” while truedo echo n “Enter yes or no: ” read x case “$x” in y | yes ) return 0; n | no ) return 1; *) echo “please input yes or no” esacdone#主程序部分echo “original parameters are $*”if yes_or_no “$1”then echo “HI $1,nice name”else echo “never mind”fiexit 0在函数内部定义的变量,在函数运行后,变量依然有效,如果只想在本函数内使用临时变量,可在变量前加上 local#!/bin/bashfoo() local str=aaaa #如果此处无local 则 最后的语句是可以输出aaaa的echo in foo $strfooecho over $str$# 表示参数个数,$1为第一个参数依次类推。($*,$)脚本中无函数的声明,调用某个函数前,该函数需要先被定义,所以函数的定义可以写在脚本的开始。13、一些命令1)break 命令 在控制条件为满足之前,可以跳出 for,while,until循环,后面可带参数值,来表明要跳出的循环层数,但我们不建议这么做。2) :命令冒号(:)命令是一个空命令。偶尔被运用简化逻辑,相当于true。3) continue命令类似C语言中的同名语句。可使for,while,until循环跳到下一次循环继续执行,循环变量取循环列表中的下一个。如 for x in 1 2 3do echo 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代表回车 )6) eval命令eval允许对参数进行求值,如下:foo=10x=fooy=$xecho $y #输出为foo当使用 eval命令时,如下foo=10x=fooeval y=$xecho $y #输出为 107) exec命令将当前shell替换为一个不同的程序如:exec wall “Thanks for the fish”脚本中的这个命令会用wall命令替换当前的shell。第二种用法是修改当前文件描述符:exec 3 /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 File exists sleep 1doneecho the file no longer existstrap INTecho 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 exists sleep 1doneecho we never get here16)unset命令 unset命令的作用是从环境中删除变量或函数。但不能删除shell本身定义的只读变量。 #!/bin/bashfoo=hello worldecho $foounset fooecho $foo17)find命令find语法结构:find path options tests actionspath 是要搜索的路径。Options 选项:-depth 在查看目录本身之前先搜素目录的内容-follow 跟随符号链接-maxdepths N 最多搜索N层目录-mount(或-xdev) 不搜索其他文件系统中的目录Tests选项:-atime N 文件在N天之前被访问过-mtime N 文件在N天之前被修改过-name “pattern” 按文件名称匹配-newer otherfile 文件比otherfile要新-type c 文件类型为c-user username 文件的拥有者是指定用户。对tests部分的组合:! (-not) 测试取反-a (-and) 两个测试都必须为真-o (-or) 两个测试必须有一个为真 动作:-exec command 执行一条命令-ok command 同上,只是处理时回头提示-print 打印文件名-ls 对当前文件使用命令 ls-dils一个find的示例: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:35 ./cc1.sh-rwxrwxrwx 1 sufeng users 167 Sep 1 11:43 ./tm1.sh18)grep命令grep语法如下:grep options PATTERN FILES选项 含义 -c 输出匹配行的数目,而不是输出匹配行 -i 忽略大小写 -v 对匹配模式取反 -l 只列出匹配行的文件名 -E 启用扩展表达式 -h 取消输出行普通前缀。 示例: grep -c -v in bb.sh cc.sh grep -c in bb.sh cc.sh19)正则表达式 字符 含义 指向一行的开头 $ 指向一行的结尾 . 任意单个字符 方括号包含一个字符范围,其中任何一个字符都可以匹配,如ae,在字符范围前面加,即不在指定范围内。 匹配模式 含义 :alnum: 字母与数字字符 :alpha: 字母 :ascii: ASCII 字符 :blank: 空格或制表符 :cntrl: ASCII控制字符 :digit: 数字 :graph: 非控制、非空格字符 :lower: 小写字母:print: 可打印字符:punct: 标点符号字符:space: 空白字符,包括垂直制表符:upper: 大写字母:xdigit: 十六进制数字选项 含义 ? 匹配是可选的,但最多匹配一次 * 必须匹配0次或多次 + 必须匹配1次或多次 n 必须匹配n次 n, 必须匹配n次或n次以上 n,m 必须匹配n到m之间,包括n和m以上使用的时候需要加.示例:grep e$ bb.sh 以e结尾grep a:blank: bb.sh 以a结尾grep Th.:blank: bb.sh 匹配以Th开头的3个字符组成的单词grep -E a-z10 bb.sh 匹配只有10个字符常的全由小写字母组成的单词。20)命令的执行 $(command) #!/bin/bash whoisthere=$(who) 将who显示的内容给变量 echo $whoisthere exit 0 算数扩展 #!/bin/bash X=0 while “$X” ne 10 ; do echo $X x=$($x+1) doneexit 0注意 使用$时,后面有两个括弧和一个括弧是有区别的,一个是赋只给变量,两个是进行算数运算。参数扩展示例:如果有两个文件 1_tmp和2_tmp#!/bin/bashfor i in 1 2do my_secret_process $i_tmpdone此时,又有错误信息,应该为my_secret_process $i_tmp参数扩展 说明 $param:-default 若param为空,则值为default $#param 给出param的长度 $param%word 从尾部开始删除与word匹配的最小部分 $param%word 从尾部开始删除与word匹配的最长部分 $param#word 从param的头部开始删除匹配的最小部分$param#word 从param的头部开始删除匹配的最小部分21)here文档 可以将部分字符内容存储在脚本中,以特定的字符标示起始和结尾。示例;#!/bin/bashcat !FUNKY!hellothis is a heredocument!FUNKY!示例2: 使用ed编辑器#!/bin/bashed a_text_file !FunkyStuff!3d.,$s/is/was/wq!FunkyStuff!exit 0其中 a_text_file 文件中内容如下That is line 1That is line 2That is line 3That is line 4
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 临时分类 > 人文社科


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!