2. 第一个 shell 脚本


本节我们将说明脚本的运行方式,尤其是需要熟悉解释器。

创建一个简单的脚本来备份家目录

$ vi backup1.sh
tar cvfz /backup/staff.tar.gz /home/staff

执行刚刚创建的脚本,会收到一个 Permission denied 的错误提示

$ ./backup1.sh
-bash: ./backup1.sh: Permission denied

正如你看到的,对该脚本没有可执行权限,首先使用chmod u+x命令给脚本可执行权限,然后重新在命令行执行

$ ls -l backup1.sh
-rw-r--r--. 1 staff staff 3 Aug 06 23:22 backup1.sh
$ chmod u+x backup1.sh
$ ./backup1.sh

可以使用如下几种方式来执行脚本

  1. cd到 shell 脚本所在目录,输入./后跟执行脚本的文件名。 例如:

    $ cd /home/staff
    $ ./backup1.sh
    

  2. 通过给出完整路径从任何地方执行脚本

    $ /home/staff/backup1.sh
    

  3. 将包含 shell 脚本的目录添加到 PATH 环境变量,以后只需输入 shell 脚本的名称就可以执行。 在这种情况下,不需要在前面给出./或使用完整路径调用脚本。

    export PATH=$PATH:/home/staff
    backup1.sh
    

注意:方法 2,3 的优点是不需要cd到脚本所在目录去执行他

修改如下:

#!/bin/bash
# Take a backup of a specific user home directory
USERNAME=staff
BACKUP_LOCATION=/backup #Location to store the backup
tar cvfz $BACKUP_LOCATION/$USERNAME.tar.gz /home/$USERNAME
echo "Backup of $USERNAME home directory completed."
  • #!/bin/bash应该出现在 shell 的第一行,#!称为 sha bang ,后面跟着解释器(执行)的完整路径
  • 每行以#开头的是注释,视为注释行,可以对整行或者部分行进行备注,也可以给出#注释该行的其余部分,如上例中定义 BACKUP_LOCATION 变量的行所示
  • USERNAME 是指定需要备份的用户名变量。
  • BACKUP_LOCATION 是指定保存位置的变量
注意

关于#!/bin/bash行,在 Linux 中,以下所有内容都是相同的:

  • #!/bin/bash作为第一行,将使用 bash shell 执行 shell 脚本中的命令。 作为最佳实践,请始终使用这个方法。
  • #!/bin/sh作为第一行,它将使用/bin/sh(这是一个 Linux 中 bash 的符号链接)来执行 shell 脚本。
  • 如果未在 shell 脚本第一行中指定#!,在本例中,它将使用 bash ,因为它是 Linux 的默认 shell。