Shell脚本

    1. Shell简介

在Linux系统开发过程中,开发者或者用户与Linux系统(内核)进行交互的时候需要一个平台,这就是Shell,有了它,用户就能通过键盘输入与系统进行交互了。Shell会执行用户输入的命令,并且在屏幕上显示执行结果。这种交互的全过程都是基于文本方式的,这种面向命令行的用户界面被称为CLI(Command Line Interface),在图形化用户界面(GUI)出现之前,人们一直是通过命令行界面来操作计算机的。Linux的图形化环境最近这几年有很大改进,在X窗口系统下,只需打开Shell提示来完成极少量的任务。然而,许多Linux功能在Shell提示下要比在图形化用户界面(GUI)下完成得更加高效,况且一些应用程序并不支持图形界面。

单从字面意思上理解,Shell的本意是“壳”的意思,通俗地讲就是内部核心与外部使用者发生联系的介质。当用户希望与系统内核(Kernel)发生联系进而控制硬件设备时,用户不会也不允许直接与内核交互,而必须通过Shell来下达命令使系统来控制硬件,同时内核也会通过Shell来反馈执行情况,这里的Shell就是一个桥梁。

 

  Shell工作示意图

Shell提供了用户与操作系统之间通讯的方式。这种通信可以以交互方式(从键盘输入,并且可以立即得到响应),或者以Shell script(非交互)方式执行。Shell script是放在文件中的一串Shell和操作系统命令,它们可以被重复使用。本质上,Shell script是把命令行的命令简单地组合到一个文件中。

Shell本身又是一个解释型的程序,也是一种编程语言,Shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。Shell编程语言简单而且易于掌握,任何在提示符中能键入的命令都能放到一个可执行的Shell程序中。作为操作系统的外壳,如果把Linux内核想像成一个系统的中心部分,那么Shell就是围绕内核的外层。当从Shell或其他程序向Linux传递命令时,内核会做出相应的反应。

历史上第一个真正的Unix shell称为“sh”,是Stephen R. Bourne于20世纪70年代中期在新泽西的AT&T贝尔实验室编写的,为了纪念他,亦称为“Bourne shell”,Bourne Shell是一个交换式的命令解释器和命令编程语言。在20世纪80年代早期,在美国Berkeley的加利福尼亚大学开发了C shell(csh和tcsh),它主要是为了让用户更容易地使用交互式功能。C shell是一种比Bourne Shell更适于编程的shell,它的语法与C语言很相似。

Bash(Bourne Again Shell)是目前大多数Linux(Red Hat,Slackware等)系统默认使用的Shell,它由Brian Fox和Chet Ramey共同完成,内部命令一共有40个,它是Bourne Shell的扩展,与Bourne Shell完全向后兼容,并且在Bourne Shell的基础上增加了很多特性。Bash是GNU计划的一部分,用来替代Bourne Shell。Linux使用它作为默认的Shell是因为它有以下的特点。

  1. 可以使用类似DOS下面的doskey的功能,用上下方向键查阅和快速输入并修改命令。
  2. 自动通过查找匹配的方式,给出以某字串开头的命令。
  3. 包含了自身的帮助功能,只要在提示符下面键入help就可以得到相关的帮助。

Linux下使用Shell非常简单,打开终端就可以看到Shell的提示符了,登录系统之后,系统将执行一个称为Shell的程序,正是Shell进程提供了命令行提示符。作为Linux默认的Bash,对于普通用户用“$”作为Shell提示符,而对于根用户(root)用“#”作提示符。如图3.2所示。

linux@ubuntu:~$

inux@ubuntu:~$ su root       //切换至root用户

root@ubuntu:~#

从上面的界面中可以看到,当前用户是普通用户“linux”时,Shell提示符是‘$’;而当切换为根用户root时,Shell提示符是‘#’。一旦出现了Shell提示符,就可以键入命令名称及命令所需要的参数了。用户键入有关命令行后,如果Shell找不到以其中的命令名为名字的程序,就会给出错误信息。例如,如果用户键入:

linux@ubuntu:~$mypfile

bash:myfile:command not found

linux@ubuntu:~$

可以看到,用户得到了一个没有找到该命令的错误信息。

    1. 常用Shell命令

目前,Linux下基于图形界面的工具越来越多,许多工作都不必使用Shell就可以完成了。然而,专业的Linux使用者还是认为Shell是一个非常必要的工具,使用Linux时一定要熟悉Shell的使用,至少要掌握一些基础知识和基本的命令。

由于Bash是Linux上缺省的Shell,本章主要介绍Bash及其相关知识,Shell命令可以分为两种。

  1. 包含于Shell内部的命令,如cd命令;
  2. 存在于系统文件内部的某个应用程序,如ls命令。

对用户使用Shell来说,不必关心一个命令是建立在Shell内部还是一个单独的程序。在实际执行的时候,Shell会首先检查输入的命令是否是Shell的内部命令,如果不是,再检查是否是一个内部的应用程序。然后Shell在搜索路径里寻找这些应用程序(搜索路径就是一个能找到可执行程序的目录列表)。如果键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。如果能够成功找到命令,该内部命令或应用程序将被分解为系统调用并传给Linux内核。

Shell命令的一般格式如下。

命令名 【选项】 【参数1】 【参数2】…

用户登录时,实际就进入了Shell,它遵循一定的语法将输入的命令加以解释并传给系统。命令行中输入的第一个部分必须是一个命令的名字,第二个部分是命令的选项或参数,命令行中的每个部分必须由空格或Tab键隔开,注意,这里的选项和参数都用【】标注,这是说明它们都是可选的,因为有的命令不需要选项和参数就可以执行。

      1. 对于选项和参数的说明

【选项】是包括一个或多个字母的代码,它前面有一个减号(-),Linux用它来区别选项和参数,【选项】可用于改变命令执行的动作的类型。多个【选项】可以用一个减号(-)连起来,例如‘ls –l -a’与‘ls -la’相同。

以常用的ls命令为例,ls命令可以查看当前目录的内容,加入选项-l可以以长格式查看当前目录内容,如图3.3所示.。

加入-l选项,将会为每个文件列出一行信息,诸如数据大小和数据最后被修改的时间。

使用该指令可以查看文件的权限位,如上图中的“-rw-r--r--”符号,它表示的是3组不同用户对该文件的使用权限,每组有3个权限位,如下所示。

  1. rw-  用户权限

linux@ubuntu:~$ ls -l

total 36

drwxr-xr-x 2 linux linux 4096 May 25 20:00 Desktop

drwxr-xr-x 2 linux linux 4096 May 25 20:00 Documents

drwxr-xr-x 2 linux linux 4096 May 25 20:00 Downloads

drwxr-xr-x 2 linux linux 4096 May 25 20:00 Music

drwxr-xr-x 2 linux linux 4096 May 25 20:00 Pictures

drwxr-xr-x 2 linux linux 4096 May 25 20:00 Public

drwxr-xr-x 2 linux linux 4096 May 25 20:00 Templates

drwxr-xr-x 2 linux linux 4096 May 25 20:00 Videos

drwxrwxr-x 3 linux linux 4096 May 26 19:24 workdir

  1. r--  同组用户权限
  2. r--  其他用户权限

【参数】提供命令运行的信息,或者是命令执行过程中所使用的文件名。使用分号(;)可以将2个命令隔开,这样可以实现一行中输入多个命令。命令的执行顺序和输入的顺序相同。当然,ls命令也可以加入参数,例如ls -l  /home/linux命令会将/home/linux目录的内容详细地列出。

      1. 命令行输入

命令行输入实际上是可以编辑的一个文本缓冲区,在命令行中就可以输入Shell命令了。在按“回车键”以确认当前操作之前,可以对输入的内容进行编辑。比如删除、复制、粘贴等,还可以插入字符,使得用户在输入命令,尤其是复杂命令时,若出现键入错误,无须重新输入整个命令,只要利用编辑操作,即可改正错误。

dash可以保存以前键入命令的列表,这一列表被称为命令历史表。按向上箭头键,便可以在命令行上逐次显示各条命令。同样,按向下箭头键可以在命令列表中向下移动,这样可以将以前的各条命令显示在命令行上,用户可以修改并执行这些命令,这样可以不用重复输入以前执行的命令。

      1. 常用Shell命令介绍

Shell命令种类很多,功能也很复杂,下面主要就几种常用的Shell命令来介绍。

1)输入命令行自动补齐(automatic command line completion)功能

在Linux下有时比如对文件操作的时候,有的文件名或文件夹的名称可能会很长,完全逐字输入比较麻烦,在输入命令的任何时刻,可以按<Tab>键,当这样做时,系统将试图补齐此时已输入的命令。例如,假设当前目录下有一文件:Busybox-1.24.0.tar.gz,现在想要解压该文件,而该文件是当前目录下惟一以B开头的文件名,此时就可以如下操作。

linux@ubuntu:~$ tar zxvf  B<Tab>usybox-1.24.0.tar.gz

此时,系统会自动补齐该文件名后面的部分,这样用起来就会非常方便。

使用命令行自动补齐功能,对于使用长命令或操作较长名字的文件或文件夹都是非常有意义的。

2)对目录和文件的操作

·  改变当前目录

cd  [目的目录名]

这里的目的目录名可用相对路径表示,也可以用绝对路径表示。如果要切换到上一级目录,可以采用下面的命令。

linux@ubuntu:~$ cd ..

·  显示当前所在目录

Linux下pwd命令是最常用的命令之一,用于显示用户当前所在的目录。例如:

linux@ubuntu:~$ pwd

/home/linux

执行pwd指令后,系统提示当前所在的目录是/home/TH。

·  创建目录

在Linux下可以使用mkdir指令来创建一个目录。

mkdir  [新目录名]

例如:mkdir  /home/TH,该命令的功能就是在/home/目录下创建TH子目录。

·  删除一个目录/文件

rm  [选项]  被删除的文件/目录

对于选项的说明如下。

-r:完全删除目录,就其下的目录和文件也一并删除。

-i:在删除目录之前需要经过使用者的确认才能被删除。

-f:不需要确认就可以删除,也不会产生任何错误信息。

例如:rm –rf /home/TH/tmp,就是不必经过确认就把/home/TH/tmp/下的目录和文件全部删除。

·  拷贝文件/目录

cp [ 选项]  [源文件/目录]  [指定文件/目录]

对于选项的说明如下。

-i:采用-i选项时,当指定目录下已存在被复制的文件时,会在复制之前要求确认是否要覆盖,如使用者的回答是y(yes)才执行复制的动作。

-p:保留权限模式和更改时间。

-r:此参数是用来将一目录下的所有文件都复制到另一个指定目录中。

例如:cp /etc/ld.conf  ~/,拷贝/etc/目录下的ld.conf文件到系统的主目录中;

cp -r dir1 dir2,将目录dir1的全部内容全部复制到目录dir2里面。

·  建立文件的符号链接

建立文件的符号链接是Linux中一个很重要的命令,它的基本功能是为某一个文件在另外一个位置建立一个不同的链接,这个命令最常用的选项是-s,具体用法如下。

ln [-s]  [源文件]  [目标文件]

在实际的操作过程当中,有时在不同的目录中要用到相同的文件,我们不需要在每一个需要的目录下都放一个相同的文件,而是使用ln命令链接(link)它就可以(相当于建立了一个快捷方式),这样可以避免重复的占用磁盘空间。例如:ln –s /bin/test /usr/local/bin/test,这就为/bin下的test文件在/usr/local/bin目录下建立了一个符号链接。

 

·  改变文件/目录访问权限

在Linux系统下面,一个文件有可读(r)、可写(w)、可执行(x)3种模式,chmod可以用数字来表示该文件的使用权限,其语法如下。

chmod  [XYZ]  文件

其中X、Y、Z各为一个数字,分别表示User(用户)、Group(同组用户)及Other(其他用户)对于该文件的使用权限。对于文件的属性,r(可读)=4,w(可写)=2,x(可执行)=1。对于每一位用户来说,若要具有rwx属性则对应的位应为4+2+1=7,若要rw-属性则为4+2=6,若要r-x属性则为4+1=5。比如下面的例子:

linux@ubuntu:~$ chmod  751  /home/linux/test

其执行结果就是使程序test对于用户可读、写、执行,对于同组用户可读、执行,对于其他用户可执行。

chmod还有一种用法就是使用包含字母和操作符表达式的字符设定法(相对权限设定),通过参数-r、-w、-x来设定权限,这里不再详细地介绍。

·  改变文件/目录的所有权

chown [-R] 用户名  文件/目录

例如

linux@ubuntu:~$ chown linux File1

将当前目录下的文件File改为用户TH所有。

linux@ubuntu:~$ chown -R linux Dir1

将当前目录Dir1改为用户TH所有。

3)用户管理

·  添加/删除用户

# adduser  user1,由具有root权限的用户添加用户user1;

# userdel  user2,由具有root权限的用户删除用户user2;

·  设置用户口令

为了更好地保护用户账号的安全,Linux允许用户随时修改自己的口令。修改口令的命令是passwd,它将提示用户输入旧口令和新口令,之后还要求用户再次确认新口令,以避免用户无意中按错键。

4)文件的打包和压缩

先来看一下Linux下打包命令。Linux下最常用的打包程序就是tar(tape archive-磁带存档),使用tar程序打出来的包都是以.tar结尾的。Tar命令可以为文件和目录创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。使用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于传输是非常有用的。其语法如下。

tar  [选项]f   targetfile.tar   文件/目录

 

选项说明如下。

c:创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。例如:

linux@ubuntu:~$ tar  -cf  test.tar  /home/tmp    

将/home/tmp目录下的文件打包为test.tar

r:增加文件到已有的包,如果发现还有一个目录或是一些文件忘记备份了,这时可以使用该选项,将还需要的目录或文件添加到包文件中,例如:

linux@ubuntu:~$ tar -rf  test.tar *.jpg

该命令将所有的jpg文件添加到test.tar包里面去。-r是表示增加文件的意思。

t:列出包文件的所有内容,查看已经备份了哪些文件。例如:

linux@ubuntu:~$ tar  -tf  test.tar

x:从tar包文件中恢复所有文件,事实上是一个解包的过程。例如

linux@ubuntu:~$ tar  -xf  test.tar

k:保存已经存在的文件。例如把某个文件还原,在还原的过程中,遇到相同的文件,不会进行覆盖。

w:每一步都要求确认。

tar命令还有一个非常重要的用法,这就是tar可以在打包或解包的同时调用其他的压缩程序(如gzip、bzip2)来压缩文件。

 

Linux下的压缩文件主要有以下几种格式。

.Z-compress程序的压缩格式;

.bz2-bzip2程序的压缩格式;

.gz-gzip程序的压缩格式;

.tar.gz-由tar程序打包,并且经过gzip程序的压缩,是Linux下常见的压缩文件格式;

.tar.bz2-由tar程序打包,并且经过bzip2程序的压缩。

以下就几种常用的情况进行说明。

·  调用gzip程序来压缩文件

gzip是GNU组织开发的一个压缩程序,gzip压缩文件的后缀是.gz,与gzip相对的解压程序是gunzip。tar中使用-z这个参数来调用gzip。下面举例说明。

linux@ubuntu:~$ tar -czf  test.tar.gz  *.jpg

这条命令是将当前目录下的所有.jpg文件打成一个tar包,并且将其用gzip程序压缩,生成一个gzip压缩过的包,压缩包名为test.tar.gz,解开该压缩包的用法如下。

linux@ubuntu:~$ tar -xzf  test.tar.gz

·  调用bzip2程序来压缩文件

bzip2是Linux下的一个压缩能力更强的压缩程序,bzip2压缩文件的后缀是.bz2,与bzip2相对应的解压程序是bunzip2。tar中使用-j这个参数来调用gzip压缩程序。例如:

linux@ubuntu:~$ tar -cjf  test.tar.bz2  *.jpg

该命令是将当前目录下所有.jpg的文件打成一个tar包,并且将其用bzip2程序压缩,生成一个bzip2压缩过的包,压缩包名为test.tar.bz2,解开该压缩包的用法如下。

linux@ubuntu:~$ tar -xjf test.tar.bz2

5)源码维护基本命令

diff命令

diff命令是生成源代码补丁的必备工具,其命令格式如下。

diff  [命令行选项源文件  新文件

diff命令常用选项如下。

·  -r:递归处理相应目录。

·  -N:包含新文件到patch。

·  -u:输出统一格式(unified format),这种格式比缺省格式更紧凑些。

·  -a:可以包含二进制文件到patch

通常可以使用diff命令加参数-ruN来比较2个文件并生成一个补丁文件。这个补丁文件会列出这2个不同版本文件的差异。比如有2个文本文件:text1text2,二者内容不尽相同,现在来创建补丁文件。

linux@ubuntu:~$ diff -ruN test1.txt  test2.txt > test.patch

这样就创建好了补丁文件test.patch,补丁创建好以后需要给相应文件/程序打好补丁,这里就要用到patch命令。

patch  [命令行选项]  [patch文件 ]

patch的详细使用方法可参见patchman help,常用的命令行选项是-pnn是自然数),例如采用下面的指令来打好补丁。

linux@ubuntu:~$ patch -p1 <test.patch

-p1选项代表patch文件名左边目录的层数,考虑到顶层目录在不同的系统上可能有所不同。要使用这个选项,就要把patch文件放在要被打补丁的目录下,然后在这个目录中运行path -p1 < [patchfile]命令。

6)配置、编译、安装源码包软件

所谓源码包软件,顾名思义,就是源代码的可见的软件包,在Linux系统下也经常需要用到源码包软件。

大多数的源码软件包是以tar.gztar.bz2的形式得到的,所以在配置和编译之前需要将软件包解压缩,具体的做法已经在前面提到过。配置、编译、安装的过程大多如下所示。

linux@ubuntu:~$./configure

linux@ubuntu:~$ make

linux@ubuntu:~$ make install

./configure用来配置软件的功能,./configure比较重要的一个参数是--prefix,通过使用--prefix参数,可以指定软件的安装目录;比如可以指定软件安装到/homet/tmp目录中,可以执行如下的指令。

linux@ubuntu:~$./configure --prefix=/home/tmp

linux@ubuntu:~$ make

linux@ubuntu:~$ make install

7)中断Shell命令执行的方法

Linux系统下,一旦出现了Shell提示符,就可以键入命令名称及命令所需要的参数。Shell将执行这些命令。如果在执行过程当中想终止命令执行,可以从键盘上按Ctrl+C发出中断信号来中断它。

8)模块管理指令

Linux内核采用模块化管理方式,这是Linux内核的一大特点,这也使得Linux整体结构非常灵活,编于精简。

·  insmod(添加模块)指令

Linux有许多功能是通过模块的方式,在需要时才载入kernel。如此可使kernel较为精简,进而提高效率,以及保有较大的弹性。这些可动态加载的模块,通常是系统的设备驱动程序。加载模块采用insmod指令,其常用语法如下。

insmod [-fkmpsvxX] [-o<模块名称>] [模块文件]

其中的参数解释如下。

-f:不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入。

-k:将模块设置为自动卸载。

-m:输出模块的载入信息。

-p:测试模块是否能正确地载入kernel

-s:将所有信息记录在系统记录文件中。

-v:执行时显示详细的信息。

-x:要汇出模块的外部符号。

-X:汇出模块所有的外部符号,此为预设置。

·  rmmod(卸载模块)指令

Linux把系统的许多功能编译成一个个单独的模块,待有需要时再分别加载它们,如果不再需要这些模块的时候,就可以使用rmmod命令来卸载这些模块。其语法如下。

rmmod [-as] [模块名称…]

其使用参数说明如下。

-a:删除所有目前不需要的模块。

-s:把信息输出至syslog常驻服务,而非终端机界面。

    1. 编写Shell脚本

Linux系统中,虽然有各种各样的图形化接口工具,但是Shell仍然是一个非常灵活的工具。Shell不仅仅是命令的执行,而且是一种编程语言,它提供了定义变量和参数的手段以及丰富的程序控制结构。由于Shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务,所以用户可以通过使用Shell使大量的任务自动化,就像使用DOS操作系统的过程当中,会执行一些重复性的命令。因此常将这些大量的重复性命令写成批处理命令,通过执行这个批处理命令来代替执行重复性的命令。在Linux系统中也有类似的批处理命令,被称作是Shell脚本(Script)。前面已经提到Shell也是一种解释性的语言,而解释执性的语言的与编译型语言(如C语言)的最大不同就在于它们编写起来很方便,也很快捷,可以说,使用Shell脚本来完成一些特定的常用的任务是一个不错的选择。

      1. 建立脚本

编辑Shell脚本文件使用Linux下的普通编辑器如viEmacs等即可。Linux下的Shell默认采用Bash,所以本书也主要以Bash脚本为例介绍,在建立Shell脚本程序的开始首先应指明使用哪种Shell来解释所写的脚本,一般来说Bash脚本以"#!"开头(文件的首行),而"#!"后面同时要将所使用Shell的路径明确指出,比如Bourne Shell的路径为/bin/sh,而C Shell的路径则为/bin/cshLinux下默认采用Bash,所以本书也主要以Bash脚本为例介绍,下面的语句就是指定Bash来解释脚本。

#! /bin/sh

该语句说明该脚本文件是一个Bash程序,需要由/bin目录下的Bash程序来解释执行。除了在脚本内指定所使用的Shell类型以外,使用过程中也可以在命令行中强制指定。比如想用C Shell执行某个脚本,就可以使用以下命令。

linux@ubuntu:~$ csh  Myscript

为了增加程序的可读性,Shell脚本语句也可以像高级语言那样加注释,在dash脚本程序中从“#”号开始到行尾的部分均被看作是程序的注释语句。

      1. Shell变量

Shell编程中可以使用变量,这充分体现了它的灵活性。对Shell来讲,所有变量的取值都是一个字串。Shell脚本中主要有以下几种变量:系统变量,环境变量,用户变量。其中用户变量在编程过程中使用频繁;系统变量在对参数判断和命令返回值判断会使用;环境变量主要是在程序运行的时候需要设置。此外,Shell脚本的执行并不需要编译,所以也就不需用检查脚本中变量的类型,因此在Shell脚本中使用变量不必像高级语言那样事先对变量进行定义。

·  Shell系统变量

以下是一些常用到的Shell系统变量及其含义。

$ # 保存程序命令行参数的数目。

$ ? 保存前一个命令的返回值。

 

$ 0 当前程序名。

$ * 以("$1 $2…")的形式保存所有输入的命令行参数。

$ @ :以("$1""$2"…)的形式保存所有输入的命令行参数。

$ n $1为命令行的第一个参数,$2为命令行的第二个参数,依次类推。

举一个针对以上系统变量使用的例子,使用vi编辑一个脚本文件,文件名为test.sh,其内容如下。

#/bin/sh

# Script name: Example Script

echo "The No. of parameter is $#"

echo "The script name is$0"

echo "The parameters in the script are$*"

给脚本文件增加执行权限

linux@ubuntu:~$ mod u+x test.sh

在命令行中执行该脚本程序:

linux@ubuntu:~$ ./test.sh Hello Linux

命令行中的Hello Linux是其参数,该程序执行结果如下

linux@ubuntu:~$ ./test.sh Hello Linux

The No. of parameter is 2

The script name is./test.sh

The parameters in the script areHello Linux

·  Shell环境变量

Shell环境变量是所有Shell程序都会接受的参数。Shell程序运行时,都会接收一组变量,这组变量就是环境变量,常用的Shell环境变量如下。

PATH:决定了Shell将到哪些目录中寻找命令或程序。

HOME:当前用户主目录的完全路径名。

HISTSIZE:历史记录数。

LOGNAME:当前用户的登录名。

HOSTNAME:指主机的名称。

SHELLShell路径名。

LANGUGE:语言相关的环境变量,多语言可以修改此环境变量。

MAIL:当前用户的邮件存放目录。

PS1:主提示符,对于root用户是#,对于普通用户是$

PS2:辅助提示符,默认是“>”。

TERM:终端的类型。

PWD:当前工作目录的绝对路径名。

·  Shell用户变量

Shell用户变量是最常使用的变量,可以使用任何不包含空格字符的字串来当做变量名称,在Linux支持的所有Shell中,都可以用赋值符号(=)为变量赋值,在使用Shell用户变量的时候,通常是按照下面的语法规则来定义用户变量。

变量名=变量值

例如:

A=9

B="Hello World"

 

变量的引用,要在变量前加$,例如:

S="string"

echo $S

下面举一个非常简单的例子来说明。

#! /bin/bash

# This is a example

SR="Hello World"

echo $SR

上面的例子很简单,定义了一个变量SR,并且赋值给SR,然后在终端输出SR的值。

      1. 流程控制

同传统的编程语言一样,Shell提供了很多特性,如数据变量、参数传递、判断、流程控制、数据输入和输出、子程序及以中断处理等。

1)条件语句

同其他高级语言程序一样,复杂的Shell程序中经常使用到分支和循环控制结构,主要有2种不同形式的条件语句:if语句和case语句。

·  if语句

if语句的语法格式如下。

if   [expression]

then

commands1        // expressionTrue时的动作

else

commands2      // expressionFalse时的动作

fi

·  case语句

case语句的语法格式如下。

case 字符串 in

  模式1 command;;

  模式2 command;;

……

esac

case语句是多分支语句,它按“)”左边的模式对字符串值的匹配来执行相应的命令,匹配总是由上而下地进行,总是执行首先匹配到的模式对应的命令表,如果模式中的每个都匹配不到,则什么也不执行,所以一般会在最后,放一个*),代表以上都不匹配的任意字符串。";;"表示该模式对应的命令部分程序。

2)循环语句

·  while循环语句

while循环语句中,当某一条件为真时,执行指定的命令。语句的结构如下。

while expression

do

command

……

done

·  for循环语句

for循环语句对一个变量的可能的值都执行一个命令序列。赋给变量的几个数值既可以在程序内以数值列表的形式提供,也可以在程序以外以位置参数的形式提供。for循环语句的一般格式如下。

for    变量名 [in 列表]

do

    command1

    command2

   ……

done

      1. Shell脚本的执行

Shell脚本是以文本方式存储的,而非二进制文件。所以Shell脚本必须在Linux系统的Shell下解释执行。如果已经写好Shell脚本,运行该脚本可以有以下的几种方法。

1)设置好脚本的执行权限之后再执行脚本

可以使用下列方式设置脚本的执行权限。

·  chmod u+x Scriptname只有自己可以执行,其他人不能执行;

·  chmod ug+x Scriptname只有自己以及同一群可以执行,其他人不能执行;

·  chmod +x Scriptname 所有人都可以执行。

设置好执行权限之后就可以执行脚本程序了,例如,编辑好一个脚本程序MyScript之后,可按下面的方式来执行。

linux@ubuntu:~$chmod +x MyScript

linux@ubuntu:~$./Myscript

2)使用Bash内部指令"source"

例如下面的执行过程:

linux@ubuntu:~$ source Myscript

3)直接使用sh命令来执行

例如:

linux@ubuntu:~$ sh  Myscript

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值