什么是Shell脚本?Shell脚本(英文:Shell script)是一种计算机程序和文本文件。其内容由一系列shell命令组成,由Unix Shell直接翻译,然后进行操作。设计成脚本语言,操作方式等同于直译语言。Unix shell扮演命令行解释器的角色。在读取shell脚本后,它按顺序运行shell命令,然后输出结果。Shell脚本可用于系统管理、文件操作等。

Shell脚本存在于Unix和所有类Unix系统中,如Linux、FreeBSD等操作系统。根据Unix shell类型的不同,shell脚本也有不同的方言。DOS、OS/2、微软Windows中的批处理文件具有与shell脚本类似的功能。

1)记录命令历史。linux会记录我们输入的命令,默认可以记录1000条历史命令。这些命令保存在。用户主目录中的bash_history文件。您需要知道的一点是,只有当用户正常退出当前shell时,当前shell中运行的命令才会保存到。bash_history文件。

有一个有趣的字符与命令历史有关,那就是“!”。有几种常用的应用:(1)!(连续两次“!”),表示执行最后一条指令;(2)!n(其中n为数字)表示执行命令历史中的第n条指令,如“!“100”表示执行命令历史中的第100个命令;(3)!比如String(字符串大于等于1)!Ta,表示命令执行历史中以ta开头的最新指令。

2)命令和文件名补全我在本教程开头介绍过这个函数,还记得吗?没错。只需按tab键,它可以帮助您完成指令或路径或文件名。连续按tab键两次,系统会列出所有指令或文件名。

3) alias是在alias之前引入的,是bash独有的功能之一。我们可以通过别名将一个常见的长指令别名为一个简单易记的指令。如果不想用,也可以用unalias取消别名功能。直接点击别名,会看到当前系统默认别名:

看到了吧,系统预置的别名命令就那么几个,你也可以自定义你想要的命令别名。别名语法很简单,alias[命令别名]=['特定命令']。

4)通配符在bash下,可以用*匹配零个或多个字符,用?匹配一个字符。

5)来自定向输入的输入输出重定向用于改变命令的输入,输出重定向用于改变命令的输出。输出重定向更常用,它通常用于将命令的结果输入到一个文件中,而不是屏幕上。进入重定向的命令是《,输出重定向的命令是》,还有错误重定向2和附加重定向,后面会详细介绍。

6)管道符号“|”在管道符号之前已经提到过,意思是把前一个命令的结果丢给后一个命令。

7)作业控制。当一个进程正在运行时,您可以暂停它(按Ctrl z),然后使用fg命令恢复它,使用bg命令使它在后台运行,或者您可以停止它(按Ctrl c)。

[变量]

在上一章中,笔者曾经介绍过环境变量PATH,这是shell预置的一个变量。通常外壳预设的变量都是大写的。变量,简单来说就是用一个更简单的字符串来代替一些有特殊意义的设置和数据。以PATH为例,这个路径代替了所有常用命令的绝对路径的设置。由于路径是可变的,所以当我们运行一个命令时,不需要输入全局路径,只需输入命令名即可。您可以使用echo命令来显示变量的值。

除了PATH、HOME和LOGNAME,系统还预置了哪些环境变量?

使用env命令列出系统预设的所有系统变量。但是,登录的用户不同,这些环境变量的值也不同。当前显示的是帐户根的环境变量。下面笔者简单介绍一下常见的环境变量:

PATH决定了shell将在哪个目录中查找命令或程序。

HOME当前用户主目录

历史记录编号

LOGNAME当前用户的登录名。

主机名是指主机的名称。

Shell预用户SHELL类型

与LANG语言相关的环境变量,可以用多种语言修改。

邮件当前用户的邮件存储目录

PWD当前目录

env命令显示的变量只是环境变量,实际上还有很多系统预置的变量。您可以使用set命令显示系统预设的所有变量。

由于篇幅所限,笔者没有对上述例子中的所有显示结果进行截图。Set不仅可以显示系统预置的变量,也可以显示用户自定义的变量。用户定义的变量?是的,用户也可以自己定义变量。

Shell编程快速入门查看示例#!/bin/sh

cd ~

mkdir shell_tut

cd壳_啧啧

for((I=0;我《10;I));做

触摸测试_$i.txt

完成的

解析示例:第1行:指定脚本解释器,其中/bin/sh用作解释器。

第2行:切换到当前用户的主目录。

第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(比如Mac OS)。

LinuxLinux默认自带一个shell解释器。

mac 操作系统

Mac OS不仅有sh和bash两个基础解释器,还内置了ksh、csh、zsh等不常用的解释器。

Windows上的模拟器

Windows出厂时没有内置shell解释器,需要自己安装。为了同时使用grep、awk、curl等工具,最好安装一个cygwin或者mingw来模拟linux环境。

cygwin

mingw

脚本解释器sh

那就是Bourne shell,POSIX(可移植操作系统接口)标准shell解释器,它的二进制文件路径通常是/bin/sh,由贝尔实验室开发。

尝试

Bash是Bourne shell的替代品,属于GNU项目。二进制文件路径通常是/bin/bash。Bash、sh、Shell在业内通常是混用的。比如你会经常在招聘运维工程师的文案中看到,你熟悉Linux Bash编程,精通shell编程。

在CentOS中,/bin/sh是指向/bin/bash的符号链接:

[root@centosraw ~]# ls -l /bin/*sh

-rwxr-xr-x. 1根root 903272 Feb 22 05:09 /bin/bash

-rwxr-xr-x. 1根根106216 2012年10月17日/bin/dash

lrwxrwxrwx。1根根4月22日10:22 /bin/sh -》痛击

但在Mac OS上不行。/bin/sh和/bin/bash是两个不同的文件,尽管它们的大小只相差100字节:

iMac:~吴晓$ ls -l /bin/*sh

-r-xr-xr-x 1根轮1371648 6 11月16日16:52 /bin/bash

-rwxr-xr-x 2根轮772992 6 11月16日16:52 /bin/csh

-r-xr-xr-x 1根轮2180736 6 11月16日16:52 /bin/ksh

-r-xr-xr-x 1根轮1371712 6 11月16日16:52 /bin/sh

-rwxr-xr-x 2根轮772992 11月6日16:52 /bin/tcsh

-rwxr-xr-x 1根轮1103984 6 11月16日16:52 /bin/zsh

从理论上讲,一门语言只要提供了解释器(不仅仅是编译器),就可以胜任脚本编写。常见的解释语言可以用于脚本编写,如Perl、Tcl、Python、PHP和Ruby。Perl是最古老的脚本语言,多年来Python已经成为一些linux发行版的预设解释器。

编译语言也可以用于脚本编写,只要它们有解释器。比如C shell内置(/bin/csh),Java有第三方解释器Jshell,Ada有付费解释器AdaScript。

下面是一个PHP Shell脚本示例(假设文件名为test.php):

#!/usr/bin/php

《?服务器端编程语言(Professional Hypertext Preprocessor的缩写)

for($ I=0;$ I《10;$i ) {

echo $i ."";

}

执行:

/usr/bin/PHP test.php

或者:

chmod x test.php。/test.php

如何选择shell编程语言

熟悉与陌生

如果你已经掌握了一门编程语言(比如PHP、Python、Java、JavaScript),我建议你直接用这门语言写脚本。虽然有些地方会有点啰嗦,但是你可以利用你在这个语言领域的经验(单元测试,单步调试,IDE,第三方类库)。

新的学习成本很小,只要学会如何使用shell解释器(Jshell,AdaScript)。

简单与高级

如果你觉得用自己熟悉的语言(比如Java、C)写shell脚本太啰嗦,而你只想做备份文件、安装软件、下载数据之类的事情,那么学习使用sh和bash会是个不错的主意。

Shell只定义了一种非常简单的编程语言,所以如果你的脚本程序比较复杂或者要操作的数据结构比较复杂,你还是应该使用Python、Perl等脚本语言,或者你已经很擅长的高级语言。因为sh和bash在这方面比较弱,比如:

它的函数只能返回字符串,不能返回数组。

它不支持面向对象,你无法实现一些优雅的设计模式。

它是解释性的,在解释的同时执行。它甚至不像PHP那样是预编译的。如果你的脚本包含错误(比如调用不存在的函数),只要没有执行到这一行,就不会报错。

环境兼容性

如果您的脚本供其他用户使用,使用sh或bash,您的脚本将具有最佳的环境兼容性。长期以来,perl一直是linux的标准,近年来,python已经成为一些linux发行版的标准。至于mac os,已经默认安装了perl、python、ruby、php、java等主流编程语言。

第一个shell脚本

打开一个文本编辑器,创建一个扩展名为sh的新文件(sh代表shell)。该扩展不影响脚本的执行。知道名字的含义是很好的。如果你用php写一个shell脚本,那么扩展将会是php。

输入一些代码,第一行一般是这样的:

#!/bin/bash

#!/usr/bin/php

"#!"是一个约定标记,告诉系统这个脚本需要执行什么解释器。

奔跑

有两种方法可以运行Shell脚本:

有两种方法可以运行Shell脚本:

作为可执行程序

chmod x测试. sh。/test.sh

注意一定要写。/test.sh,而不是test.sh,对于运行其他二进制程序是一样的。直接写test.sh,linux系统会去路径查找是否有叫test.sh的,但是只有/bin、/sbin、/usr/bin等。都在路径中,而你的当前目录通常不在路径中,所以写test.sh不会被找到。/test.sh告诉系统在当前目录中查找。

要以这种方式运行bash脚本,第一行必须写得正确,这样系统才能找到正确的解释器。

这里的“系统”其实就是shell(想象一下Windows Explorer)的应用,但我为了方便理解,特意写成了一个系统。既然这个系统引用shell,那么使用/bin/sh作为解释器的脚本可以省略第一行吗?是

作为解释器参数

这种运行方式是直接运行解释器,其参数是shell脚本的文件名,比如:

/bin/sh test.sh

/bin/PHP test.php