shell脚本
所有操作默认非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
还有诸如dash
、zsh
等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
文件夹。