第一个 Shell 脚本

学编程的传统是从 Hello World 开始,Shell 也不例外。但写脚本之前,有些准备工作要做。

创建脚本文件

用你喜欢的编辑器创建一个文件:

vim hello.sh

文件内容:

#!/bin/bash
echo "Hello World"

就这么两行,一个脚本就写好了。

Shebang 是什么

第一行 #!/bin/bash 叫 Shebang,也叫 hashbang。它告诉系统用哪个解释器来执行这个脚本。

  • #!/bin/bash - 用 Bash 执行
  • #!/bin/sh - 用 sh 执行
  • #!/usr/bin/env bash - 更通用的写法,从环境变量找 bash

第三种写法移植性更好,因为不同系统 bash 的路径可能不一样。

Shebang 必须在第一行,否则不生效。

添加执行权限

刚创建的文件默认没有执行权限:

ls -l hello.sh
# -rw-r--r-- 1 user user 32 Jan 1 10:00 hello.sh

给它加上执行权限:

chmod +x hello.sh

再看:

ls -l hello.sh
# -rwxr-xr-x 1 user user 32 Jan 1 10:00 hello.sh

多了三个 x,表示可执行。

运行脚本

./hello.sh
# Hello World

输出 Hello World,脚本执行成功。

注意 ./ 不能省,它表示当前目录。Linux 不会在当前目录找命令,除非当前目录在 PATH 环境变量里。

另一种执行方式

如果不想加执行权限,可以这样:

bash hello.sh

直接指定解释器执行,不需要 Shebang,也不需要执行权限。但这种方式不够规范,正式脚本还是建议加上执行权限。

一个稍复杂的例子

#!/bin/bash

# 这是一个注释
# 脚本功能:显示系统信息

echo "=== 系统信息 ==="
echo "当前用户: $(whoami)"
echo "主机名: $(hostname)"
echo "当前目录: $(pwd)"
echo "系统时间: $(date)"

运行结果:

=== 系统信息 ===
当前用户: root
主机名: server01
当前目录: /root
系统时间: 2024年 01月 15日 星期一 10:30:00 CST

脚本结构建议

一个规范的脚本通常包含:

#!/bin/bash
#===============================
# 脚本名称: backup.sh
# 功能描述: 备份数据库
# 作者: 张三
# 创建时间: 2024-01-15
#===============================

set -e  # 遇错退出

# 变量定义
DB_NAME="mydb"
BACKUP_DIR="/backup"

# 主逻辑
echo "开始备份..."
mysqldump $DB_NAME > $BACKUP_DIR/$DB_NAME.sql
echo "备份完成"

常见问题

脚本执行报错:Permission denied

没加执行权限,chmod +x 脚本名 解决。

脚本执行报错:command not found

可能是 Windows 换行符的问题。Linux 用 \n,Windows 用 \r\n。用 dos2unix 转换:

dos2unix hello.sh

或者用 vim 设置:

:set ff=unix
:wq

脚本没有 Shebang 会怎样

系统会用当前 Shell 执行,结果可能符合预期,也可能出问题。建议养成加 Shebang 的习惯。

小结

写脚本的步骤:

  1. 创建文件,写 Shebang
  2. 写脚本内容
  3. 加执行权限
  4. 运行测试

习惯很重要。从一开始就按规范来,后面少踩坑。