Shell 基础知识点总结
Shell 是操作系统内核与用户之间的命令解释器,它接收用户输入的命令,将其翻译成内核能理解的指令并执行,最终返回结果。常见的 Shell 版本包括 Bash
(Linux 默认)、Zsh
、Sh
等,其中 Bash
(Bourne Again Shell)应用最广泛,以下知识点以 Bash
为核心展开。
一、Shell 环境与基本概念
1. Shell 的分类
根据交互方式,Shell 分为两类:
- 交互式 Shell:用户输入一条命令,Shell 执行一条并返回结果(如终端直接操作)。
- 非交互式 Shell:执行预先编写好的 Shell 脚本(
.sh
文件),批量完成任务,无需用户逐行干预。
2. 查看与切换 Shell
- 查看当前使用的 Shell:
echo $SHELL
($SHELL
是环境变量,存储当前 Shell 路径)。 - 查看系统支持的 Shell:
cat /etc/shells
。 - 切换 Shell(需用户已安装目标 Shell):
chsh -s /bin/zsh
(永久切换,需重启终端;临时切换直接输入zsh
)。
3. 环境变量与本地变量
变量是 Shell 中存储数据的载体,分为环境变量(全局生效,所有子进程可访问)和本地变量(仅当前 Shell 进程生效)。
类型 | 定义方式 | 生效范围 | 示例 |
---|---|---|---|
本地变量 | 变量名=值 (无空格) | 当前 Shell 进程 | name="Alice" |
环境变量 | export 变量名=值 | 当前 Shell 及所有子进程 | export PATH=/usr/local/bin:$PATH |
查看变量 | echo $变量名 | - | echo $name (输出 Alice) |
删除变量 | unset 变量名 | - | unset name |
常用系统环境变量:
PATH
:存储命令的搜索路径(执行ls
时,Shell 会在PATH
路径中找ls
程序)。HOME
:当前用户的主目录(如~
等价于$HOME
)。USER
:当前登录用户名。PWD
:当前工作目录(等价于pwd
命令)。
二、Shell 基本命令
Shell 命令是操作的核心,格式通常为:命令 [选项] [参数]
(选项以 -
短选项或 --
长选项开头,如 ls -l
或 ls --all
)。
1. 目录与文件操作命令
命令 | 功能描述 | 常用选项与示例 |
---|---|---|
pwd | 显示当前工作目录路径 | pwd (输出 /home/user ) |
cd | 切换工作目录 | - cd ~ :回到主目录- cd .. :回到上级目录- cd /usr/local :绝对路径切换 |
ls | 列出目录下的文件 / 目录 | - ls -l (长格式,显示权限、大小等)- ls -a (显示隐藏文件,以 . 开头) |
mkdir | 创建目录 | - mkdir test :创建单个目录- mkdir -p a/b/c :递归创建多级目录 |
touch | 创建空文件或更新文件修改时间 | touch demo.sh (创建脚本文件) |
cp | 复制文件 / 目录 | - cp file1 file2 :复制 file1 为 file2- cp -r dir1 dir2 :递归复制目录 |
mv | 移动 / 重命名文件 / 目录 | - mv file1 dir/ :移动 file1 到 dir 目录- mv oldname newname :重命名 |
rm | 删除文件 / 目录(谨慎使用,不可恢复) | - rm file :删除文件- rm -r dir :递归删除目录- rm -f file :强制删除(不提示) |
cat | 查看文件内容(适合短文件) | cat demo.sh (直接输出文件内容) |
more/less | 分页查看文件内容(适合长文件) | - more longfile :向下分页(按 Enter 翻行,q 退出)- less longfile :上下分页(按 ↑↓ 键,q 退出) |
grep | 在文件 / 输出中搜索匹配的字符串(文本过滤) | - grep "error" log.txt :在 log.txt 中找 "error" 行- grep -i "Error" log.txt :忽略大小写 |
2. 系统信息与权限命令
命令 | 功能描述 | 常用选项与示例 | |
---|---|---|---|
whoami | 显示当前登录用户名 | whoami (输出 user ) | |
ps | 查看进程状态 | - ps aux :查看所有进程(a :所有用户,u :显示用户,x :无终端进程)- `ps -ef | grep python`:过滤出 python 进程 |
kill | 终止进程 | - kill 1234 :通过进程 ID(PID)终止进程- kill -9 1234 :强制终止( -9 为强制信号) | |
chmod | 修改文件 / 目录的权限 | 权限分 3 组(所有者、组用户、其他用户),每组含 r (读,4)、w (写,2)、x (执行,1)示例:chmod 755 demo.sh (所有者 rwx,其他 rx) | |
chown | 修改文件 / 目录的所有者和所属组 | chown user:group demo.sh (所有者改为 user,组改为 group) |
三、Shell 脚本基础
Shell 脚本是将一系列 Shell 命令按逻辑组织到 .sh
文件中,批量执行任务的工具。
1. 脚本的创建与执行
步骤 1:创建脚本文件
用文本编辑器(如 vim
、nano
)创建 .sh
文件,首行必须指定解释器路径(称为 “shebang”):
bash
#! /bin/bash # 指定用 Bash 解释器执行(不可省略)
# 这是注释(以 # 开头,不执行)
echo "Hello, Shell!" # 输出字符串
步骤 2:赋予执行权限
刚创建的脚本默认无执行权限,需用 chmod
授权:
bash
chmod +x demo.sh # 给 demo.sh 增加执行权限(+x 表示添加执行权限)
步骤 3:执行脚本
有两种执行方式:
- 方式 1(推荐):
./demo.sh
(需在脚本所在目录,./
表示当前目录)。 - 方式 2:
bash demo.sh
(无需执行权限,直接指定 Bash 解释器运行)。
2. 脚本中的变量与参数
(1)自定义变量
- 定义:
变量名=值
(等号前后无空格,值含空格需用引号包裹,如msg="Hello World"
)。 - 使用:
$变量名
或${变量名}
(如echo $msg
输出Hello World
)。
(2)位置参数(脚本接收外部输入)
执行脚本时,可传入参数,脚本内用 $n
接收(n
为 1、2、3...,$0
表示脚本自身路径):
bash
# 脚本 demo.sh 内容
echo "脚本名:$0"
echo "第一个参数:$1"
echo "第二个参数:$2"
执行脚本并传参:
bash
./demo.sh apple banana # 输出:
# 脚本名:./demo.sh
# 第一个参数:apple
# 第二个参数:banana
(3)特殊参数
$#
:传入参数的总个数。$*
:所有参数的集合(视为一个整体)。$@
:所有参数的集合(视为多个独立个体)。$?
:上一条命令的退出状态码(0 表示执行成功,非 0 表示失败,如echo $?
查看上条命令结果)。
3. 脚本中的流程控制
(1)条件判断:if-else
语法格式(注意 if
后需有 then
,fi
结束判断):
bash
if [ 条件表达式 ]; then # 条件表达式前后必须有空格,[] 等价于 test 命令# 条件成立时执行的命令
elif [ 另一个条件 ]; then# 第二个条件成立时执行的命令
else# 所有条件不成立时执行的命令
fi
常见条件判断类型:
- 数值比较:
-eq
(等于)、-ne
(不等于)、-gt
(大于)、-lt
(小于),如[ 5 -gt 3 ]
(5>3,成立)。 - 字符串比较:
==
(等于)、!=
(不等于)、-z
(空字符串),如[ "$name" == "Alice" ]
。 - 文件判断:
-f
(是否为文件)、-d
(是否为目录)、-r
(是否有读权限),如[ -f demo.sh ]
(判断 demo.sh 是否存在且为文件)。
示例:判断文件是否存在
bash
if [ -f demo.sh ]; thenecho "文件 demo.sh 存在"
elseecho "文件 demo.sh 不存在"
fi
(2)循环:for
与 while
① for
循环(遍历列表或参数)
语法 1:遍历固定列表
bash
for 变量 in 列表; do# 循环体命令(变量每次取列表中的一个值)
done
示例:遍历水果列表
bash
for fruit in apple banana orange; doecho "水果:$fruit"
done
# 输出:
# 水果:apple
# 水果:banana
# 水果:orange
语法 2:遍历参数($@
表示所有参数)
bash
for arg in $@; doecho "参数:$arg"
done
② while
循环(条件成立时持续执行)
语法(条件为真时循环,done
结束):
bash
while [ 条件表达式 ]; do# 循环体命令
done
示例:循环输出 1-5
bash
i=1
while [ $i -le 5 ]; do # 当 i ≤5 时循环echo "i = $i"i=$((i+1)) # 数值计算($((...)) 用于整数运算)
done
(3)分支选择:case
适合多条件匹配场景,替代多个 if-elif
,语法:
bash
case $变量 in模式1)# 变量匹配模式1时执行;; # 结束当前分支(不可省略)模式2)# 变量匹配模式2时执行;;*) # 默认分支(所有模式不匹配时执行)# 默认命令;;
esac # case 倒写,结束分支
示例:根据输入判断星期
bash
read -p "请输入星期(1-7):" day # read 接收用户输入,-p 显示提示语
case $day in1) echo "星期一" ;;2) echo "星期二" ;;3) echo "星期三" ;;4) echo "星期四" ;;5) echo "星期五" ;;6|7) echo "周末" ;; # | 表示“或”*) echo "输入错误!" ;;
esac
四、Shell 进阶基础
1. 管道与重定向
Shell 支持通过管道(|
) 和重定向(>
、>>
、<
) 处理命令的输入输出。
(1)管道(|
)
将前一个命令的标准输出作为后一个命令的标准输入,实现命令联动。示例:查看当前目录下文件数(ls -l
输出长格式,wc -l
统计行数):
bash
ls -l | wc -l
(2)重定向
-
标准输出重定向(
>
、>>
):命令 > 文件
:将命令输出覆盖写入文件(原文件内容清空)。命令 >> 文件
:将命令输出追加写入文件(原文件内容保留)。示例:将ls
结果写入filelist.txt
:
bash
ls -l >> filelist.txt # 追加写入,不覆盖原有内容
-
标准错误重定向(
2>
、2>>
):- 标准错误的文件描述符是
2
,用2>
或2>>
重定向错误信息。示例:将错误信息写入error.log
:
bash
rm nofile.txt 2>> error.log # 删除不存在的文件,错误信息追加到 error.log
- 标准错误的文件描述符是
-
标准输入重定向(
<
):- 将文件内容作为命令的标准输入(替代键盘输入)。示例:用
cat
读取文件(等价于cat file.txt
):
bash
cat < file.txt
- 将文件内容作为命令的标准输入(替代键盘输入)。示例:用
2. 函数
将重复执行的代码封装为函数,提高脚本复用性,语法:
bash
# 定义函数
函数名() {# 函数体命令(可接收参数,用 $1、$2 等获取)# return 退出状态码(可选,默认返回最后一条命令的状态码)
}# 调用函数
函数名 [参数1 参数2 ...]
示例:定义 “计算两数之和” 的函数
bash
add() {sum=$(( $1 + $2 ))echo "两数之和:$sum"
}# 调用函数,传入 3 和 5
add 3 5 # 输出:两数之和:8
五、常用技巧与注意事项
- 命令补全:按
Tab
键自动补全命令、文件 / 目录名(按两次Tab
显示所有候选)。 - 命令历史:按
↑
/↓
键查看历史命令;history
命令查看所有历史记录;!n
执行第n
条历史命令(如!100
执行第 100 条)。 - 注释规范:脚本中用
#
写注释,说明脚本功能、参数含义、关键逻辑,提高可读性。 - 空格注意:
- 变量定义:
name=Alice
(等号前后无空格),错误写法:name = Alice
。 - 条件判断:
[ $i -le 5 ]
([
后、]
前必须有空格),错误写法:[$i -le 5]
。
- 变量定义:
- 引号使用:
- 双引号(
"
):保留变量值(如"$name"
会解析为变量内容),但忽略特殊符号(如*
、?
)。 - 单引号(
'
):完全原样输出(不解析变量、特殊符号,如'$name'
输出$name
)。
- 双引号(
- 安全提示:
rm -rf /
是危险命令(递归强制删除根目录所有文件),绝对禁止执行;删除文件前建议用ls
确认路径。