第十八部分(Shell脚本一)

2020-04-18

什么是 Shell 脚本?

一个 shell 脚本就是一个包含一系列命令的文件。shell 读取这个文件,然后执行文件中的所有命令,就好像这些命令已经直接被输入到了命令行中一样。大多数能够在命令行中完成的任务也能够用脚本来实现,同样地,大多数能用脚本实现的操作也能够在命令行中完成。

脚本文件格式

#!/bin/bash
# This is our first script.
echo 'Hello World!'

我们脚本中的第一行文本有点儿神秘。它看起来它应该是一条注释,因为它起始于一个 # 符号,但是它看起来太有意义,以至于不仅仅是注释。事实上,这个 #! 字符序列是一种特殊的结构叫做 shebang。这个 shebang 被用来告诉操作系统将执行此脚本所用的解释器的名字。每个 shell 脚本都应该把这一文本行作为它的第一行。

第二行是一个注释,文本行中,# 符号之后的所有字符都会被忽略。关于 shell 脚本中的注释,它们也可以出现在文本行的末尾,像这样:

echo 'Hello World!' # This is a comment too

可执行权限

下一步我们要做的事情是让我们的脚本可执行。

[root@VM_0_7_centos shell_script]# vim hello_world
[root@VM_0_7_centos shell_script]# ll
total 4
-rw-r--r-- 1 root root 60 Apr 18 09:49 hello_world
[root@VM_0_7_centos shell_script]# 
[root@VM_0_7_centos shell_script]# chmod 755 hello_world 
[root@VM_0_7_centos shell_script]# ll
total 4
-rwxr-xr-x 1 root root 60 Apr 18 09:49 hello_world

脚本文件位置

当设置了脚本权限之后,我们就能执行我们的脚本了:

[root@VM_0_7_centos shell_script]# ./hello_world 
Hello World!

为了能够运行此脚本,我们必须指定脚本文件明确的路径。如果我们没有那样做,我们会得到这样的提示:

[root@VM_0_7_centos shell_script]# hello_world
-bash: hello_world: command not found

为什么会这样呢?什么使我们的脚本不同于其它的程序?结果证明,什么也没有。我们的脚本没有问题。是脚本存储位置的问题。我们知道 PATH 环境变量及其在系统查找可执行程序方面的作用。如果没有给出可执行程序的明确路径名,那么系统每次都会搜索一系列的目录,来查找此可执行程序。这个/bin 目录就是其中一个系统会自动搜索的目录。这个目录列表被存储在一个名为 PATH 的环境变量中。这个 PATH 变量包含一个由冒号(:)分隔开的目录列表。我们可以查看 PATH 的内容:

[me@linuxbox ~]$ echo $PATH
/home/me/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:
/bin:/usr/games

这里我们看到了我们的目录列表。如果我们的脚本位于此列表中任意目录下,那么我们的问题将会被解决。注意列表中的第一个录/home/me/bin。大多数的 Linux 发行版会配置PATH 变量,让其包含一个位于用户家目录下的 bin 目录,从而允许用户能够执行他们自己的程序。所以如果我们创建了一个 bin 目录,并把我们的脚本放在这个目录下,那么这个脚本就应该像其它程序一样开始工作了:

[me@linuxbox ~]$ mkdir bin
[me@linuxbox ~]$ mv hello_world bin
[me@linuxbox ~]$ hello_world
Hello World!

如果这个 PATH 变量不包含这个目录,我们能够轻松地添加它,通过在我们的 .bashrc 文件中包含下面这一行文本:

[root@VM_0_7_centos shell_script]# export PATH=~/bin:"$PATH"

当做了这个修改之后,它会在每个新的终端会话中生效。为了把这个修改应用到当前的终端会话中,我们必须让 shell 重新读取这个 .bashrc 文件。这可以通过“sourcing”.bashrc 文件来完成:

[me@linuxbox ~]$ . .bashrc

这个点(.)命令是 source 命令的同义词,一个 shell 内建命令,用来读取一个指定的 shell 命令文件,并把它看作是从键盘中输入的一样。

注意:在 Ubuntu 系统中,如果存在 ∼/bin 目录,当执行用户的 .bashrc 文件时,Ubuntu 会自动地添加这个 ∼/bin 目录到 PATH 变量中。所以在 Ubuntu 系统中,如果我们创建了这个∼/bin 目录,随后退出,然后再登录,一切会正常运行。

脚本文件的好去处

这个 ∼/bin 目录是存放为个人所用脚本的好地方。如果我们编写了一个脚本,系统中的每个用户都可以使用它,那么这个脚本的传统位置是 /usr/local/bin。系统管理员使用的脚本经常放到 /usr/local/sbin 目录下。大多数情况下,本地支持的软件,不管是脚本还是编译过的程序,都应该放到 /usr/local 目录下,而不是在 /bin/usr/bin 目录下。这些目录都是由 Linux 文件系统层次结构标准指定,只包含由 Linux 发行商所提供和维护的文件。

为书写脚本配置 vim
vim 文本编辑器有许多许多的配置设置。有几个常见的选项能够有助于脚本书写:
:syntax on
打开语法高亮。通过这个设置,当查看脚本的时候,不同的 shell 语法元素会以不同的颜色显示。这对于识别某些编程错误很有帮助。并且它看起来也很酷。注意为了这个功能起作用,你必须安装了一个完整的 vim 版本,并且你编辑的文件必须有一个 shebang,来说明这个文件是一个 shell 脚本。如果对于上面的命令,你遇到了困难,试试 :set syntax=sh
:set hlsearch
打开这个选项是为了高亮查找结果。比如说我们查找单词“echo”。通过设置这个选项,这个单词的每个实例会高亮显示。
:set tabstop=4
设置一个 tab 字符所占据的列数。默认是 8 列。把这个值设置为 4(一种常见做法),从而让长文本行更容易适应屏幕。
:set autoindent
打开 “auto indent” 功能。这导致 vim 能对新的文本行缩进与刚输入的文本行相同的列数。对于许多编程结构来说,这就加速了输入。停止缩进,输入 Ctrl-d
通过把这些命令(没有开头的冒号字符)添加到你的 ∼/.vimrc 文件中,这些改动会永久生效。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值