欢迎您的光临,本博所发布之文章皆为作者亲测通过,如有错误,欢迎通过各种方式指正。由于本站位于香港虚拟主机,故速度比较慢。

教程  Shell和Shell脚本编程极简入门教程

Shell 本站 213 0评论

一、Shell和Shell脚本简介


1.Shell

shell是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。shell 既是一种命令语言,又是一种程序设计语言。简而言之,shell是命令解释器之外的一种编程语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。

000.png

它虽然不是Unix/Linux系统内核的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Unix/Linux系统的关键。


可以说,shell使用的熟练程度反映了用户对Unix/Linux使用的熟练程度。


shell可以做什么:批处理、自动化管理、监控管理、日志数据处理、自动数据备份等等。


shell有两种执行命令的方式:

交互式(Interactive):解释执行用户的命令,用户输入一条命令,shell就解释执行一条。

批处理(Batch):用户事先写一个shell脚本(Script),其中有很多条命令,让shell一次把这些命令执行完,而不必一条一条地敲命令。(这种方式也就是下面提到的shell脚本)


2.Shell脚本

Shell脚本(英语:Shell script)是一种电脑程序与文本文件,内容由一连串的shell命令组成,经由Unix Shell直译其内容后运作。被当成是一种脚本语言来设计,其运作方式与直译语言相当,由Unix shell扮演命令行解释器的角色,在读取shell script之后,依序运行其中的shell命令,之后输出结果。利用Shell script可以进行系统管理,文件操作等。

111.jpg

shell脚本和编程语言很相似,也有变量和流程控制语句,但shell脚本是解释执行的,不需要编译,shell程序从脚本中一行一行读取并执行这些命令,相当于一个用户把脚本中的命令一行一行敲到shell提示符下执行。

在Unix及所有的类Unix系统中,如Linux、FreeBSD等操作系统,都存在Shell Script。依照Unix shell的各种不同类型,Shell script也有各种不同方言。在DOS、OS/2、Microsoft Windows中的批处理文件,跟shell script有类似的功能。


Shell 脚本功能非常强大,完全能够胜任 Linux 的日常管理工作,如文本或字符串检索、文件的查找或创建、大规模软件的自动部署、更改系统设置、监控服务器性能、发送报警邮件、抓取网页内容、压缩文件等。


shell初学者请注意,在平常应用中,建议不要用 root 帐号运行 shell 。作为普通用户,不管您有意还是无意,都无法破坏系统;但如果是 root,那就不同了,只要敲几个字母,就可能导致灾难性后果。


3.几种常见的shell

上面提到过,Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本。


Unix/Linux上常见的Shell脚本解释器有bash、sh、csh、ksh等,习惯上把它们称作一种Shell。我们常说有多少种Shell,其实说的是Shell脚本解释器。


bash:bash是Linux标准默认的shell,本教程也基于bash讲解。bash由Brian Fox和Chet Ramey共同完成,是BourneAgain Shell的缩写,内部命令一共有40个。


Linux使用它作为默认的shell是因为它有诸如以下的特色:

· 可以使用类似DOS下面的doskey的功能,用方向键查阅和快速输入并修改命令。

· 自动通过查找匹配的方式给出以某字符串开头的命令。

· 包含了自身的帮助功能,你只要在提示符下面键入help就可以得到相关的帮助。


sh:sh 由Steve Bourne开发,是Bourne Shell的缩写,sh 是Unix 标准默认的shell。

ash:ash shell 是由Kenneth Almquist编写的,Linux中占用系统资源最少的一个小shell,它只包含24个内部命令,因而使用起来很不方便。

csh:csh 是Linux比较大的内核,它由以William Joy为代表的共计47位作者编成,共有52个内部命令。该shell其实是指向/bin/tcsh这样的一个shell,也就是说,csh其实就是tcsh。

ksh:ksh 是Korn shell的缩写,由Eric Gisin编写,共有42条内部命令。该shell最大的优点是几乎和商业发行版的ksh完全兼容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。


注意:bash是 Bourne Again Shell 的缩写,是linux标准的默认shell ,它基于Bourne shell,吸收了C shell和Korn shell的一些特性。bash完全兼容sh,也就是说,用sh写的脚本可以不加修改的在bash中执行。

在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash

#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。


尽管如此,bash 和 sh 还是有一些不同之处:

一方面,bash 扩展了一些命令和参数;

另一方面,bash 并不完全和 sh 兼容,它们有些行为并不一致,但在大多数企业运维的情况下区别不大,特殊场景可以使用 bash 代替 sh。


4.查看 Shell

Shell 是一个程序,一般都是放在/bin或者/user/bin目录下,当前 Linux 系统可用的 Shell 都记录在/etc/shells文件中。/etc/shells是一个纯文本文件,你可以在图形界面下打开它,也可以使用 cat 命令查看它。


通过 cat 命令来查看当前 Linux 系统的可用 Shell:

$ cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh


在现代的 Linux 上,sh 已经被 bash 代替,/bin/sh往往是指向/bin/bash的符号链接。


如果你希望查看当前 Linux 的默认 Shell,那么可以输出 SHELL 环境变量:

$ echo $SHELL
/bin/bash

输出结果表明默认的 Shell 是 bash。

echo是一个 Shell 命令,用来输出变量的值,我们将在《Shell echo命令》中详细介绍它的用法。SHELL是 Linux 系统中的环境变量,它指明了当前使用的 Shell 程序的位置,也就是使用的哪个 Shell。


5.什么时候使用shell?

因为Shell似乎是各UNIX系统之间通用的功能,并且经过了POSIX的标准化。因此,Shell脚本只要“用心写”一次,即可应用到很多系统上。因此,之所以要使用Shell脚本是基于:

·  简单性:Shell是一个高级语言;通过它,你可以简洁地表达复杂的操作。

·  可移植性:使用POSIX所定义的功能,可以做到脚本无须修改就可在不同的系统上执行。

·  开发容易:可以在短时间内完成一个功能强大又妤用的脚本。

·  但是,考虑到Shell脚本的命令限制和效率问题,下列情况一般不使用Shell:

·  资源密集型的任务,尤其在需要考虑效率时(比如,排序,hash等等)。

·  需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算(这种情况一般使用C++或FORTRAN 来处理)。

·  有跨平台(操作系统)移植需求(一般使用C 或Java)。

·  复杂的应用,在必须使用结构化编程的时候(需要变量的类型检查,函数原型,等等)。

·  对于影响系统全局性的关键任务应用。

·  对于安全有很高要求的任务,比如你需要一个健壮的系统来防止入侵、破解、恶意破坏等等。

·  项目由连串的依赖的各个部分组成。

·  需要大规模的文件操作。

·  需要多维数组的支持。

·  需要数据结构的支持,比如链表或数等数据结构。

·  需要产生或操作图形化界面 GUI。

·  需要直接操作系统硬件。

·  需要 I/O 或socket 接口。

·  需要使用库或者遗留下来的老代码的接口。

·  私人的、闭源的应用(shell 脚本把代码就放在文本文件中,全世界都能看到)。

·  如果你的应用符合上边的任意一条,那么就考虑一下更强大的语言吧——或许是Perl、Tcl、Python、Ruby——或者是更高层次的编译语言比如C/C++,或者是Java。即使如此,你会发现,使用shell来原型开发你的应用,在开发步骤中也是非常有用的。


二、环境


shell编程跟java、php编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

当前主流的操作系统都支持shell编程,本文档所述的shell编程是指Linux下的shell,讲的基本都是POSIX标准下的功能,所以,也适用于Unix及BSD(如Mac OS)。


Linux

Linux默认安装就带了shell解释器。


Mac OS

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


Windows上的模拟器

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

cygwinhttp://www.cygwin.com/ 

mingwhttp://www.mingw.org/ 


三、Shell脚本简单实例


1.编写一个Shell脚本


打开文本编辑器,新建一个文本文件,并命名为 test.sh。

扩展名sh代表 shell,扩展名并不影响脚本执行,见名知意就好,如果你用 php 写 shell 脚本,扩展名就用php好了。


在 test.sh 中输入代码:

#!/bin/bash
echo "Hello World !"  #这是一条语句

第 1 行的#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell;后面的/bin/bash就是指明了解释器的具体位置。

第 2 行的 echo 命令用于向标准输出文件(Standard Output,stdout,一般就是指终端)输出文本。在.sh文件中使用命令与在终端直接输入命令的效果是一样的。

第 2 行的#及其后面的内容是注释。Shell 脚本中所有以#开头的都是注释(当然以#!开头的除外)。


下面给出了一段稍微复杂的 Shell 脚本:

#!/bin/bash
# Copyright (c) http://c.biancheng.net/shell/
echo "What is your name?"
read PERSON
echo "Hello, $PERSON"

第 4 行中表示从终端读取用户输入的数据,并赋值给 PERSON 变量。read 命令用来从标准输入文件(Standard Input,stdin,一般就是指终端)读取用户输入的数据。

第 5 行表示输出变量 PERSON 的内容。注意在变量名前边要加上$,否则变量名会作为字符串的一部分处理。


2.执行Shell脚本(两种方法)


a.作为可执行程序


Shell 脚本也是一种解释执行的程序,可以在终端直接调用(需要使用 chmod 命令给 Shell 脚本加上执行权限),如下所示:

$ cd demo  #切换到 test.sh 所在的目录
$ chmod +x ./test.sh  #使脚本具有执行权限
$ ./test.sh  #执行脚本

第 2 行中,chmod +x表示给 test.sh 增加执行权限。

第 3 行中,./表示当前目录,整条命令的意思是执行当前目录下的 test.sh 脚本。如果不写./,Linux 会到系统路径(由 PATH 环境变量指定)下查找 test.sh,而系统路径下显然不存在这个脚本,所以会执行失败。

通过这种方式运行脚本,第1行一定要写对,好让系统查找到正确的解释器。


1) 使用点号“.”

点号用于执行某个脚本,甚至脚本没有可执行权限也可以运行。有时候在测试运行某个脚本时可能并不想为此修改脚本权限,这时候就可以使用.来运行脚本,非常方便。


编写下面的代码并保存为 test.sh:

#!/bin/bash
echo "http://c.biancheng.net/shell/"

如果没有运行权限的话,用./执行就会有报错,但是若在其前面使用点号来执行就不会报错,如下所示:

$ ./test.sh
bash: .test.sh: Permission denied


使用.增加 test.sh 的执行权限,就可以正常运行了:

$ . ./test.sh
http://c.biancheng.net/shell/


2) 使用 source 命令

与点号类似,source 命令也可读取并在当前环境中执行脚本,同时还可返回脚本中最后一个命令的返回状态;如果没有返回值则返回 0,代表执行成功;如果未找到指定的脚本则返回 false。

$ source test.sh
http://c.biancheng.net/shell/


b.作为解释器参数


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

$ /bin/bash test.sh
http://c.biancheng.net/shell/

这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。


再看一个例子。下面的脚本使用 read 命令从 stdin 获取用户输入的内容并赋值给 PERSON 变量,最后在 stdout 上输出:

#!/bin/bash
# Copyright (c) http://c.biancheng.net/shell/
echo "What is your name?"
read PERSON
echo "Hello, $PERSON"
运行脚本:
$ chmod +x ./test.sh
$ ./test.sh
What is your name?
mozhiyan
Hello, mozhiyan
$


shell在线运行:http://www.runoob.com/try/runcode.php?filename=helloworld&type=bash 


四、升级Shell版本


一般而言,Bash Shell 是很多 Linux 发行版的默认 Shell,所以会随着系统的安装而自动安装。不过确实有一部分读者想要安装较新版本的 Bash Shell 或者虽然已经安装但希望升级的参考。


1.确定你的 Shell 版本


如果你安装的 Linux 是 RedHat、CentOS、Fedora、Ubuntu、Debian 等主流发行版,那么在你的系统中很可能已经预装了 Bash Shell,只需要确认一下是否确实已经安装以及预装的版本即可。具体的方法是:

# 确认系统中使用的 Shell 是 bash

$ echo $SHELL
/bin/bash


# 查看系统中 Bash Shell 的版本(方法一)

$ bash --version
GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.


# 查看系统中 Bash Shell 的版本(方法二)

$ echo $BASH_VERSION
3.2.25(1)-release


2.升级最新版本的 Bash Shell


源码方式安装 Bash

Linux 下安装软件的方式无非是 RPM 包安装、yum 安装、源码安装三种方式,读者可以任选一种方式。

不过,相对来说 RPM 包安装和 yum 安装方式比较简单,若再考虑各种包的依赖关系,这两种方式中又属 yum 安装更为简单。这里就不详细介绍这两种安装方法了,下面会具体示范使用源码安装 bash 的过程。

首先访问 http://www.gnu.org/software/bash/bash.html   页面,在 Downloads 中选择一个下载的链接,笔者选择了中国科技大学提供的FTP下载目录:ftp://mirrors.ustc.edu.cn/gnu/bash/  。


当前很多生产环境的系统中使用的 bash 版本还是 3.2 版,读者可以根据实际需要选择具体的版本。在笔者撰写本教程时,最新的版本是 4.2 版本,所以这里使用这个版本来做示范。


1) 使用wget下载最新的 bash 源码包

具体操作如下所示:

$ wget ftp://mirrors.ustc.edu.cn/gnu/bash/bash-4.2.tar.gz
--2013-04-11 19:37:41--  ftp://mirrors.ustc.edu.cn/gnu/bash/bash-4.2.tar.gz
           => `bash-4.2.tar.gz'
Resolving mirrors.ustc.edu.cn... 202.141.160.110, 2001:da8:d800:95::110
Connecting to mirrors.ustc.edu.cn|202.141.160.110|:21... connected.
Logging in as anonymous ... Logged in!
==> SYST ... done.    ==> PWD ... done.
==> TYPE I ... done.  ==> CWD /gnu/bash ... done.
==> SIZE bash-4.2.tar.gz ... 7009201
==> PASV ... done.    ==> RETR bash-4.2.tar.gz ... done.
Length: 7009201 (6.7M)
100%[==========================================>] 7,009,201   1.93M/s   in 3.5s  
2013-04-11 19:37:46 (1.89 MB/s) - `bash-4.2.tar.gz' saved [7009201]


2) 解压源码包

解压源码包并进入生成的目录中:

# 解压后会在当前目录下生成一个bash-4.2目录

$ tar zxvf bash-4.2.tar.gz

#进入目录bash-4.2
$ cd bash-4.2
$


3) 准备配置(configure)

最简单的配置方式是直接运行当前目录下的 configure,这会将 bash 安装到 /usr/local 目录中,不过编译安装软件时,好的习惯是使用--prefix参数指定安装目录。所以这里采用下面的配置方式。该条命令将会产生大量的输出,一开始会检查系统的编译环境以及相关的依赖软件。


最常见的错误可能是系统中没有安装 gcc 造成无法继续,如果是这个原因,使用 yum install gcc 命令进行安装。如果配置过程出现致命错误会立即退出,请读者注意输出内容中的 error 部分。

$ ./configure --prefix=/usr/local/bash4.2
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
Beginning configuration for bash-4.2-release for i686-pc-linux-gnu
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... Yes
......(略去内容)......


#如果大量的 checking 没问题,则配置环境检测通过。如果读者看到如下的输出内容,说明配置成功

configure: creating ./config.status
config.status: creating Makefile
config.status: creating builtins/Makefile
config.status: creating lib/readline/Makefile
config.status: creating lib/glob/Makefile
config.status: creating lib/intl/Makefile
config.status: creating lib/malloc/Makefile
config.status: creating lib/sh/Makefile
......


#如果配置成功,会在当前目录中生成Makefile

$ ll Makefile
-rw-r--r-- 1 root root 77119 Apr 11 19:49 Makefile


4) 正式编译

#编译过程会产生大量输出

$ make
rm -f mksyntax
gcc  -DPROGRAM='"bash"' -DCONF_HOSTTYPE='"i686"'
-DCONF_OSTYPE='"linux-gnu"' -DCONF_MACHTYPE='"i686-pc-linux-gnu"'
-DCONF_VENDOR='"pc"'
-DLOCALEDIR='"/usr/local/bash4.2/share/locale"'
-DPACKAGE='"bash"' -DSHELL -DHAVE_CONFIG_H   -I.  -I. -I./include
-I./lib   -g  -o mksyntax ./mksyntax.c
......(略去内容)......


5) 安装

有时在安装前也可以进行测试,但是一般情况下这不是必需的。

#非必要步骤:测试安装

#[root@localhost bash-4.2]# make test
#安装
$ make install

#安装其实就是将make产生的文件复制到指定的目录中,在这里指定的目录就是之前我们用 --prefix 参数指定的/usr/local,可以在该目录中发现bash4.2目录

$ ls -ld /usr/local/bash4.2/
drwxr-xr-x 4 root root 4096 Apr 11 20:08 /usr/local/bash4.2/


到此为止,最新版本的 bash 就已经安装好了,确切地说是安装到了 /usr/local/bash4.2 中。


3.使用新版本的 Bash Shell


虽然最新版的 bash 已经安装到系统中,但是还需要经过一些设置才能使用。首先需要将最新的 bash 的路径写到 /etc/shells 中,以向系统注册新 Shell 的路径。可以采取直接编辑 /etc/shells 文件的方式,或者采用如下更简单的方式:

$ echo "/usr/local/bash4.2/bin/bash" >> /etc/shells


然后使用命令 chsh(change shell 的简写)修改登录 Shell。

$ chsh
Changing shell for root.
New shell [/bin/bash]: /usr/local/bash4.2/bin/bash #输入要修改的shell
Shell changed. #显示成功修改了shell


#此处chsh并没有附加参数,所以默认是修改root的shell,如要改变其他用户的登录shell,可以在后面跟上用户名,使用这种方式给用户john更改shell

$ chsh john

chsh 命令做的工作就是修改了 /etc/passwd 文件中登录 Shell 的路径,所以如果明白了 chsh 的原理,实际上可以手工编辑 /etc/passwd 文件,将 root 用户的这行改成下面的样子(这又一次印证了 Linux 中一切皆文件的说法):

$ cat /etc/passwd | grep bash4.2
root:x:0:0:root:/root:/usr/local/bash4.2/bin/bash


最后还需要重新登录以获得 Shell,登录后再次验证一下当前的 Shell 版本。

$ echo $BASH_VERSION
4.2.0(1)-release


#请注意,如果这时候你使用下面的命令可能会犯迷糊:为什么版本是3.2.25呢?不是已经是4.2了吗?

$ bash --version
GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.


#通过使用 whereis bash 命令可了解当前运行的 bash 命令真实运行的是/bin/bash,也就是说现在是在版本为 4.2 的 bash 中运行了一个 3.2.25 版本的 bash 命令。如果要想每次运行 bash 的时候使用的是 4.2 的版本,需要修改 PATH 变量的值,读者可以自行完成这个任务

$ whereis bash
bash: /bin/bash /usr/local/bash4.2 /usr/share/man/man1/bash.1.gz


参考网址:

http://c.biancheng.net/shell/ 

http://www.runoob.com/linux/linux-shell.html 

http://www.runoob.com/w3cnote/shell-quick-start.html 

https://blog.csdn.net/javaactive/article/details/78199258 


转载请注明: ITTXX.CN--分享互联网 » Shell和Shell脚本编程极简入门教程

最后更新:2018-12-20 15:29:44

赞 (2) or 分享 ()
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽