4. 第一个 hello world程序。

这节课我们来说明 Shell 脚本程序的编写和运行方法。

脚本程序

所谓脚本程序是指依赖解释执行器来运行的程序,脚本程序一般都是文本文件而非二进制的机器指令。

编写 Shell 脚本程序

先编写一个文本文件名为:myhello.sh,内容如下:

echo "hello Shell!"

Shell 文件一般以 .sh 作为后缀名。上面这个文件内部只有一行 echo 命令,但你可以书写多条 Linux 命令,每个命令占用一行即可。

运行 Shell 程序

shell 脚本程序有两种运行方法:

  1. 在当前 Shell 进程内部运行 Shell 程序(使用 source. 命令运行)。
  2. 另外开始一个 Shell 进程,在新进程内部运行 Shell 程序(使用 bash./myhello.sh 命令运行)。

两种方式的不同在于:第一中方式有可能改变当前 Shell 的状态(如环境变量的值),第二中运行则不会改变当前 Shell 的运行状态。

1. 在当前 Shell 进程内部运行 Shell 程序

命令格式

source 脚本文件
# 或
. 脚本文件

如:

weimingze@mzstudio:~$ source myhello.sh
hello Shell!
weimingze@mzstudio:~$ . myhello.sh
hello Shell!
weimingze@mzstudio:~$

source. 都是 bash 的内部命令,在 MacOS 的 zsh 下只能用 source 命令(没有 . 命令)。

2. 在新 Shell 进程内部运行 Shell 程序

此种方法也有两种运行方是:

2.1 显示启动 bash 命令

命令格式

bash 脚本文件

如:

weimingze@mzstudio:~$ bash myhello.sh
hello Shell!
weimingze@mzstudio:~$

2.2 在文件内部支持调用 bash

命令格式

./脚本文件

使用脚本文件当做命令直接执行,此种做法要求脚本文件必须有读取和执行权限。

如:

weimingze@mzstudio:~$ chmod +rx myhello.sh
weimingze@mzstudio:~$ ls -l myhello.sh
-rwxrwxr-x 1 weimingze weimingze 19 May 27 21:36 myhello.sh
weimingze@mzstudio:~$ ./myhello.sh
hello Shell!
weimingze@mzstudio:~$

首行解释器注释

在 Linux/UNIX 系统中,脚本文件的第一行以 #! 开头的注释是用来告诉 Shell 此脚本文件用那个解释器解释执行。英文名:sha-bang

由于这个 sha-bang 语法没有中文命名,魏老师在这里给他取个中文名叫:首行解释器注释

语法格式

#!解释器路径

要求:脚本文件的前两个字符必须是 #!

bash 脚本文件的 首行解释器注释

重新编写 myhello.sh,在第一行插入 #! /bin/bash(如果不加入这一行。默认也是 /bin/bash 来解释执行),内容如下:

#!/bin/bash
echo "hello Shell!"

运行

weimingze@mzstudio:~$ /home/weimingze/myhello.sh
hello Shell!
weimingze@mzstudio:~$

python 脚本文件的 首行解释器注释

重新编写 myhello.py,在第一行插入 #!/usr/bin/python3,内容如下:

#!/usr/bin/python3
print("hello Python3!")

运行

weimingze@mzstudio:~$ vim myhello.py
weimingze@mzstudio:~$ chmod +rx myhello.py
weimingze@mzstudio:~$ /home/weimingze/myhello.py
hello Python3!
weimingze@mzstudio:~$

所有的脚本语言的文件都可以使用 首行解释器注释 的语法直接运行(如:python、perl、node、ruby等)。

练习:

  1. 写一个 mk_tar.sh 做如下的几件事:
    • 本地创建一个文件夹 myproject
    • /etc/passwd 文件复制到 myproject 文件夹。
    • /usr/include/stdio.h 文件复制到 myproject 文件夹。
    • myproject 文件夹打包成为 myproject.tar.gz
    • 删除 myproject 文件夹。
  2. 使用 source mk_tar.sh 运行上述 mk_tar.sh 脚本文件。
  3. 使用 pstree 命令查看当前文件夹的内容。