第一个Shell脚本 #
一、创建第一个脚本 #
1.1 编写脚本 #
使用你喜欢的编辑器创建一个名为 hello.sh 的文件:
bash
#!/bin/bash
echo "Hello, World!"
echo "当前时间: $(date)"
echo "当前用户: $USER"
echo "当前目录: $(pwd)"
1.2 脚本结构解析 #
text
#!/bin/bash ← Shebang行,指定解释器
← 空行,提高可读性
echo "Hello..." ← 命令语句
各部分说明:
| 部分 | 说明 |
|---|---|
| #!/bin/bash | Shebang,指定脚本解释器 |
| # 注释 | 单行注释,不会被执行 |
| echo | 输出命令 |
| $USER | 环境变量 |
| $(date) | 命令替换 |
1.3 Shebang详解 #
Shebang(#!)告诉系统使用哪个解释器来执行脚本:
bash
#!/bin/bash # 使用Bash
#!/bin/sh # 使用sh
#!/usr/bin/env bash # 使用env查找bash(更可移植)
#!/usr/bin/python3 # 使用Python3
推荐使用:
bash
#!/usr/bin/env bash
这种方式更具有可移植性,因为bash可能安装在不同位置。
二、执行脚本 #
2.1 赋予执行权限 #
bash
# 添加执行权限
chmod +x hello.sh
# 查看文件权限
ls -l hello.sh
# -rwxr-xr-x 1 user user 123 Mar 27 10:00 hello.sh
2.2 执行脚本 #
bash
# 方法一:直接执行(需要执行权限)
./hello.sh
# 方法二:使用bash执行(不需要执行权限)
bash hello.sh
# 方法三:使用source执行(在当前Shell中执行)
source hello.sh
# 方法四:使用点号执行(同source)
. hello.sh
2.3 执行方式对比 #
| 方式 | 权限要求 | 执行环境 | 用途 |
|---|---|---|---|
| ./script.sh | 需要执行权限 | 新子Shell | 正常执行 |
| bash script.sh | 不需要 | 新子Shell | 调试执行 |
| source script.sh | 不需要 | 当前Shell | 加载配置 |
| . script.sh | 不需要 | 当前Shell | 加载配置 |
三、脚本基本元素 #
3.1 注释 #
bash
#!/bin/bash
# 这是单行注释
echo "Hello"
: '
这是多行注释
可以写很多内容
使用冒号命令
'
echo "World"
# 注释也可以写在代码后面
name="Shell" # 定义变量
3.2 变量 #
bash
#!/bin/bash
# 定义变量(等号两边不能有空格)
name="张三"
age=25
city="北京"
# 使用变量
echo "姓名: $name"
echo "年龄: $age"
echo "城市: ${city}"
# 变量名推荐使用大写(常量)
readonly PI=3.14159
3.3 命令替换 #
bash
#!/bin/bash
# 方式一:$()
current_date=$(date +%Y-%m-%d)
current_user=$(whoami)
files_count=$(ls | wc -l)
# 方式二:``(反引号,不推荐)
old_style=`date`
echo "日期: $current_date"
echo "用户: $current_user"
echo "文件数: $files_count"
3.4 输入输出 #
bash
#!/bin/bash
# 输出
echo "这是输出"
printf "格式化输出: %s\n" "Hello"
# 输入
echo -n "请输入你的名字: "
read name
echo "你好, $name!"
# 带提示的输入
read -p "请输入年龄: " age
echo "你今年 $age 岁"
四、完整的示例脚本 #
4.1 系统信息脚本 #
创建 sysinfo.sh:
bash
#!/bin/bash
#
# 系统信息收集脚本
# 显示系统的基本信息
#
echo "========================================"
echo " 系统信息报告"
echo "========================================"
echo ""
# 主机信息
echo "【主机信息】"
echo "主机名: $(hostname)"
echo "内核版本: $(uname -r)"
echo "系统版本: $(cat /etc/os-release | grep PRETTY_NAME | cut -d'\"' -f2)"
echo ""
# CPU信息
echo "【CPU信息】"
echo "CPU型号: $(lscpu | grep 'Model name' | cut -d':' -f2 | xargs)"
echo "CPU核心: $(nproc)"
echo ""
# 内存信息
echo "【内存信息】"
free -h | head -2
echo ""
# 磁盘信息
echo "【磁盘信息】"
df -h | grep -E '^/dev'
echo ""
# 网络信息
echo "【网络信息】"
ip addr show | grep -E 'inet ' | grep -v '127.0.0.1'
echo ""
echo "========================================"
echo "报告生成时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "========================================"
4.2 用户交互脚本 #
创建 greet.sh:
bash
#!/bin/bash
#
# 用户交互示例脚本
#
# 获取用户输入
read -p "请输入你的名字: " name
read -p "请输入你的年龄: " age
# 计算出生年份
current_year=$(date +%Y)
birth_year=$((current_year - age))
# 输出结果
echo ""
echo "========== 个人信息 =========="
echo "姓名: $name"
echo "年龄: $age 岁"
echo "出生年份: $birth_year 年"
echo "=============================="
4.3 文件操作脚本 #
创建 filecheck.sh:
bash
#!/bin/bash
#
# 文件检查脚本
#
read -p "请输入文件路径: " filepath
if [ -e "$filepath" ]; then
echo "文件存在"
if [ -f "$filepath" ]; then
echo "类型: 普通文件"
echo "大小: $(du -h "$filepath" | cut -f1)"
echo "权限: $(ls -l "$filepath" | cut -c1-10)"
elif [ -d "$filepath" ]; then
echo "类型: 目录"
echo "文件数: $(ls -1 "$filepath" | wc -l)"
fi
echo "修改时间: $(stat -c %y "$filepath" | cut -d'.' -f1)"
else
echo "文件不存在: $filepath"
fi
五、脚本调试 #
5.1 使用-x参数 #
bash
# 调试模式执行
bash -x hello.sh
# 输出示例:
# + echo 'Hello, World!'
# Hello, World!
# + echo '欢迎学习Shell脚本编程!'
# 欢迎学习Shell脚本编程!
5.2 在脚本中启用调试 #
bash
#!/bin/bash
set -x # 开启调试
echo "这部分会被调试"
set +x # 关闭调试
echo "这部分不会显示调试信息"
5.3 常用调试选项 #
bash
#!/bin/bash
set -e # 遇到错误立即退出
set -u # 使用未定义变量时报错
set -x # 显示执行的命令
set -o pipefail # 管道中的命令失败时退出
# 组合使用
set -euo pipefail
六、脚本规范 #
6.1 良好的脚本结构 #
bash
#!/bin/bash
#
# 脚本名称: example.sh
# 功能描述: 示例脚本,展示良好的脚本结构
# 作 者: Your Name
# 创建日期: 2026-03-27
# 版本号: v1.0.0
#
# 严格模式
set -euo pipefail
# 常量定义
readonly SCRIPT_NAME=$(basename "$0")
readonly SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd")
# 全局变量
verbose=false
# 帮助信息
usage() {
cat << EOF
用法: $SCRIPT_NAME [选项]
选项:
-h, --help 显示帮助信息
-v, --verbose 显示详细输出
EOF
}
# 日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
}
# 主函数
main() {
log "脚本开始执行"
# 主逻辑
log "脚本执行完成"
}
# 解析参数
while [[ $# -gt 0 ]]; do
case "$1" in
-h|--help)
usage
exit 0
;;
-v|--verbose)
verbose=true
shift
;;
*)
echo "未知选项: $1"
usage
exit 1
;;
esac
done
# 执行主函数
main "$@"
6.2 编码建议 #
| 建议 | 说明 |
|---|---|
| 使用严格模式 | set -euo pipefail |
| 变量用花括号 | $ |
| 字符串用双引号 | “$variable” |
| 函数化编程 | 将逻辑封装为函数 |
| 添加注释 | 解释复杂逻辑 |
| 错误处理 | 检查命令执行结果 |
七、总结 #
7.1 关键要点 #
| 要点 | 说明 |
|---|---|
| Shebang | 指定脚本解释器 |
| 执行权限 | chmod +x script.sh |
| 执行方式 | ./script.sh 或 bash script.sh |
| 调试 | bash -x script.sh |
7.2 下一步 #
你已经完成了第一个Shell脚本!接下来让我们深入了解 脚本执行方式,掌握更多执行技巧。
最后更新:2026-03-27