




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
linux脚本编程(shell)浅介linux 下最重要的脚本语言算是 bash 了,我也就写点这个吧(我也只会这个:)。跟其他开发语言(如C)比,bash 是比较简单的一种语言,主要用于写一些脚本代码,一些批处理或安装程序。你可以看看在/etc/init.d/目录下,那里就有很多用来控制各个服务的脚本文件。 先看一个“hello world!”的例子: 在某个目录下新建一个文件,叫hello.sh,敲入以下代码:#!/bin/shecho hello world! 好,就这些。保存,在命令提示符下进入保存“hello.sh”的目录,这样执行: #sh hello.sh(回车) 看到了吧?哈哈,不过你高兴的不要太早了,只并不能说明什么,就象你在其他编程环境中做的“hello world.”一样,离高手的距离还远着呢。 我们先看看bash脚本中变量的使用。 修改上面的“hello world!”的例子,改成下面的样子:#!/bin/bash# This is a very simple examplestr=hello world!echo $str 保存后按照上面的方法执行该脚本,你将看到和以前一样的效果。我们看看每一句的意义: 第一行,#! 是说明 hello.sh 这个文件的类型的,有点类似 Windows 系统下用文件后缀来表示不同文件类型的意思。Linux 系统根据 #! 及该字串后面的信息确定该文件的类型。在 BASH 中 第一行的 #! 及后面的 /bin/bash 就表明该文件是一个 BASH 程序,需要由 /bin 目录下的 bash 程序来解释执行。BASH 这个程序一般是存放在 /bin 目录下。这一行的写法是固定的。 第二行的 # This is a . 就是 BASH 程序的注释,在 BASH 程序中从“#”号(没有“!”号)开始到行尾的部分均被看作是程序的注释,相当于C/C+语言中的“/”。 第三行是为一个名称为 str 的变量赋值。 第四行的 echo 语句的功能是把 echo 后面的字符串或变量的内容输出到标准输出中去。需要注意的是 BASH 中的绝大多数语句结尾处都没有分号。 对于第三行,可能有人会问:在C/C+中,变量都属于某个类型,在这变量 str 的类型是什么呢?在 BASH 中变量定义是不需要的,没有 int i 这样的定义过程。如果想用一个变量,只要他没有在前面被定义过,就直接可以用,当然你使用该变量的第一条语句应该是对他赋初值了,如果你不赋初值也没关系,只不过该变量是空( 注意:是 NULL,不是 0 )。 关于变量的使用,要注意以下几点: 一,变量赋值时,“=”左右两边都不能有空格; 二,BASH 中的语句结尾不需要分号(;); 三,除了在变量赋值和在FOR循环语句头中,BASH 中的变量使用必须在变量前加$符号。 在比较详细的 bash 文档中,会规定使用变量要采用这样的形式:$STR,如果你的脚本出了莫名其妙的错误,不妨看看是不是这个问题造成的。 BASH 中的变量既然不需要定义,也就没有类型一说,那是不是一个变量既可以存放整数,也可以存放字符串呢?对! 一个变量即可以被定义为一个字符串,也可以被再定义为整数。如果对该变量进行整数运算,他就被解释为整数;如果对他进行字符串操作,他就被看作为一个字符串。请看下面的例子: #!/bin/bashx=2006let x = $x + 1echo $xx=a string.echo $x 执行一下看看? 又出现了新的关键字:let。关于整数变量计算,有如下几种: + - * / % ,他们的意思和字面意思相同,在*和/之前必须冠以反斜线,已防被SHELL先行解释。整数运算一般通过 let 和 expr 这两个指令来实现,如对变量 x 加 1 可以写作:let x = $x + 1 或者 x=expr $x + 1 关于运行时参数,我们在执行脚本时有时很想传个参数进去,如:#sh mysh.sh hdz(回车)好,很简单,在 bash 中,使用这样传进来的变量时也要在前面加“$”符号。$# 传入脚本的命令行参数个数;$* 所有命令行参数值,在各个参数值之间留有空格;位置变元$0 命令本身(shell文件名)$1 第一个命令行参数;$2 第二个命令行参数;. 好,编辑以下脚本:#!/bin/shecho number of vars:$#echo values of vars:$*echo value of var1:$1echo value of var2:$2echo value of var3:$3echo value of var4:$4 保存文件名为 my.sh,执行时传入参数:#sh my.sh a b c d e(回车),看到结果你就会更清楚各个变量的意思。如果访问的参数在执行时没有传入,如有一条这样的代码: echo value of var4:$100 而在执行时并没有输入100个参数,那取得的值为 NULL。在 BASH 程序中如果一个变量被使用了,那么直到该程序的结尾,该变量都一直有效。为了使得某个变量存在于一个局部程序块中,就引入了局部变量的概念。BASH 中,在变量首次被赋初值时加上 local 关键字就可以声明一个局部变量,如下面这个例子: #!/bin/bashHELLO=var1echo $HELLOfunction hello local HELLO=var2echo $HELLOecho $HELLO 该程序的执行结果是: var1var2var1这个执行结果表明全局变量 $HELLO 的值在执行函数 hello 时并没有被改变。也就是说局部变量 $HELLO 的影响只存在于函数那个程序块中。 BASH 中的变量与 C 语言中变量的区别 这里我们为原来不熟悉 BASH 编程,但是非常熟悉 C 语言的程序员总结一下在 BASH 环境中使用变量需要注意的问题。 1,BASH 中的变量在引用时都需要在变量前加上 $ 符号( 第一次赋值及在For循环的头部不用加 $符号 ); 2,BASH 中没有浮点运算,因此也就没有浮点类型的变量可用; 3,BASH 中的整形变量的比较符号与 C 语言中完全不同,而且整形变量的算术运算也需要经过 let 或 expr 语句来处理; 下面我们来看看变量之间的比较操作: 在比较操作上,整数变量和字符串变量各不相同,详见下表: 对应的操作 整数操作 字符串操作相同 -eq =不同 -ne !=大于 -gt 小于 -lt 大于或等于 -ge小于或等于 -le为空 -z不为空 -n 比如: 比较整数 a 和 b 是否相等就写做 if $a = $b 判断整数 a 是否大于整数 b 就写做 if $a -gt $b 比较字符串 a 和 b 是否相等就写作:if $a = $b 判断字符串 a 是否为空就写作: if -z $a 判断整数变量 a 是否大于 b 就写作:if $a -gt $b 注意:在“”和“”符号的左右都留有空格。 BASH 是 Linux 操作系统的 Shell,因此系统的文件必然是 BASH 需要操作的重要对象运算符,下面说说对文件的操作:含义( 满足下面要求时返回 TRUE ) -e 文件已经存在-f 文件是普通文件-s 文件大小不为零-d 文件是一个目录-r 文件对当前用户可以读取-w 文件对当前用户可以写入-x 文件对当前用户可以执行-g 文件的 GID 标志被设置-u 文件的 UID 标志被设置-O 文件是属于当前用户的-G 文件的组 ID 和当前用户相同file1 -nt file2 文件 file1 比 file2 更新file1 -ot file2 文件 file1 比 file2 更老 如 if -x /root 可以用于判断 /root 目录是否可以被当前用户进入。 上面有进行比较的 if 关键字,是的,bash 中有和 C 语言相似的流程控制语句,主要有:if、for、while、until、case 等语句。下面较详细的介绍一下。 if 语句用于判断和分支,其语法规则和 C 语言的 if 非常相似。其几种基本结构为: if expression then#code blockfi 或者 if expression then#code blockelse#code blockfi 或者 if expression then#code blockelse if expression then#code blockelse#code blockfi 或者 if expression then#code blockelif expression then#code blockelse#code blockfi 如果您为了简洁,想把 then 和 if 放在一行,那就要这样写了:if expression ; then。即在 then 前加一个“;”号(bash 里面每行的结束处没有分号,那要把两行的内容写到一行,是不是要用“;”号隔开啊?哈哈,对!这样说来,“if expression ; then”只是把两行内容写到了一行,没有什么新的东西。)。for 循环结构与 C 语言中有所不同,在 BASH 中 for 循环的基本结构是: for $var in listdo#code blockdone 其中 $var 是循环控制变量,list 是 var 需要遍历的一个集合,do/done 对包含了循环体,相当于 C 语言中的一对大括号。另外如果do 和 for 被写在同一行,必须在 do 前面加上 ;。如: for $var in list; do 。下面是一个运用 for 进行循环的例子: #!/bin/bash for day in Sun Mon Tue Wed Thu Fri Satdoecho $daydone # 如果列表被包含在一对双引号中,则被认为是一个元素for day in Sun Mon Tue Wed Thu Fri Satdoecho $daydone exit 0 注意上面的例子中,在 for 所在那行的变量 day 是没有加 $ 符号的,而在循环体内,echo 所在行变量 $day 是必须加上 $ 符号的。另外如果写成 for day 而没有后面的 in list 部分,则 day 将取遍命令行的所有参数。如这个程序: #!/bin/bash for paramdoecho $paramdone exit 0 上面这个程序将列出所有命令行参数。for 循环结构的循环体被包含在 do/done 对中,这也是后面的 while、until 循环所具有的特点。 while 循环的基本结构是: while condition do#code blockdone 这个结构请大家自己编写一个例子来验证。 until 循环的基本结构是: until condition is TRUE do#code blockdone 这个结构也请大家自己编写一个例子来验证。 caseBASH 中的 case 结构与 C 语言中的 switch 语句的功能比较类似,可以用于进行多项分支控制。其基本结构是: case $var incondition1 );condition2 );* )default statments;esac 下面这个程序是运用 case 结构进行分支执行的例子: #!/bin/bash echo Hit a key, then hit return.read Keypress case $Keypress ina-z ) echo Lowercase letter;A-Z ) echo Uppercase letter;0-9 ) echo Digit;* ) echo Punctuation, whitespace, or other;esac exit 0 上面例子中的第四行 read Keypress 一句中的 read 语句表示从键盘上读取输入。这个命令将在本讲义的 BASH 的其他高级问题中讲解。 break/continue 熟悉 C 语言编程的都很熟悉 break 语句和 continue 语句。BASH 中同样有这两条语句,而且作用和用法也和 C 语言中相同,break 语句可以让程序流程从当前循环体中完全跳出,而 continue 语句可以跳过当次循环的剩余部分并直接进入下一次循环。 关于bash在控制台下的快捷键 ctrl+u 删除光标以前的所有字符ctrl+d 删除光标以前
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电梯材料合同协议
- 锅炉租赁合同协议
- 测试机构合同协议
- 抖音直播合同协议
- 购油供货合同协议
- 财务中介合同协议
- 撤销认证合同协议
- 电脑报价合同协议
- 采购百货合同协议
- 果蔬购买合同协议
- 高二下学期《家校携手凝共识齐心协力创辉煌》家长会
- (二模)沧州市2025届高三总复习质量监测 生物试卷(含答案详解)
- 2025年四川蓬安相如旅游开发有限责任公司招聘笔试参考题库含答案解析
- 2025建筑材料供应商采购合同模板2
- 机械基础试题库及参考答案
- 2025浙江1月卷读后续写及满分语料10类40句 (真假小偷) 原卷版
- 2024年农艺师考试实务考核试题及答案
- 餐饮合伙协议合同范本
- 人教鄂教版科学五年级下册第一单元 昼夜与四季单元教学教案
- 山东省烟台市芝罘区(五四制)2022-2023学年七年级下学期期中考试英语试题及答案
- 2024年福建泉州交发集团招聘考试真题
评论
0/150
提交评论