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 的正常运行