第一个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