Shell脚本

前言

什么是编译型语言?
编译型语言指一些从源代码(Source Code)转换成目标代码(Object Code)后便能直接通过计算机(Java通过虚拟机)来执行的语言,一些比较常见的语言包括C, C++, Java, Fortran, Pascal等都是编译型语言。 
编译型语言的优点是高效,他们多半运作与底层,擅长处理字节、整型、浮点型或其他机器层级的对象。缺点是编译型语言依赖于平台,例如在windows下编译成的.exe文件在Linux系统下无法使用。

什么是脚本语言?
脚本语言是为了缩短传统的源码->编译->链接->运行(edit->compile->link->run)过程而创建的计算机编程语言。早期的脚本语言常被称为批处理语言或工作控制语言,一些常见的脚本语言有Shell, JavaScript, Python, Perl, R等。 
脚本语言是一种解释型语言,通常被保存在一个文本文件中,执行时不需要编译(文件本身既是源码又是可执行程序),直接由解释器现场解释执行,不产生目标程序(.exe等)。 
脚本语言的优点是可移植性强,开发速度快。脚本语言的解释执行不依赖于平台,例如JS语言无论在windows平台还是在unix平台都可以使用。缺点是相对于编译型语言效率较低,它不生成目标程序而是一句一句的执行的方式会造成计算机资源的浪费。另外,由于解释语言不产生目标程序,所以源码必须公开给用户,所以一般都是开源的。

一、shell脚本

一个简单的shell语句:

上面给出了一个简单的命令行语句,功能是输出当前系统用户,我们可以简单地看出当前有两个用户,但当我们使用一个大型系统登陆的用户很多的时候,想知道有几个用户就需要认真的数一数了,这时,我们使用一个简单的Shell语句就可以避免这个过程,看下面这个语句

上面这行语句比之前的语句多出了两部分,一部分是‘|’一个竖杠,这个竖杠的学名叫做管道,如下图所示,它代表的是将竖杠左边的命令的输出作为右边命令的输入。

第二部分是‘wc -l’这条语句代表统计输入文件的行数,除了统计行数它还可以统计字符的数量和单词的数量等。

Shell脚本_第1张图片

二、创建一个shell脚本文件

一般的脚本都是写在一个文件里,Shell也不例外,一般,Shell脚本会写入一个后缀为.sh的文件,我们可以根据如下操作进行,创建文件方法并不唯一,你完全可以直接新建一个文件编辑好脚本内容后保存再将其修改为可执行文件。

(1)创建方法一

Shell脚本_第2张图片

以上的代码执行了创建一个文件->输入文件内容并保存->将文件修改为可执行文件->执行文件的过程。第2、3行代表Shell脚本文件中写入的内容。

cat命令主要用于三个方面 :

  • 创建并写入文件 

- cat > [filename] 新建文件并写入(覆盖原有文件) 
- cat >> [filename] 新建文件并写入(若存在将内容追加到原有文件尾) 
文件写入完成后使用ctrl+d保存并退回终端 

  • 合并文件 

- cat [file1] [file2] > [obj file] 将file1和file2的内容合并到obj file中 

  • 浏览文件内容 

- cat [filename] 在终端显式输出文件的内容
 

#! /bin/sh -

Shell脚本通常一开始都是这样一行语句,这行语句告知Linux内核应该以那个Shell来解释执行当前的脚本,从这条命令可以看到,我们使用的解释器位于是bin下的sh。之后接的’-‘表示没有Shell选项,据说是基于安全上的考虑,可以避免某种程度的欺骗式攻击。

chmod +x example.sh

chmod命令可以改变输入文件的类型,当前的+x选项是指将example.sh文件修改为可执行文件,若要修改回来可以使用-x选项。

./example.sh

表示执行当前目录下的example.sh文件(其他的执行方法在后文)。

(2)创建方法二

a) 用touch命令创建一个文件:touch my_script

b) 用vim编辑器打开my_script文件:vi my_script

c) 用vim编辑器编辑my_script文件,内容如下:

#!/bin/bash                     告诉shell使用什么程序解释脚本

#My first script

who | wc -l

允许Shell执行它:

chmod 755 my_script

执行my_script脚本:

./my_script

三、shell脚本的执行

一个规范的Shell脚本在第一行会指出由哪个程序(解释器)来执行脚本中的内容,这一行内容在Linux bash的编程一般为:

#!/bin/bash

#!/bin/sh

注意:

(1)在Shell中如果一行的第一个字母是#,则是注释,但是上面两个是写在第一行,所以不是脚本注释行,如果写在某个命令之后,则变成注释行。

(2)sh为bash的软链接,大多数情况下,脚本的开头使用“#!/bin/bash”和“#!/bin/sh”是没有区别的,但更规范的写法是在脚本的开头使用“#!/bin/bash”。

Shell 脚本的执行方式通常有如下三种:

(1)bash script-name 或者 sh script-name;

  这是当脚本文件本身没有可执行权限(即文件权限属性x位为-号)时常使用的方法,或者脚本文件开头没有指定解释器时需要使用的方法。推荐使用这种方法。

(2)path/script-name或者./script-name;

指在当前路径下执行脚本(脚本需要有执行权限),需要将脚本文件的权限改为可执行(即文件权限属性为x位)。具体方法为:chmod a+x script-name。然后通过执行脚本绝对路径或者相对路径就可以执行脚本了。
注意:在生产环境中,运维人员由于忘记为该脚本设置可执行权限,然后直接使用,导致出错。因此,推荐第一种 bashscript-name。

(3)source script-name或者. script-name。

source或者“.”命令的功能是:读入脚本并执行脚本,即在当前Shell中执行source或“.”加载并执行的相关脚本文件的命令及语句,而不是产生一个子Shell来执行文件中的命令。

注意:这是和其他几种执行shell方式的最大不同。

实例分析:

新建一个文件test.sh,不给它赋予任何可执行的权限x。

Shell脚本_第3张图片

编辑内容如下:

Shell脚本_第4张图片

文件以及文件中内容与常见的shell不同之处在于,这里的文件没有赋予可执行权限以及在文件内容中的首行中没有添加#!/bin/bash。我们现在用上述介绍的几种方式来测试下效果。

  • 第二种方式./script-name,执行效果如下:

报权限拒绝,Permission denied,此时,我们只要更改文件的属性为可执行即可。

  • 执行第一种bash script-name,效果如下:

可以成功执行,输出:hello。但是,我们输入命令:echo $name,发现如下:

name的值是空的。不难理解,bash script-name是产生了一个子进程shell,而我们当前的操作还在父shell中因此得不到该变量值。

  • 执行第三种方法. test.sh,效果如下:

刚才第二种方式我们执行失败,现在我们通过chmod a+x script-name,然后再次执行上述命令,查看效果:

Shell脚本_第5张图片

你可能感兴趣的:(Shell脚本)