学编程的传统是从 Hello World 开始,Shell 也不例外。但写脚本之前,有些准备工作要做。
用你喜欢的编辑器创建一个文件:
vim hello.sh
文件内容:
#!/bin/bash
echo "Hello World"
就这么两行,一个脚本就写好了。
第一行 #!/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 的习惯。
写脚本的步骤:
习惯很重要。从一开始就按规范来,后面少踩坑。