Shell脚本入门:从基础到实战
一、脚本基础结构
一个完整的 Shell 脚本包含 “解释器声明” 和 “执行命令” 两部分,部分场景会加注释说明。
1. 脚本开头(必须)
首行需声明使用的 Shell 解释器,最常用的是 Bash,格式为:
#!/bin/bash # 声明此脚本用 Bash 解释执行,#! 称为“shebang”
- 若不声明,系统会用默认 Shell(通常是 Bash),但为了兼容性和明确性,建议必写。
2. 注释(可选但推荐)
用 #
开头标识注释内容,解释器会忽略注释,仅用于给人看。
#!/bin/bash
# 这是一个注释,用于说明脚本功能:批量创建 3 个文件夹
mkdir dir1 dir2 dir3 # 这是行内注释,说明当前命令的作用
3. 脚本执行方式
写好的脚本(如 test.sh
)需先赋予执行权限,再运行:
# 1. 赋予执行权限(仅需执行一次)
chmod +x test.sh
# 2. 执行脚本(两种方式)
./test.sh # 相对路径执行(推荐,明确执行当前目录的脚本)
bash test.sh # 直接用 Bash 解释执行(无需提前赋权)
二、核心基础语法
1. 变量(存储数据)
Shell 变量无需声明类型,直接赋值使用,核心规则:
- 赋值时 等号前后不能有空格(如
name="zhangsan"
正确,name = "zhangsan"
错误)。 - 使用变量时加
$
符号,如echo $name
或echo ${name}
(大括号可选,复杂场景需加,避免歧义)。
示例:
#!/bin/bash
# 1. 定义变量
name="Alice" # 字符串变量(引号可加可不加,含空格必须加)
age=25 # 数字变量(无需加引号)
# 2. 使用变量
echo "姓名:$name"
echo "年龄:${age}岁" # 大括号明确变量边界,避免和后面的“岁”混淆
# 3. 接收用户输入(read 命令)
read -p "请输入你的城市:" city # -p 选项:显示提示语,输入内容存入 city 变量
echo "你所在的城市:$city"
2. 输出内容(echo/printf)
- echo:最常用,直接输出内容,默认换行。
echo "Hello Shell" # 输出:Hello Shell(换行) echo -n "不换行输出" # -n 选项:不自动换行
- printf:类似 C 语言的 printf,格式更严谨,需手动加换行符
\n
。printf "姓名:%s,年龄:%d\n" $name $age # %s 对应字符串,%d 对应数字
3. 条件判断(if/else)
用于根据条件执行不同命令,核心是 [ 条件表达式 ]
(括号前后必须有空格),常见判断场景:
- 数字比较:
-eq
(等于)、-gt
(大于)、-lt
(小于)(如[ $age -gt 18 ]
表示年龄大于 18)。 - 字符串比较:
==
(等于)、!=
(不等于)(如[ $name == "Alice" ]
)。 - 文件判断:
-f
(是否为文件)、-d
(是否为文件夹)(如[ -d "dir1" ]
表示判断 dir1 是否存在且是文件夹)。
示例(判断年龄是否成年):
#!/bin/bash
read -p "请输入年龄:" age
if [ $age -ge 18 ]; then # -ge 表示“大于等于”echo "已成年"
elseecho "未成年"
fi # if 语句必须以 fi 结尾(反向拼写)
4. 循环(for/while)
用于重复执行命令,常见两种循环:
- for 循环:适合固定次数的循环(如遍历列表、文件)。
# 遍历数字 1-5,创建 5 个文件 for i in {1..5}; do # {1..5} 表示 1 到 5 的序列touch file$i.txt # 创建文件 file1.txt 到 file5.txt done # for 循环以 done 结尾
- while 循环:适合按条件重复(如持续等待用户输入,直到输入正确)。
# 循环接收输入,直到输入“exit”退出 while true; do # true 表示无限循环read -p "输入内容(输入 exit 退出):" inputif [ $input == "exit" ]; thenbreak # 退出循环fiecho "你输入的是:$input" done
5. 函数(封装重复逻辑)
将多次使用的命令组合成函数,避免代码重复,格式:
#!/bin/bash
# 定义函数(函数名后无括号)
say_hello() {local name=$1 # local 表示变量仅在函数内有效,$1 表示函数的第一个参数echo "Hello, $name!"
}
# 调用函数(传参数)
say_hello "Bob" # 输出:Hello, Bob!
say_hello "Charlie" # 输出:Hello, Charlie!
- 函数参数通过
$1
(第一个参数)、$2
(第二个参数)... 获取,类似脚本的命令行参数。
三、基础语法总结(新手必记)
- 脚本首行
#!/bin/bash
必须写,执行前用chmod +x
赋权。 - 变量赋值无空格,使用加
$
,接收输入用read -p
。 - 条件判断用
[ 条件 ]
(空格必加),if 结尾用fi
。 - 循环用 for/while,结尾用
done
,遍历序列用{1..n}
。 - 函数定义
函数名() { 命令 }
,参数用$1/$2
获取。