共计 3398 个字符,预计需要花费 9 分钟才能阅读完成。
什么是 Shell 脚本 ?
Shell 脚本(英语:Shellscript)是一种电脑程序与文本文件,内容由一连串的 shell 指令构成,经由 UnixShell 直译其内容后运作。被当成是一种脚本语言来规划,其运作方法与直译语言适当,由 Unixshell 扮演指令行解释器的人物,在读取 shellscript 以后,依序运转其中的 shell 指令,以后输出结果。使用 Shellscript 可以进行系统管理,文件操作等。
在 Unix 及所有的类 Unix 系统中,如 Linux、FreeBSD 等操作系统,都存在 ShellScript。依照 Unixshell 的各种不同类型,Shellscript 也有各种不同方言。在 DOS、OS/2、MicrosoftWindows 中的批处理文件,跟 shellscript 有类似的功能。
来看一个实例
#!/bin/sh
cd~
mkdirshell_tut
cdshell_tut
for((i=0;i<10;i++));do
touchtest_$i.txt
done
实例解析 :
第 1 行:指定脚本解释器,这里是用 /bin/sh 做解释器的
第 2 行:切换到当前用户的 home 目录
第 3 行:创建一个目录 shell_tut
第 4 行:切换到 shell_tut 目录
第 5 行:循环条件,一共循环 10 次
第 6 行:创建一个 test_1…10.txt 文件
第 7 行:循环体结束
cd,mkdir,touch 都是系统自带的程序,一般在 /bin 或者 /usr/bin 目录下。for,do,done 是 sh 脚本语言的关键字。
环境
shell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
当前主流的操作系统都支持 shell 编程,本文档所述的 shell 编程是指 Linux 下的 shell,讲的基本都是 POSIX 标准下的功能,所以,也适用于 Unix 及 BSD(如 MacOS)。
Linux
Linux 默认安装就带了 shell 解释器。
MacOS
MacOS 不仅带了 sh、bash 这两个最基础的解释器,还内置了 ksh、csh、zsh 等不常用的解释器。
Windows 上的模拟器
windows 出厂时没有内置 shell 解释器,需要自行安装,为了同时能用 grep,awk,curl 等工具,最好装一个 cygwin 或者 mingw 来模拟 Linux 环境。
cygwin
mingw
脚本解释器
sh
即 Bourneshell,POSIX(PortableOperatingSystemInterface)标准的 shell 解释器,它的二进制文件路径通常是 /bin/sh,由 BellLabs 开发。
bash
Bash 是 Bourneshell 的替代品,属 GNUProject,二进制文件路径通常是 /bin/bash。业界通常混用 bash、sh、和 shell,比如你会经常在招聘运维工程师的文案中见到:熟悉 LinuxBash 编程,精通 Shell 编程。
在 CentOS 里,/bin/sh 是一个指向 /bin/bash 的符号链接:
[root@centosraw~]#ls-l/bin/*sh
-rwxr-xr-x.1rootroot903272Feb2205:09/bin/bash
-rwxr-xr-x.1rootroot106216Oct172012/bin/dash
lrwxrwxrwx.1rootroot4Mar2210:22/bin/sh->bash
但在 MacOS 上不是,/bin/sh 和 /bin/bash 是两个不同的文件,尽管它们的大小只相差 100 字节左右:
iMac:~wuxiao$ls-l/bin/*sh
-r-xr-xr-x1rootwheel13716486Nov16:52/bin/bash
-rwxr-xr-x2rootwheel7729926Nov16:52/bin/csh
-r-xr-xr-x1rootwheel21807366Nov16:52/bin/ksh
-r-xr-xr-x1rootwheel13717126Nov16:52/bin/sh
-rwxr-xr-x2rootwheel7729926Nov16:52/bin/tcsh
-rwxr-xr-x1rootwheel11039846Nov16:52/bin/zsh
高级编程语言
理论上讲,只要一门语言提供了解释器(而不仅是编译器),这门语言就可以胜任脚本编程,常见的解释型语言都是可以用作脚本编程的,如:Perl、Tcl、Python、PHP、Ruby。Perl 是最老牌的脚本编程语言了,Python 这些年也成了一些 Linux 发行版的预置解释器。
编译型语言,只要有解释器,也可以用作脚本编程,如 Cshell 是内置的(/bin/csh),Java 有第三方解释器 Jshell,Ada 有收费的解释器 AdaScript。
如下是一个 PHPShellScript 示例(假设文件名叫 test.php):
#!/usr/bin/php
<?php
for($i=0;$i<10;$i++){
echo$i.”\n”;
}
执行:
/usr/bin/phptest.php
或者:
chmod+xtest.php
./test.php
如何选择 shell 编程语言
熟悉 vs 陌生
如果你已经掌握了一门编程语言(如 PHP、Python、Java、JavaScript),建议你就直接使用这门语言编写脚本程序,虽然某些地方会有点啰嗦,但你能利用在这门语言领域里的经验(单元测试、单步调试、IDE、第三方类库)。
新增的学习成本很小,只要学会怎么使用 shell 解释器(Jshell、AdaScript)就可以了。
简单 vs 高级
如果你觉得自己熟悉的语言(如 Java、C)写 shell 脚本实在太啰嗦,你只是想做一些备份文件、安装软件、下载数据之类的事情,学着使用 sh,bash 会是一个好主意。
shell 只定义了一个非常简单的编程语言,所以,如果你的脚本程序复杂度较高,或者要操作的数据结构比较复杂,那么还是应该使用 Python、Perl 这样的脚本语言,或者是你本来就已经很擅长的高级语言。因为 sh 和 bash 在这方面很弱,比如说:
它的函数只能返回字串,无法返回数组
它不支持面向对象,你无法实现一些优雅的设计模式
它是解释型的,一边解释一边执行,连 PHP 那种预编译都不是,如果你的脚本包含错误 (例如调用了不存在的函数),只要没执行到这一行,就不会报错
环境兼容性
如果你的脚本是提供给别的用户使用,使用 sh 或者 bash,你的脚本将具有最好的环境兼容性,perl 很早就是 Linux 标配了,Python 这些年也成了一些 Linux 发行版的标配,至于 macos,它默认安装了 perl、Python、ruby、php、java 等主流编程语言。
第一个 shell 脚本
编写
打开文本编辑器,新建一个文件,扩展名为 sh(sh 代表 shell),扩展名并不影响脚本执行,见名知意就好,如果你用 php 写 shell 脚本,扩展名就用 php 好了。
输入一些代码,第一行一般是这样:
#!/bin/bash
#!/usr/bin/php
“#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行。
运行
运行 Shell 脚本有两种方法:
运行 Shell 脚本有两种方法:
作为可执行程序
chmod+xtest.sh
./test.sh
注意,一定要写成./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,Linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin,/sbin,/usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用./test.sh 告诉系统说,就在当前目录找。
通过这种方式运行 bash 脚本,第一行一定要写对,好让系统查找到正确的解释器。
这里的 ” 系统 ”,其实就是 shell 这个应用程序(想象一下 WindowsExplorer),但我故意写成系统,是方便理解,既然这个系统就是指 shell,那么一个使用 /bin/sh 作为解释器的脚本是不是可以省去第一行呢?是的。
作为解释器参数
这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:
/bin/shtest.sh
/bin/phptest.php
这种方法运转的脚本,不需要在榜首行指定解释器信息,写了也没用。