logo资料库

Shell编程基础教程.docx

第1页 / 共37页
第2页 / 共37页
第3页 / 共37页
第4页 / 共37页
第5页 / 共37页
第6页 / 共37页
第7页 / 共37页
第8页 / 共37页
资料共37页,剩余部分请下载后查看
一、Shell简介
二、几种常见的Shell
1.sh
2.csh
3.ksh
4.ash
5.bash
三、Shell与编译型语言的差异
1.编译型语言
2.解释型语言
四、什么时候使用Shell
五、第一个Shell脚本
六、Shell变量
1.定义变量
2.使用变量
3.重新定义变量
4.只读变量
5.删除变量
6.变量类型
七、Shell特殊变量
八、Shell替换
1.转义字符替换
2.命令替换
3.变量替换
九、Shell运算符
1.算术运算符
2.关系运算符
3.布尔运算符
4.字符串运算符
5.文件测试运算符
十、Shell注释
十一、Shell字符串
1.单引号
2.双引号
3.拼接字符串
4.获取字符串长度
5.提取子字符串
十二、Shell数组
1.定义数组
2.读取数组
3.获取数组的长度
十三、Shell echo命令
1.显示转义字符
2.显示变量
3.显示换行
4.显示不换行
5.显示结果重定向至文件
6.原样输出字符串
7.显示命令执行结果
十四、Shell printf命令
十五、Shell if else语句
1.if ... else 语句
2.if ... else ... fi 语句
3.if ... elif ... fi 语句
4.if语句其他用法
十六、Shell case esac语句
十七、Shell for 循环
1.顺序输出当前列表中的数字:
2.顺序输出字符串中的字符:
3.没有in列表,选取命令行输入的参数:
4.显示主目录下以 .bash 开头的文件:
十八、Shell while 循环
十九、Shell until循环
二十、Shell跳出循环
1.break命令
2.continue命令
二十一、Shell函数
1.不带return语句的函数
2.带有return语句的函数
3.函数嵌套
二十二、Shell函数参数
二十三、Shell输入输出重定向
1.输出重定向
2.输入重定向
3.重定向深入讲解
4.Here Document
二十四、Shell文件包含
Shell 编程基础教程 编写: 评审: 日期: 2015 年 12 月 2 日 序号 版本 状态 1 1.0 C 文档变更履历 简要说明 创建 变更日期 变更人 2015-12-2 变化状态:C——创建,A——增加,M——修改,D——删除
目录 1. 2. 3. 4. 5. Shell 简介 ................................................................................................................................. 4 几种常见的 Shell...................................................................................................................... 4 sh..................................................................................................................................................................... 4 csh................................................................................................................................................................... 4 ksh................................................................................................................................................................... 4 ash................................................................................................................................................................... 5 bash.................................................................................................................................................................5 Shell 与编译型语言的差异 ........................................................................................................6 1. 编译型语言.....................................................................................................................................................6 2. 解释型语言.....................................................................................................................................................6 什么时候使用 Shell...................................................................................................................6 第一个 Shell 脚本 ..................................................................................................................... 6 Shell 变量 ................................................................................................................................. 7 1. 定义变量......................................................................................................................................................... 7 2. 使用变量......................................................................................................................................................... 7 3. 重新定义变量.................................................................................................................................................8 4. 只读变量......................................................................................................................................................... 8 5. 删除变量......................................................................................................................................................... 8 6. 变量类型......................................................................................................................................................... 8 Shell 特殊变量 ..........................................................................................................................9 Shell 替换 ...............................................................................................................................10 1. 转义字符替换.............................................................................................................................................. 10 2. 命令替换.......................................................................................................................................................11 3. 变量替换.......................................................................................................................................................11 Shell 运算符 ........................................................................................................................... 12 1. 算术运算符...................................................................................................................................................12 2. 关系运算符...................................................................................................................................................13 3. 布尔运算符...................................................................................................................................................14 4. 字符串运算符.............................................................................................................................................. 15 5. 文件测试运算符.......................................................................................................................................... 17 Shell 注释 ...............................................................................................................................18 Shell 字符串 ....................................................................................................................... 19 1. 单引号...........................................................................................................................................................19 2. 双引号...........................................................................................................................................................19 3. 拼接字符串...................................................................................................................................................19 4. 获取字符串长度.......................................................................................................................................... 19 5. 提取子字符串.............................................................................................................................................. 20 Shell 数组 ...........................................................................................................................20 1. 定义数组.......................................................................................................................................................20 2. 读取数组.......................................................................................................................................................20 3. 获取数组的长度.......................................................................................................................................... 21 Shell echo 命令 .................................................................................................................21 一、 二、 三、 四、 五、 六、 七、 八、 九、 十、 十一、 十二、 十三、
十四、 十五、 1. 2. 3. 4. 十六、 十七、 十八、 十九、 二十、 1. 2. 二十一、 1. 显示转义字符.............................................................................................................................................. 21 2. 显示变量.......................................................................................................................................................21 3. 显示换行.......................................................................................................................................................22 4. 显示不换行...................................................................................................................................................22 5. 显示结果重定向至文件..............................................................................................................................22 6. 原样输出字符串.......................................................................................................................................... 22 7. 显示命令执行结果......................................................................................................................................22 Shell printf 命令 ............................................................................................................... 22 Shell if else 语句 ...............................................................................................................23 if ... else 语句............................................................................................................................................. 23 if ... else ... fi 语句..................................................................................................................................... 24 if ... elif ... fi 语句.......................................................................................................................................24 if 语句其他用法...........................................................................................................................................25 Shell case esac 语句 .........................................................................................................26 Shell for 循环 ................................................................................................................... 27 1. 顺序输出当前列表中的数字:................................................................................................................. 27 2. 顺序输出字符串中的字符:..................................................................................................................... 28 3. 没有 in 列表,选取命令行输入的参数:...............................................................................................28 4. 显示主目录下以 .bash 开头的文件:.................................................................................................. 28 Shell while 循环 ............................................................................................................... 28 Shell until 循环 ................................................................................................................. 29 Shell 跳出循环 ................................................................................................................... 30 break 命令...................................................................................................................................................30 continue 命令.............................................................................................................................................31 Shell 函数 ...................................................................................................................... 32 1. 不带 return 语句的函数............................................................................................................................32 2. 带有 return 语句的函数............................................................................................................................33 3. 函数嵌套.......................................................................................................................................................33 Shell 函数参数 ............................................................................................................... 34 Shell 输入输出重定向 .................................................................................................... 34 1. 输出重定向...................................................................................................................................................34 2. 输入重定向...................................................................................................................................................35 3. 重定向深入讲解.......................................................................................................................................... 35 4. Here Document........................................................................................................................................36 Shell 文件包含 ............................................................................................................... 37 二十二、 二十三、 二十四、
一、 Shell 简介 Shell 诞生于 Unix,是一个用 C 语言编写的程序,它既是一种命令语言,又是一种程序设计语言  命令语言: 它交互式地解释和执行用户输入的命令;  程序设计语言: 它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环 和分支。 Shell 虽然不是 Unix/Linux 系统内核的一部分,但它调用了系统核心的大部分功能来执行程序、建立 文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell 是最重要的实用程序,深入了解和 熟练掌握 shell 的特性极其使用方法,是用好 Unix/Linux 系统的关键。也可以说,shell 使用的熟练程度 反映了用户对 Unix/Linux 使用的熟练程度。 注意:单独地学习 Shell 是没有意义的,请先学习 Unix/Linux 入门教程,了解 Unix/Linux 基础。 Shell 有两种执行命令的方式:  交互式(Interactive):解释并执行用户的命令,用户输入一条命令,Shell 就解释执行一条。  批处理(Batch):用户事先写一个 Shell 脚本(Script),其中有很多条命令,让 Shell 一次把这些命令 执行完,而不必一条一条地敲命令。 Shell 脚本和编程语言很相似,也有变量和流程控制语句,但 Shell 脚本是解释执行的,不需要编译, 程序从脚本中一行一行读取并执行这些命令,相当于一个用户把脚本中的命令一行一行敲到 Shell 提示符 下执行。 二、 几种常见的 Shell 上面提到过,Shell 是一种脚本语言,那么,就必须有解释器来执行这些脚本。 Unix/Linux 上常见的 Shell 脚本解释器有 sh、bash、csh、ksh 等,习惯上把它们称作一种 Shell。 1. sh 是 Unix 标准默认的 shell,属于系统管理 shell。有如下几个突破: sh  脚本可以写在文件里被调用,比如 sh a.sh 可以执行 a.sh 里面的 shell 命令  可以交互或者非交互的方式调用  可以同步执行也可以异步执行  支持输入输出的 pipeline,就是管道方式  支持输入输出的重定向,就是现在使用的> 和 >>  提供一系列内置命令  提供流程控制基本的函数和结构  弱类型变量,就是可以直接 a=1,不需要指定 a 为 int  提供本地和全局的变量作用域  脚本执行前不需要编译  去掉 goto 功能  使用``进行命令执行替换  增加了 for~do~done 的循环  增加了 case~in~esac 的条件选择  文件描述符 2>代表错误信息导出 csh 2. csh 是一种语法类似于 C 语言的脚本语言,后来 csh 引入了 Tenex 系统中的一些功能逐渐演化成了 tcsh,现在我们所看到的 csh 其实是 tcsh 的一个软链接。目前 Mac 系统上还保留了 csh。 3. ksh
ksh 是当时兼容性很高的脚本语言,在许多操作系统上都可用,除了向后兼容 sh 同时也吸取了 csh 的一些优点。原来是一款专有软件,直到 2000 年才作为开源软件发布。 4. ash ash 是 Linux 中占用系统资源最少的一个小 shell,之后又演变为 dash,但是由于本身内部命令较少, 使用起来很不方便所以未能流行起来。 5. bash bash 是 Linux 标准默认的 shell,除了支持脚本的向后兼容性,bash 还吸收了 K Shell 和 C Shell 的 一些特性。目前很多机器上的/bin/sh 往往都链接到 bash,我们以为我们是使用 Bourne shell,实 际上我们使用的是 Bourne-Again shell
三、 Shell 与编译型语言的差异 大体上,可以将程序设计语言可以分为两类:编译型语言和解释型语言。 1. 编译型语言 很多传统的程序设计语言,例如 Fortran、Ada、Pascal、C、C++和 Java,都是编译型语言。这类 语言需要预先将我们写好的源代码(source code)转换成目标代码(object code),这个过程被称作“编译”。 运行程序时,直接读取目标代码(object code)。由于编译后的目标代码(object code)非常接近计算 机底层,因此执行效率很高,这是编译型语言的优点。 但是,由于编译型语言多半运作于底层,所处理的是字节、整数、浮点数或是其他机器层级的对象, 往往实现一个简单的功能需要大量复杂的代码。例如,在 C++里,就很难进行“将一个目录里所有的文件 复制到另一个目录中”之类的简单操作。 2. 解释型语言 解释型语言也被称作“脚本语言”。执行这类程序时,解释器(interpreter)需要读取我们编写的源代码 (source code),并将其转换成目标代码(object code),再由计算机运行。因为每次执行程序都多了编译 的过程,因此效率有所下降。 使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之 类的对象;缺点是它们的效率通常不如编译型语言。不过权衡之下,通常使用脚本编程还是值得的:花一 个小时写成的简单脚本,同样的功能用 C 或 C++来编写实现,可能需要两天,而且一般来说,脚本执行的 速度已经够快了,快到足以让人忽略它性能上的问题。脚本编程语言的例子有 awk、Perl、Python、Ruby 与 Shell。 四、 什么时候使用 Shell Shell 是各 UNIX 系统之间通用的功能,并且经过了 POSIX(可移植操作系统接口)的标准化。所以 Shell 脚本只要“用心写”一次,即可应用到很多系统上。之所以要使用 Shell 脚本是基于:  简单性:Shell 是一个高级语言,通过它,你可以简洁地表达复杂的操作。  可移植性:使用 POSIX 所定义的功能,可以做到脚本无须修改就可在不同的系统上执行。  开发容易:可以在短时间内完成一个功能强大又好用的脚本。 测试工程师使用 shell 可以减少一些重复繁琐的工作,同时也能根据需要编写出更有效率的工作脚本 开发工程师用 shell 可以辅助完善代码的开发,使用 shell 代替一些复杂的代码 服务器工程师可以将大部分的工作全部通过 shell 脚本来实现来解放双手 五、 第一个 Shell 脚本 使用 touch 或 vi 新建一个文件 test.sh,这里扩展名为 sh(sh 代表 shell),扩展名并不影响脚本执 行,只是方便理解。 输入一些代码: #!/bin/bash echo "Hello World !" “#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。 echo 命令用于向窗口输出文本。 脚本编写完成后,需要赋予它执行的权限才能让脚本运行起来,使用 chmod 命令让脚本有执行权限 chmod +x test.sh 执行脚本有两种方式,一种是通过【./】查找当前的脚本并执行,通过这种方式运行 bash 脚本,第
一行一定要写对,好让脚本查找到正确的解释器。 ./test.sh 注意,一定要写成./test.sh,而不是 test.sh。运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有/bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的 当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用./test.sh 告诉系统说,就在当前目 录找。 另一种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如: /bin/sh test.sh 这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。 例子:下面的脚本使用 read 命令从 stdin(标准输入) 获取输入并赋值给 NAME 变量,最后在 stdout(标准输出) 上输出,运行看看结果是什么 #!/bin/bash echo "What is your name?" read NAME echo "Hello, $NAME" 六、 Shell 变量 Shell 支持自定义变量。 1. 定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵 循如下规则: 1.1 首个字符必须为字母(a-z,A-Z); 1.2 中间不能有空格,可以使用下划线(_); 1.3 不能使用标点符号; 1.4 不能使用 bash 里的关键字(可用 help 命令查看保留关键字); 变量定义举例: myUrl=http://www.xxcb.cn myNum=100 2. 使用变量 使用一个定义过的变量,只要在变量名前面加美元符号($)即可,如: your_name="wukong" echo $your_name echo ${your_name} 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面 这种情况: for skill in Ada Coffe Action Java do echo "I am good at ${skill}Script" done
如果不给 skill 变量加花括号,写成 echo "I am good at $skillScript",解释器就会把$skillScript 当 成一个变量(其值为空),代码执行结果就不是我们期望的样子了。推荐给所有变量加上花括号{},这是个 好的编程习惯。 3. 重新定义变量 已定义的变量,可以被重新定义,如: myUrl=http://www.xxcb.cn echo ${myUrl} myUrl=http://www.94uv.com echo ${myUrl} 注意,第二次赋值的时候不能写$myUrl="http://see.xidian.edu.cn/cpp/shell/",使用变量的时候才 加美元符($)。 4. 只读变量 使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。 下面的例子尝试更改只读变量,结果报错: #!/bin/bash myUrl=http://www.xxcb.cn readonly myUrl myUrl=http://www.94uv.com 运行脚本,结果如下: /bin/sh: NAME: This variable is read only. 5. 删除变量 使用 unset 命令可以删除变量。语法: unset variable_name 变量被删除后不能再次使用;unset 命令不能删除只读变量。举个例子: #!/bin/sh myUrl=http://www.xxcb.cn unset myUrl echo $myUrl 上面的脚本没有任何输出。 6. 变量类型 运行 shell 时,会同时存在三种变量: 6.1 局部变量 局部变量在脚本或命令中定义,仅在当前 shell 实例中有效,其他 shell 启动的程序不能访问局 部变量。 6.2 环境变量 所有的程序,包括 shell 启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常 运行。必要的时候 shell 脚本也可以定义环境变量,通过 set 命令可查看这些变量。 6.3 shell 变量 shell 变量是由 shell 程序设置的特殊变量。shell 变量中有一部分是环境变量,有一部分是局部 变量,这些变量保证了 shell 的正常运行
分享到:
收藏