




已阅读5页,还剩39页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章 Shell编程,本章概要 什么是Shell脚本 正则表达式与grep命令 用Bash Shell编程,3.4 用bash Shell编程,3.4.1 shell编程预备知识,3.4.2 shell变量,3.4.3 读取用户的输入,3.4.4 算术运算,3.4.5 流程控制,3.4.6 函数,一个shell脚本可以包含一个或多个命令。shell脚本主要用于处理自动循环或大的任务。 一个任务可能是: 将文件分类; 向文件插入文本; 迁移文件; 从文件中删除行; 清除系统过期文件; 系统一般的管理维护工作; 等等。,3.4.1 shell编程预备知识,一个典型的“Hello World”程序,#!/bin/bash #name:hello.sh echo “Hello World“,脚本的第一行通知shell使用系统上的Bourne Again shell解释器。在这个例子中,bash是在/bin目录下。,如果bash是在不同的路径下,要将全路径写清。,#!被称为幻数,内核根据它来确定用哪个程序来翻译脚本中的行。这一行必须是脚本顶端第一行。通常称为sh#行。,加注释需要此行的第一个字符为#,解释器对此行不予解释。一般我们在第二行注释中写入脚本文件名。,一个Bash shell程序由一组Linux命令、bash shell命令、编程结构和注释组成。 当创建文件时,文件并没有被自动授予执行权限。如果要运行脚本,就必须增加其执行权限,同时确保正确建立脚本路径,这样只用文件名就可以运行它了。 $chmod +x hello.h,运行shell脚本的方式,一种方式是以shell脚本程序的文件名做参数,用“.”命令来执行脚本程序中的命令,如下所示: $ .hello.sh 另一种方式是将shell脚本程序文件的属性改为“可执行”,然后在shell提示符下键入该文件名运行它。 $ chmod 700 ./hello.sh $ hello.sh 如返回错误信息: sh:hello.sh:command not found. 再试: $ ./hello.sh Hello World,另一个例子,上述脚本通过将目录下文件名截断,清除/usr/adm /下信息,并删除/usr/local/apps/log下所有注册信息。,3.4.2 shell变量,为使shell编程更有效,系统提供了一些shell变量。shell变量可以保存诸如路径名、文件名或者一个数字这样的变量名。shell将其中任何设置都看做文本字符串。 有两种变量,本地和环境。严格地说可以有4种,但其余两种是只读的,可以认为是特殊变量,它用于向s h e l l脚本传递参数。 本地变量 环境变量 位置变量 特定参数变量,1.Shell本地变量,在BASH中不需要定义变量。没有 “int i” 这样的定义过程。如果想用一个变量,只要它没有在前面被定义过,就直接可以用,使用该变量的第一条语句应该是对它赋初值; BASH中的变量名必须以字母或下划线开头,其余字符可以是字母、下划线和数字,不能含有保留字,不能含有 “-” 等保留字符,也不能含有空格。名字是大小写敏感的。 如果不赋初值,该变量是空( 注意:是 NULL,不是 0 )。,变量赋值格式,要设置一个本地变量,格式为: $variable_name=value 更为标准的变量设置方式是: $variable_name=value 用花括号括起来,可以防止shell误解变量值。 注意:如果取值包含空格,必须使用双引号括起来。 此外,BASH还可使用内置命令declare创建变量。不带任何参数,declare将列出所有已设置的变量。 declare variable=value,脚本 hello2,#!/bin/bash # give the initialize value to STR STR=“Hello World” echo $STR,在定义变量时,变量名前不应加符号$,在引用变量的内容时则应在变量名前加$;,说明,变量赋值时,=左右两边都不能有空格; BASH 中的语句结尾不需要分号“;“; 除了在变量赋值和在FOR循环语句头中,BASH 中的变量使用必须在变量前加“$“符号。 由于 BASH 程序是在一个新的进程中运行的,所以该程序中的变量定义和赋值不会改变其他进程或原始 Shell 中同名变量的值,也不会影响他们的运行。 想要在说明一个变量并对它设置为一个特定值后就不在改变它的值时,可以用下面的命令来保证一个变量的只读性: readonly 变量名,shell变量没有类型,#!/bin/bash x=1999 let “x = $x + 1“ echo $x x= “ Olympic“$x echo $x,本地变量和作用域,变量的作用域指变量在一个程序中哪些地方可见。对于Shell来说,局部变量的作用域被限定在创建它们的Shell中。 例如,本地变量file-name取值为loop.doc,这个值仅在用户当前的shell生命期有意义。如果在shell中启动另一个进程或退出,此值将无效。 用户不能对其他shell或进程设置此值有效。,显示变量,使用echo命令可以显示单个变量的值,并在变量名前加$。 #!binbash #name:test1.sh name=Tom echo name echo $name 运行结果: name Tom,显示所有本地变量,使用命令set显示所有本地定义的shell变量。set的输出可能很长。 运行set命令时,凡是被设置为某个值或空值的变量都会被显示出来,未经设置的变量则不会显示。,清除/复位变量,使用unset命令。 unset variable_name 例如: $PC=IBM $echo $PC IBM $unset PC $echo $PC $,结合变量值,将变量并排可使变量的值连接在一起。 echo $ variable_name $ variable_name. 例如: $FIRST=”Bruce ” $SUBNAME=Willis $echo $FIRST$SUBNAME Bruce Willis,测试变量是否已经设置,有时需要测试是否已经设置或初始化变量。如未设置或初始化,可以使用提供的缺省值。此命令的格式为: $ variable_name:=value 下面是一个使用的例子。查询工资清单应用程序的运行时间及清单的类型。在运行时间及类型输入时,键入回车表明用户并未设置两个变量值,将使用缺省值(03:00和weekly),并将传入at 命令中以按时启动作业。,vartest清单,#!/bin/bash #vartest echo “what time do you wish to start the payroll03:00” read TIME echo “Process to start at $TIME:=03:000k” echo “Is it a monthly or weekly runweekly” read RUN_TYPE echo “Run type is $RUNTYPE:=weekly” at f $RUN_TYPE $TIME,在输入域键入回车键,输出的结果如下: $./vartest what time do you wish to start the payroll03:00 Process to start at 03:00 0k Is it a monthly or weekly runweekly Run type is weekly warning:commands will be executed using /bin/sh job 15 at 2003-5-14 03:00,总结,BASH 中的变量与 C 语言中变量的区别: BASH中的变量在引用时都需要在变量前加上 “$” 符号( 第一次赋值及在For循环的头部不用加 “$”符号 ); BASH中没有浮点运算,因此也就没有浮点类型的变量可用; BASH中的整型变量的比较符号与C语言中完全不同,而且整型变量的算术运算也需要经过 let 或 expr 语句来处理;,3.环境变量,环境变量可以用于创建它们的shell和从该shell产生的任意子shell或进程。它们经常被称为全局变量,不同于本地变量。 变量被创建时所处的shell称为父shell,如果父shell又启动了一个shell,这个shell被称为子shell。环境变量将传递给这些子shell,可以从父传递给子再传递给孙。但不可以反方向传递。 有一些环境变量,如HOME、LOGNAME、PATH和SHELL,在用户登录之前就已经在/bin/login中设置好了。,环境变量的设置,环境变量可以在命令行中设置,但用户注销时这些值将丢失,因此最好在. profile文件中定义。这样每次登录时这些值都将被初始化。 传统上,所有环境变量均为大写。环境变量应用于用户进程前,必须用export命令导出。 环境变量与本地变量设置方式相同。,设置环境变量,要想设置环境变量,就要在变量赋值之后或设置变量时使用export命令。 VARIABLE-NAME=value;export VARIABLE-NAME 在两个命令之间是一个分号,也可以这样写: VARIABLE-NAME=value Export VARIABLE-NAME 或: export VARIABLE-NAME=value,显示环境变量,显示环境变量与显示本地变量一样,例子如下:,使用env命令可以查看所有的环境变量。,清除环境变量,使用unset命令清除环境变量。,将变量导出到子进程,shell新用户碰到的问题之一是定义的变量如何导出到子进程。可以利用环境变量将变量导入到子进程中。 以下是两个脚本代码father和child。,#!/bin/bash #name: father script echo “This is the father” FILM=”A Few Good Men” echo “I like the film: $FILM” #call the child script child echo “back to father” echo “and the film is $FILM” #!/bin/bash #name: child script echo “Called from father:I am the child” echo “film name is : $FILM” FILM=”Die Hard” echo “Changing film to $FILM”,运行的结果,$./father This is the father I like the film: A Few Good Men Called from father:I am the child film name is: Changing film to Die Hard back to father and the film is A Few Good Men,如果在father脚本中加入export命令,就可以将FILM变量导入到child脚本中,以便该脚本得到FILM的取值。 不能将变量从子进程导入到父进程,这时可利用重定向。,#!/bin/bash #name: father script echo “This is the father” FILM=”A Few Good Men” echo “I like the film: $FILM” #call the child script child echo “back to father” echo “and the film is $FILM” #!/bin/bash #name: child script echo “Called from father:I am the child” echo “film name is : $FILM” FILM=”Die Hard” echo “Changing film to $FILM”,export FILM,再运行的结果,$./father This is the father I like the film: A Few Good Men Called from father:I am the child film name is: Changing film to Die Hard back to father and the film is A Few Good Men,A Few Good Men,位置变量参数,如果要向从命令行向一个shell脚本传递信息,可以使用位置参数完成这项功能。参数数目可以任意多。但是只有前9个可以被访问。 参数从第0个开始,到第9个结束;每个访问参数前都要加$符号。第0个参数表示预留保存实际脚本的名字。无论脚本是否有参数,此值均可使用。,示例,如果向脚本传送Did You See The Full Moon信息,下面的表格讲解了如何访问每一个参数。 位置变量参数 $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 脚本名字 Did You See The Full Moon,#!/bin/bash #name:param echo “This is the script name : $0” echo “This is the first parameter : $1” echo “This is the second parameter : $2” echo “This is the third parameter : $3” echo “This is the fourth parameter : $4” echo “This is the fifth parameter : $5” echo “This is the sixth parameter : $6” echo “This is the seventh parameter : $7” echo “This is the eighth parameter : $8” echo “This is the ninth parameter : $9”,运行结果,$param Did you see the full moon This is the script name :./param” This is the first parameter : Did ” This is the second parameter : You” This is the third parameter : See” This is the fourth parameter : The” This is the fifth parameter : Full” This is the sixth parameter : Moon” This is the seventh parameter : This is the eighth parameter : This is the ninth parameter :,特定变量参数,使用示例,特定变量的输出使用户获得更多的脚本相关信息,可以检查传递了多少个参数,进程相应的ID号。 例如: $cp ok.txt /tmp $echo $? 0 使用$?检验返回状态,可知脚本有无错误。,3.4.3 读取用户的输入,使用read命令为变量读入数值。该命令从标准输入上读入内容。例如: #!/bin/bash #name:greeting echo Please enter a greeting: read greeting echo “The greeting you entered was $
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年山东高考化学试题(解析版)
- 销售工作题目大全及答案
- 葡萄酒盲品知识培训
- 2025联名合伙合同书范本版
- 2025高考物理试题分类汇编:万有引力与宇宙航行(解析版)
- 2025综合雇佣合同范本
- 2025-2026学年人教版六年级数学上册应用题平均数问题专项练习题【含答案】
- 物业安全操作试题及答案
- 2025车辆买卖协议合同
- 2025年公共自行车锁车器设备项目合作计划书
- 小学班级培优辅差课后服务计划
- 火力发电原理课件
- 学校五常法管理制度
- 2025年七一党课-作风建设永远在路上学习教育党课
- 国际托育政策比较-洞察及研究
- 武术五步拳教学课件
- T/HQPA 5-2019防倾覆弹性滑板支座
- 茶馆承包协议书
- 93阅兵仪式观后感400字(9篇)
- 产后出血护理授课课件
- 行动研究的历史演变、思想内涵及实践意义
评论
0/150
提交评论