所有操作默认非root用户,本文中用 lz 用户。

首先明白一点,linux系统中的文件不存在类似windows系统里的扩展名(也即后缀,如.txt, .mkv等等),linux将所有文件等同看待,视为文本文件。

举个例子,现在在linux系统下有一个文件,比如说文件名为word。linux会把它当作一个文本文件;假如把word重命名为word.txt,linux依然会把它当作一个文本文件,而且它的名字就是word.txt,并不会像windows那样:看作文件名是word,扩展名(文件类型)是txt

明白了这一点之后,linux的脚本文件只不过是在文本文件的基础上,赋予了该文件一个可执行权限而已。常见的linux脚本文件的文件名通常是以.sh结尾的,但我们现在知道,无论带不带.sh,只要文件被赋予了可执行权限就是一个可执行文件(可直接命令行输入文件名回车运行,无需sh命令后跟文件名回车),而通常脚本文件后缀为.sh只是给人看的,是告诉你“我很有可能是一个脚本文件”,而对计算机来说都一样,计算机只认权限。

通常shell脚本的第一行以类似#! /bin/bash开头,是告诉系统,这个脚本以bash作为shell来运行(除了bash还有诸如dashzsh等shell)。

假设我们在~/test/下新建一个脚本文件叫mkdir.sh

cd ~/test
vim mkdir.sh
#! /bin/bash
mkdir newDir

现在我们ll一下查看文件属性:

$ ll
-rw-rw-r--  1 lz lz   26 Jun  4 18:46 mkdir.sh

可以看到所有的x位都是-,也就是说该文件还没有被赋予任何可执行权限,我们现在赋予其可执行权限:

chmod a+x mkdir.sh

再运行ll

$ ll
-rwxrwxr-x  1 lz lz   26 Jun  4 18:46 mkdir.sh*

可以看到所有的x位都是x,切文件名后面有一个*提示我们这是可执行文件。

有4种方式运行shell脚本文件:


在脚本文件目录下直接执行

该方法 需要 该文件有可执行权限,而且需要在文件前加./告诉shell这是在执行可执行文件,否则shell会在PATH中寻找名字是mkdir.sh的命令,显然找不到:

cd test
./mkdir.sh

该方法会在脚本文件目录下生成一个newDir文件夹。


在任意目录下通过绝对路径直接执行

该方法 需要 该文件有可执行权限:

cd <any directory>
/home/lz/test/mkdir.sh

该方法会在运行该命令时所在目录下生成一个newDir文件夹。


在脚本文件目录下使用sh命令执行

该方法 不需要 该文件有可执行权限:

cd test
sh mkdir.sh

该方法会在脚本文件目录下生成一个newDir文件夹。


在任意目录下通过绝对路径使用sh命令执行

该方法 不需要 该文件有可执行权限:

cd <any directory>
sh /home/lz/test/mkdir.sh

该方法会在运行该命令时所在目录下生成一个newDir文件夹。