基础 Shell 脚本使用手册
本手册旨在帮助初学者快速理解和使用 Shell 脚本,包含脚本结构、核心语法、示例及运行方法,所有代码均附带详细注释。
一、Shell 脚本简介
- 定义:Shell 脚本是包含一系列 Linux 命令的文本文件,可自动执行批量操作,提高工作效率。
- 常用解释器:
bash(默认最常用)、sh、zsh,脚本首行需指定解释器。 - 文件后缀:建议使用
.sh作为后缀(如test.sh),便于识别,但非强制要求。
二、脚本基础结构
一个标准的 Shell 脚本包含 解释器声明、注释、可执行命令 三部分,以下是模板示例:
bash
#!/bin/bash
# ==============================================================================
# 脚本名称:basic_template.sh
# 脚本功能:Shell 脚本基础模板,演示注释、变量、命令执行
# 适用环境:Linux/macOS(bash 解释器)
# 运行方式:bash basic_template.sh 或 ./basic_template.sh(需授权)
# 作者信息:Your Name
# 创建日期:2024-XX-XX
# ==============================================================================
# -------------------------- 1. 变量定义(注释:变量名建议大写,等号前后无空格)--------------------------
# 普通变量:直接赋值字符串或数字
NAME="Alice"
AGE=25
# 环境变量:引用系统预设变量(如当前用户、当前路径)
CURRENT_USER=$USER # $USER 是系统变量,存储当前登录用户名
CURRENT_DIR=$(pwd) # $(命令) 执行命令并将结果赋值给变量,pwd 是“显示当前路径”命令
# -------------------------- 2. 输出内容(注释:echo 用于打印文本,printf 格式更规范)--------------------------
# 打印普通文本
echo "=== 基础信息输出 ==="
# 打印变量($变量名 或 ${变量名},后者在拼接字符串时更安全)
echo "Hello, 我的名字是:${NAME}"
echo "我的年龄是:${AGE} 岁"
echo "当前登录用户:${CURRENT_USER}"
echo "当前脚本执行路径:${CURRENT_DIR}"
# printf 格式化输出(类似 C 语言,需指定格式符,如 %s 字符串、%d 数字)
printf "格式化输出:姓名=%s, 年龄=%d\n" "${NAME}" "${AGE}" # \n 表示换行
# -------------------------- 3. 执行系统命令(注释:直接写 Linux 命令,可结合变量)--------------------------
echo -e "\n=== 执行系统命令示例 ===" # -e 允许解析转义字符(如 \n 换行)
# 示例1:查看当前目录下的文件(ls -l 是“详细列表”命令)
echo "当前目录文件列表:"
ls -l
# 示例2:统计当前目录下的文件数量(wc -l 是“统计行数”命令)
FILE_COUNT=$(ls -l | wc -l) # 管道符 | :将前一个命令结果传给后一个命令
echo "当前目录文件总数:${FILE_COUNT} 个(含目录)"
三、脚本运行步骤
1. 编写脚本
-
使用文本编辑器创建脚本文件(如
vim、nano或 VS Code): -
编辑完成后,按
Esc键,输入:wq保存并退出vim。
2. 赋予执行权限
默认情况下,脚本文件无执行权限,需通过 chmod 命令授权:
bash
# 给脚本添加“所有者可执行”权限(最常用,安全)
chmod u+x basic_template.sh
# 或给“所有用户可执行”权限(不推荐,适用于共享脚本)
# chmod +x basic_template.sh
3. 运行脚本
有两种常用运行方式,推荐第一种(避免环境变量冲突):
| 运行方式 | 命令示例 | 说明 |
|---|---|---|
| 指定解释器运行 | bash basic_template.sh |
无需授权也可运行,优先使用,避免兼容性问题 |
| 直接运行(需授权) | ./basic_template.sh |
需先执行 chmod u+x 授权,依赖首行解释器 |
| 全局运行(需配置环境变量) | basic_template.sh |
将脚本放入 /usr/local/bin 等环境变量目录,可直接输脚本名运行 |
四、核心语法示例(带注释)
以下是 Shell 脚本中最常用的语法(条件判断、循环、参数传递),整合为一个实用脚本:
bash
#!/bin/bash
# ==============================================================================
# 脚本名称:advanced_demo.sh
# 脚本功能:演示条件判断、循环、参数传递、函数
# 运行方式:bash advanced_demo.sh [参数1] [参数2](如 bash advanced_demo.sh 10 20)
# ==============================================================================
# -------------------------- 1. 函数定义(注释:封装重复执行的逻辑,类似“工具”)--------------------------
# 函数名:print_info,功能:打印分隔线和提示信息
print_info() {
# $1 是函数的第一个参数,调用时传入
echo -e "\n==================== ${1} ===================="
}
# -------------------------- 2. 参数传递(注释:运行脚本时传入的参数,用 $1-$n 表示,$0 是脚本名)--------------------------
print_info "参数传递演示"
# $# 表示传入参数的总个数
echo "脚本名称:$0"
echo "传入参数总个数:$#"
echo "第一个参数:$1"
echo "第二个参数:$2"
# 判断是否传入参数(-z 表示“字符串为空”)
if [ -z "$1" ] || [ -z "$2" ]; then
echo "警告:请传入两个参数!示例:bash advanced_demo.sh 10 20"
# 退出脚本,返回值 1 表示“执行失败”(0 表示成功)
exit 1
fi
# -------------------------- 3. 条件判断(注释:if-else,判断数值、文件、字符串)--------------------------
print_info "条件判断演示"
# 数值比较:用 -eq(等于)、-gt(大于)、-lt(小于),注意变量不加 $ 时需用 $(( )) 计算
NUM1=$1
NUM2=$2
if [ ${NUM1} -eq ${NUM2} ]; then # 注意:[ ] 前后必须有空格!
echo "${NUM1} 等于 ${NUM2}"
elif [ ${NUM1} -gt ${NUM2} ]; then
echo "${NUM1} 大于 ${NUM2}"
else
echo "${NUM1} 小于 ${NUM2}"
fi
# 文件判断:判断当前目录是否存在 test.txt
FILE="test.txt"
if [ -f "${FILE}" ]; then # -f 表示“是否为普通文件”
echo "文件 ${FILE} 已存在,内容如下:"
cat "${FILE}" # 打印文件内容
else
echo "文件 ${FILE} 不存在,正在创建..."
echo "这是新创建的文件" > "${FILE}" # > 表示“覆盖写入”文件
fi
# -------------------------- 4. 循环(注释:for 循环遍历列表,while 循环按条件执行)--------------------------
print_info "循环演示"
# for 循环:遍历 1-5 的数字({1..5} 是 bash 中的序列表达式)
echo "for 循环遍历 1-5:"
for i in {1..5}; do
echo "当前数字:${i}"
# 延迟 0.5 秒(sleep 命令,避免输出太快)
sleep 0.5
done
# while 循环:计算 1 到 NUM1 的累加和(NUM1 是传入的第一个参数)
echo -e "\nwhile 循环:计算 1 到 ${NUM1} 的累加和"
sum=0
count=1
while [ ${count} -le ${NUM1} ]; do
sum=$((sum + count)) # $(( )) 用于数值计算,无需 $ 引用变量
count=$((count + 1))
done
echo "1 到 ${NUM1} 的累加和:${sum}"
# -------------------------- 5. 脚本结束(返回成功状态)--------------------------
print_info "脚本执行完成"
# exit 0 表示脚本“正常退出”,可被其他脚本判断执行结果
exit 0
五、常见问题与解决方法
- “Permission denied”(权限不足)原因:未给脚本赋予执行权限。解决:执行 chmod u+x 脚本名.sh 授权。
- “command not found”(命令不存在)原因:脚本中使用的命令(如 docker、python)未安装,或解释器路径错误(如首行 #!/bin/bash 写成 #!/bin/sh)。解决:安装对应命令(如 sudo apt install 命令名),或确认解释器路径(用 which bash 查看 bash 实际路径)。
- 条件判断报错 “syntax error near unexpected token `then’”原因:if 语句的 [ ] 前后没有加空格(如错误写法 if[$a -eq $b])。解决:修正为 if [ $a -eq $b ](注意空格)。
基础 Shell 脚本使用手册
/archives/007-ji-chu-shell-jiao-ben-shi-yong-shou-ce