嵌入式linuxshell脚本.ppt_第1页
嵌入式linuxshell脚本.ppt_第2页
嵌入式linuxshell脚本.ppt_第3页
嵌入式linuxshell脚本.ppt_第4页
嵌入式linuxshell脚本.ppt_第5页
已阅读5页,还剩68页未读 继续免费阅读

VIP免费下载

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

文档简介

第二章 shell脚本,1、vi与vim 2、认识bash(shell程序) 3、shell script,目录,所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在; vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计; 因为程序简单,编辑速度相当快速。 Vi不是一个排版软件,它只是一个文本编辑程序。 Vim是vi的一个改进版本,程序编辑器。,1、vi和vim,一般模式: 以 vi 打开一个档案就直接进入一般模式了(这是默认的模式)。在这个模式中, 可以使用命令移动光标,删除命令来处理档案内容, 也可以使用复制、贴上来处理你的文件数据。 编辑模式: 在一般模式中可以进行删除、复制、贴上等等的动作,但是却无法编辑文件内容的! 要等到你按下i, I, o, O, a, A, r, R等任何一个字母之后才会进入编辑模式。而如果要回到一般模式时, 则必须要按下Esc这个按键即可退出编辑模式。 命令模式: 在一般模式当中,输入 : / ? 三个中的任何一个按钮,就可以将光标移动到最底下那一行。在这个模式当中, 可以提供你搜寻资料的动作,而读取、存盘、大量取代字符、离开 vi 、显示行号等等的动作则是在此模式中完成的!,Vi的三种模式,Vi的三种操作模式,一般模式 光标移动 搜索与替换 删除字符 删除行 复制或粘贴行,编辑模式 以插入或替换来编辑文本内容,命令行模式 读取/保存文件 退出或额外功能,iIoOaA(插入),: / ?,ESC,ESC,进入和退出,进入vim编辑器 vim test.sh 退出vim编辑器 :q,:q!,:wq (或ZZ ),:e! :w filename,行内快速移动,移动光标命令,行号定位,撤销命令,Ctrl+r 重做上一次操作 :e! 恢复文件到初始状态,文本删除和替换,R:会一直替换光标所在的字符,直到按下ESC为止,复制和粘贴,文本替换,:rangs/search/replace/cegi rang:表示范围,比如:1,7:第1行到7行;1,$:表示第1行到最后一行,%。 c:确认。 e:不显示错误信息。 g:当前行整行替换 i:不分大小写,查找,:?chroot 反向查找 :/chroot 正向查找 n上一个,N下一个,切换到插入模式,新增(append) 按a键,从光标所在位置后面开始输入新文本。 按A键,从光标所在行的行尾输入新文本。 插入(insert) 按i键,从光标所在位置前面开始输入新文本。 按 I键,从第一个非空格字符前面开始插入。 开始(open) 按o键,在光标所在行下方新增一行输入。 按O键,在光标所在行上方新增一行输入。,Shell是操作系统中运行的程序,与系统中的其他程序不同,Shell程序位于操作系统内核与用户之间,负责接收用户输入的命令,在对已输入放入命令解释,将需要执行的命令程序传递给操作系统内核执行,因此Shell程序充当了一个“命令解释器”。,2、认识bash,Shell的发展与分类,Bsh在20世纪70年代中期诞生于新泽西的AT&T贝尔实验室,具有较强的脚本编程功能,Csh在20世纪80年代早期诞生于加利福尼亚大学 ,使用C语言的语法,用户命令交互更加方便,Ksh结合了Bsh和Csh两者的功能优势,兼有Bsh的语法和Csh的交互特性,Bash是Bsh的升级替代品,吸收了Ksh中的诸多优秀特性,Bash是开源软件,命令记忆能力 (history):使用过的命令记录在在你的家目录内的 .bash_history 命令与文件补全功能: (tab 按键的好处) 命令别名配置功能: (alias) 作业控制、前台、后台控制 程序脚本(shell script) 通配符,Bash的主要功能,变量:简单的说,就是让某一个特定字符串代表不固定的内容就是了。 变量类型: 环境变量 预定义变量 位置变量 用户自定义变量(本地变量),Shell 变量,环境变量,使用set命令查看环境变量 set 常用环境变量 USER UID SHELL HOME PWD PATH 环境变量配置文件 /etc/bashrc /etc/profile /.bash_profile /.bashrc,位置变量,$ ./exam01 one two tree four five six,预定义变量,用户自定义变量,自定义变量的设置 $ DAY=sunday 自定义变量的查看与引用 $ echo $DAY 自定义变量的输出 $ export DAY 自定义变量的清除 $ unset DAY,变量与变量内容以一个等号=来连结 等号两边不能直接接空格符 变量名称只能是英文字母与数字,但是开头字符不能是数字 变量内容若有空格符可使用双引号“或单引号将变量内容结合起来 双引号内的特殊字符如$等,可以保有原本的特性 可用跳脱字符 将特殊符号变成一般字符; 在一串命令中,还需要藉由其他的命令提供的信息,可以使用反单引号命令或 $(命令)。 若该变量为扩增变量内容时,则可用 “$变量名称“ 或 $变量 累加内容 若该变量需要在其他子程序运行,则需要以 export 来使变量变成环境变量:,变量设置规则,echo (显示变量) 命令格式 echo -en var -e 表示解析转义字符 -n 回车不换行,linux默认回车换行 控制字符:c-不换行;t-跳格;n-换行 举例 echo “whats your name“ echo name echo $name echo $LOGNAME,变量的输出和键盘读取,read 如果只指定了一个变量,那么r e a d将会把所有的输入赋给该变量,直至遇到回车。如果给出了两个变量,s h e l l将用空格作为变量之间的分隔符。如果变量数少于单词数,那么第一个单词将被赋给第一个变量,字符串后面的部分将被全部赋给第二个变量。 命令格式 read options varible1 varible2 举例 $read name1 name2 tom jerry bob,变量的输出和键盘读取,通配符与特殊符号,数据流重定向,数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据, 给他传输到其他的地方,例如文件或者是装置 (例如打印机之类的)!这玩意儿在 Linux 的文本模式底下可重要的! 尤其是如果我们想要将某些数据储存下来时,就更有用了!,简单的说,标准输出指的是命令运行所回传的正确的信息,而标准错误输出可理解为 命令运行失败后,所回传的错误信息。 数据流重导向可以将 standard output (简称 stdout) 与 standard error output (简称 stderr) 分别传送到其他的文件或装置去,而分别传送所用的特殊字符则如下所示: 1. 标准输入 (stdin) :代码为 0 ,使用 或 ; 3. 标准错误输出(stderr):代码为 2 ,使用 2 或 2 ;, :以覆盖的方法将正确的数据输出到指定的文件或装置上; :以累加的方法将正确的数据输出到指定的文件或装置上; 2 :以覆盖的方法将错误的数据输出到指定的文件或装置上; 2:以累加的方法将错误的数据输出到指定的文件或装置上; 注意: 2 中间是没有空格的,/dev/null 垃圾桶黑洞装置与特殊写法,要将错误信息忽略掉而不显示或储存呢? 这个时候黑洞装置 /dev/null 就很重要了!这个 /dev/null 可以吃掉任何导向这个装置的信息喔! 将正确与错误数据通通写入同一个文件去: find /home -name .bashrc list 2&1 find /home -name .bashrc & list,standard input : 与 ,命令运行的判断依据: ; , &, |,cmd ; cmd (不考虑命令相关性的连续命令下达) $? (命令回传值) 与 & 或 |$? :若前一个命令运行的结果为正确,在 Linux 底下会回传一个 $? = 0 的值。,shell script 是利用 shell 的功能所写的一个程序 (program),这个程序是使用纯文字档,将一些 shell 的语法与命令(含外部命令)写在里面, 搭配正规表示法、管线命令与数据流重导向等功能,以达到我们所想要的处理目的。 shell script 可以简单的被看成是批量档, 也可以被说成是一个程序语言,且这个程序语言由於都是利用 shell 与相关工具命令, 所以不需要编译即可运行,且拥有不错的除错 (debug) 工具。,3、shell script,第一行 #!/bin/bash 在声明这个 script 使用的shell 名称: 整个 script 当中,除了第一行的 #! 是用来声明 shell 的之外,其他的 # 都是注解用途! 主要程序部分 运行成果告知 (定义回传值),脚本的编写与运行,rootwww # mkdir scripts; cd scripts rootwww scripts# vi sh01.sh #!/bin/bash # Program: # This program shows “Hello World!“ in your screen. # History: # 2005/08/23 VBird First release echo -e “Hello World! a n“ exit 0,注意: 命令的运行是从上而下、从左而右的分析与运行; 如果读取到一个 Enter 符号 (CR) ,就尝试开始执行该行 (或该串) 命令; 至于如果一行的内容太多,则可以使用 Enter 来扩展到下一行; 直接命令执行: shell.sh 文件必须要具备可读与可运行 (rx) 的权限,然后: 使用包含绝对路径或相对路径的完整文件名执行 变量PATH功能:将 shell.sh 放在 PATH 指定的目录内,例如: /bin/ 以 bash 程序来执行:通过 bash shell.sh 或 sh shell.sh 来执行,条件测试,写脚本时,有时需要进行测试,然后基于测试结果做下一步动作。 对文件、字符串和数字使用test命令。 对数字、字符串还可使用expr命令。 使用最后退出状态命令 $?可测知test和expr,二者均以0表示正确,非零值表示返回错误。 test命令格式 test condition condition 注:使用 时要注意在条件两边加上空格,条件测试,文件状态测试 逻辑操作符 字符串测试 数值测试,文件状态测试,格式: test 选项 filename 选项 filename 例: test w student.txt echo $? -x student.txt echo $?, -e file 文件存在 -d directory 目录存在 -s file 文件长度大于0,非空 -r file 文件可读 -b file 区块文件 -c file 字符文件 -f file 一般文件 -w file 文件可写 -x file 文件可执行 -u file 设定了user id -L file 符号链接文件,逻辑操作符,逻辑操作符 -a 逻辑与 -o 逻辑或 ! 逻辑否 举例 -x student.txt -a -w student.txt echo $?,注:可以用逻辑操作符将两个测试表达式结合起来。仅需要用到一对方括号,而不能用两个,否则将返回错误信息“too many arguments” 。,字符串测试,#!/bin/bash if -z $EDITOR ;then echo “The $EDITOR is not set“ elif $EDITOR = “vi“ ; then echo “The editor is vi“ else echo “The editor is $EDITOR,but not vi“ fi,例:,注:进行字符串比较时必须引用双引号,数值测试,命令格式 “number“ operator “number“ “number“ operator “number“ 例 “100“ -lt “110“ NUMBER=100 $NUMBER -ge “100“ “900“ -le “910“ -a “100“ -gt “99“ ,expr用法,expr命令一般用于整数值,但也可用于字符串。一般格式为: 命令格式 expr argument operator argument $( argument operator argument ) operator:+、-、*、/、% 注:1、在运算符到两侧要有空格 2、使用*是要加,即:*,expr用法-增量计数,expr在循环中用于增量计算。 例:$ LOOP=0 $ LOOP=expr $LOOP + 1,expr用法-数值测试,可以用expr测试一个数。如果试图计算非整数,将返回错误。 例:,VALUE=12 expr $VALUE + 1 /dev/nul 2&1 echo $? 0,VALUE=hello expr $VALUE + 1 /dev/nul 2&1 echo $? 2,控制流结构,所有功能脚本必须有能力进行判断,也必须有能力基于一定条件处理相关命令。 本章内容有: if then else语句。 while、for和until loops循环。 脚本中动作。,思考!,例: #!/bin/bash #make a directory mkdir /home/jgsong/mydocs #copy all doc files cp *.docs /home/jgsong/docs #delete all doc files rm *.docs,If语句,单层条件判断式: if 条件判断式 then 当条件判断式成立时,可以执行指令序列; fi,一个条件判断式 # 一个条件判断(else) if 条件判断式 then 当条件判断式成立时,可以执行指令序列; else 当条件判断式不成立时,可以执行指令序列; fi,# 多重条件刞断式 if 条件刞断式一 then 当条件判断式一成立时,可以执行指令序列 elif 条件刞断式二 then 当条件判断式二成立时,可以执行指令序列 else 当条件判断式一与二均不成立时,可以执行指令序列 fi,case语句,case语句为多选择语句。可以用c a s e语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。c a s e语句格式如下:,case $变量名称 in =关键词为 case ,还有发数前有钱字号 “第一个变量内容”) =每个变量内容建议用双引号括起来,关键词则为小括 号 ) 程序段 ; =每个类型结尾使用两个连续的分号来处理! “第二个变量内容“) 程序段 ; *) =最后一个变量内容都会用 * 来代表所有其他值 不包含第一个变量内容与第二个变量内容的其他程序执行段 exit 1 ; esac =最终的 case 结尾!反过来写思考一下!,模式匹配: * 表示任意字符 ? 表示任意单个字符 abc a、b 或 c 三字符其中之一 a-n 从a到n的任一字符 | 多重选择,for (固定循环),语法格式:,注: 使用变量名访问列表中取值。 in列表用法是可选的,如果不用它, for循环使用命令行的位置参数。 in列表可以包含替换、字符串和文件名,for var in con1 con2 . do 程序段 done,For(数值处理),for ( 初始值;限定值;执行步阶 ) do 程序段 done,初始值:某个变量在循环当中的起始值,直接以类似 i=1 设置好; 限定值:当变量的值在这个限定值的范围内,就继续执行循环。例如 i=100; 执行步阶:每作一次循环时,变量的变化量。例如 i=i+1。,while 循环,语法格式:,while condition =中括号内的状态就是判断式(如果为真则执行循环体) do =do 是循环的开始! 程序段落 done =done 是循环的结束,循环控制,break 跳出循环 continue 不会跳出循环,跳过本次循环,进入下一次循环,循环控制举例,例:,#!/bin/sh #breakout while : do echo n “Enter any number 15:” read ANS case $ANS in 1|2|3|4|5) echo “您键入正确的数字.” ; *) echo “错误的输入” break ; esac done,:表示永远为真,循环控制举例,例:,#!/bin/sh #breakout while : do echo n “Enter any number 15:” read ANS case $ANS in 1|2|3|4|5) echo “您键入正确的数字.” ; *) echo “错误的输入,是否继续(y/n)?”,read IS_CONTINUE case $IS_CONTINUE in y|yes|Y|YES) continue ; *) break ; esac esac done,例:菜单制作,shift,向脚本传递参数时,有时需要将设一个参数偏移以处理选项,这就是shift命令的功能。shift每次将参数位置向左偏移一位。 #!/bin/bash #shift loop=0 while $# -ne 0 do echo $1 shift done,例:,shell函数,shell允许将一组命令集或语句形成一个可用块,这些块称为 shell函数。 函数定义 函数的返回 函数文件 检查载入和删除函数,Shell函数,函数是一种脚本内脚本 可以通过函数的名字来定义一块shell代码,以便在以后方便地调用 使用函数而不是一个新的脚本可以大大加快处理速度 使用函数可以方便地组织程序,函数定义,情况一: 函数名() 命令1 命令2 ,情况二: function 函数名 命令1 命令2 ,执行函数时,它保留当前shell和内存信息。 此外如果执行或调用一个脚本文件中的另一段代码,将创建一个单独的shell,因而去除所有原脚本中定义的存在变量。 函数可以放在同一个文件中作为一段代码,也可以放在只包含函数的单独文件中。,函数定义,#!/bin/bash # func1 hello() echo “hello there todays date is date“ echo “now going to the function hello“ hello #调用hello函数 echo “back from the function“ 注意:函数在使用前必须定义,eg1 :,参数传递,#!/bin/bash # func1 hello() echo “hello $1, there todays date is date“ echo “now going to the function hello“ hello jack echo “back from the function“,eg:,在函数中处理和在普通脚本中处理参数基本一样,使用$1等位置参数,或者$*,$#等 应该注意,在函数中的$0并不表示函数名,而仍然是脚本的文件名。 函数取得所传参数后,将原始参数传回shell脚本,因此最好先在函数内重新设置变量保存所传的参数。 函数里

温馨提示

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

评论

0/150

提交评论