4. 第一个 hello world程序。
这节课我们来说明 Shell 脚本程序的编写和运行方法。
脚本程序
所谓脚本程序是指依赖解释执行器来运行的程序,脚本程序一般都是文本文件而非二进制的机器指令。
编写 Shell 脚本程序
先编写一个文本文件名为:myhello.sh,内容如下:
echo "hello Shell!"
Shell 文件一般以
.sh作为后缀名。上面这个文件内部只有一行echo命令,但你可以书写多条 Linux 命令,每个命令占用一行即可。
运行 Shell 程序
shell 脚本程序有两种运行方法:
- 在当前 Shell 进程内部运行 Shell 程序(使用
source或.命令运行)。 - 另外开始一个 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等)。
练习:
- 写一个
mk_tar.sh做如下的几件事:- 本地创建一个文件夹
myproject。 - 将
/etc/passwd文件复制到myproject文件夹。 - 将
/usr/include/stdio.h文件复制到myproject文件夹。 - 将
myproject文件夹打包成为myproject.tar.gz。 - 删除
myproject文件夹。
- 本地创建一个文件夹
- 使用
source mk_tar.sh运行上述mk_tar.sh脚本文件。 - 使用
pstree命令查看当前文件夹的内容。