Shell 是 Linux 系统中的命令行解释器,是我们与计算机”对话”的重要工具。就像学习任何新语言一样,掌握 Shell 需要了解它的基本语法、常用命令和运行环境。
本文将介绍 Shell 的基础知识,包括:
- Shell 启动时如何加载配置文件
- 变量的定义和使用方法
- 命令历史和快捷操作技巧
- 常见的命令行扩展功能
无论你是第一次接触命令行,还是想系统性地复习 Shell 知识,这些内容都能帮助你更高效地使用终端.
配置文件
当我们打开终端使用 Shell 时,系统会自动读取一些配置文件来设置工作环境。这就像我们进入办公室时会打开灯、调整空调一样,Shell 也需要根据配置文件来准备一个舒适的工作环境。
这些配置文件主要分为两类:
登录时加载的配置
- 当你通过 SSH 登录或打开终端登录时,Shell 会读取:
/etc/profile
(全公司统一的办公环境设置)~/.bash_profile
或~/.profile
(你的个人办公桌布置)
- 当你通过 SSH 登录或打开终端登录时,Shell 会读取:
交互时加载的配置
- 当你打开新的终端窗口时,Shell 会读取:
/etc/bashrc
~/.bashrc
- 当你打开新的终端窗口时,Shell 会读取:
重要配置文件的用途:
/etc/profile
→ 全系统通用的环境设置~/.bash_profile
→ 你的个人登录设置~/.bashrc
→ 你的日常终端使用习惯~/.bash_logout
→ 退出登录时自动执行的清理工作
小贴士:
- 修改配置文件后,可以运行
source ~/.bashrc
立即生效 - 个人配置文件通常在你的家目录下,文件名以点开头(隐藏文件)
- 不同 Linux 发行版可能有些文件名差异,比如有的用
.profile
而不是.bash_profile
Shell 可以分为两种主要类型:
登录 Shell(Login Shell)
交互式 Shell(Interactive Shell)
查看 Shell
Shell 有很多种类,比如 bash、sh、csh、ksh 等,不同的 shell 有不同的特点,但它们都可以作为 linux 系统的 shell。
1 |
|
SHELL 变量
变量的类型
系统变量
由系统创建和维护,如:PS1
,PATH
,HISTSIZE
,HOME
,HOSTNAME
,IFS
,PWD
,SHELL
, 可修改系统变量配置 shell 的样式查看所有系统变量
env
或printenv
用户自定义变量
由用户创建的变量
定义变量
语法规则:变量名=变量值,变量名和变量值之间不能有空格
1 |
|
区分大小写
1 |
|
打印变量值
可以用 $
符号来引用变量,也可以用 ${}
来引用变量,打印变量的命令有:echo
、printf
1 |
|
echo
默认不支持转义符
1 |
|
变量运算
默认变量值都是字符串类型,如果需要使用数值计算,需要使用let
命令
1 |
|
命令替换
命令替换可以将命令输出内容赋值给变量,非常有用!
语法:使用反引号或$()
包裹命令
不同于其他高级语言,函数会返回各种类型的值,shell 函数通常只返回 0 或 1 表示成功或失败,返回值是函数的退出状态码, 0 表示成功,非 0 表示失败。
如果要返回其他内容,就需要用echo
命令输出,然后赋值给变量。
1 |
|
命令替换支持嵌套
1 |
|
读取用户输入
读取用户输入的内容赋值给变量
1 |
|
导出变量
在交互式 Shell 下运行 shell 脚本时,系统会为该脚本创建子 shell,脚本执行完毕,子 shell 终止,环境返回到执行该脚本前的 shell;
用户自定义的变量只在当前 shell 脚本可用,要使它能被子 shell 访问,则要用 export
命令将变量导出
语法: export [-fnp] [变量名/函数名]=[值]
可通过系统变量
SHLVL
查看当前 shell 嵌套层数
父脚本 main.sh
1 |
|
子脚本 child.sh
1 |
|
删除变量
语法: unset [-fv] var_name
1 |
|
检测变量是否存在
${var_name?[message]}
检测变量是否存在,如果不存在则输出 message 并退出${var_name:?message}
检测变量是否存在并且不为空,如果不存在则输出 message 并退出${var_name:-default}
检测变量是否存在,如果不存在则输出 default 值
1 |
|
历史命令
历史命令保存在 ~/.bash_history
,$HISTSIZE
环境变量设置来历史命令缓冲区的大小
常见用法:
history
- 显示所有历史命令列表history 10
- 显示最后 10 条历史命令history -c
- 清空当前会话的历史记录history -d 123
- 删除第 123 条历史记录history -a
- 将当前会话的历史记录追加到历史文件中history -w
- 将当前历史记录写入历史文件并覆盖原有内容
快捷操作:
ctrl + r
搜索历史命令!!
执行上一条命令!序号
执行指定序号的历史命令!keyword
搜索以 keyword 开头的命令 并执行!?keyword
搜索匹配 keyword 的命令 并执行$_
上条命令的最后参数
Shell 中的扩展
大括号扩展
1 |
|
大括号扩展新语法 bash4.0
{<start>..<end>..<inc>}
1 |
|
波浪号扩展
1 |
|
文件名扩展
*
匹配任意个字符?
匹配任意单个字符[..]
匹配方括号内的任意字符 同正则 表示字符集
1 |
|
别名
创建别名
1 |
|
查看别名
1 |
|
~/.bashrc
中新建自己的别名,保存后,重新打开 bash 才生效
别名和内置命令同名时,内置命令被屏蔽
1 |
|
删除别名
1 |
|
修改命令行提示符
修改 PS1
环境变量
1 |
|
设置 shell 选项
用 set
和 shopt
控制 bash 的行为
1 |
|