CentOS 7 Linux入门实战:从帮助系统到Shell变量完整指南

本文环境: CentOS 7.x,所有命令均已实测可直接复制执行。建议打开终端跟着敲一遍,动手才是学Linux的最快方式。

前言:为什么要学好Linux基础?

做云计算、运维、开发都绕不开Linux。很多人刚接触时觉得命令记不住、报错看不懂,核心原因是没有掌握「自助学习」的方法。本文从如何查帮助开始,一步步带你掌握 vim 编辑器、IO 重定向、Shell 变量这四大基础技能,学完就能看懂大部分 Linux 脚本。

本文重构后的学习路线:

  1. 帮助系统:man / help / which / whereis — 遇到不会的命令先查文档
  2. vim编辑器:三种模式 + 常用快捷键 + 个性化配置
  3. 输入输出重定向:标准流 / 管道 / tee — 命令组合的核心
  4. Shell变量基础:普通变量 / 环境变量 / 持久化 / 命令替换

第一章 Linux中获取帮助:四种自助查文档的方式

学Linux第一件事不是背命令,而是学会查帮助。CentOS 7 提供了四层帮助体系,从简到繁按需使用。

1.1 man 手册 — 最权威的命令说明书

man 是 manual 的缩写,几乎所有命令都自带 man 手册,是最权威的参考文档。

基本用法
# 查看 ls 命令的 man 手册
man ls

执行后进入手册阅读界面,常用操作:

  • 空格 / PageDown:向下翻一页
  • PageUp / b:向上翻一页
  • /关键词:向下搜索(比如 / -l 搜索 -l 参数)
  • n:跳到下一个搜索结果
  • N:跳到上一个搜索结果
  • q:退出 man 手册
man 手册的九大章节
章节号 内容类型 举例
1 用户命令(最常用) ls, cd, cat
2 系统调用 open, write
3 库函数 printf, malloc
4 设备文件 /dev 下的文件说明
5 配置文件格式 passwd, hosts
6 游戏 -
7 杂项(协议、规范) tcp, ascii
8 系统管理命令 ifconfig, systemctl
9 内核相关 -
实战:指定章节查手册
# 查看第5章的 passwd(配置文件格式说明)
man 5 passwd
# 查看 man 命令本身的帮助
man man
# 只看命令简介(一行说明)
whatis ls
# 输出:ls (1)               - list directory contents

1.2 help 命令 — Shell 内置命令专属帮助

不是所有命令都有 man 手册。Shell 自带的内置命令(比如 cd、echo、export)要用 help 查看。

# 查看 cd 命令的帮助
help cd
# 查看所有 Shell 内置命令列表
help
# 或者
compgen -b

怎么区分是内置命令还是外部命令?type 命令名 判断:

type cd
# 输出:cd is a shell builtin  → 内置命令,用 help

type ls
# 输出:ls is aliased to `ls --color=auto'  → 外部命令,用 man

1.3 which 与 whereis — 快速定位命令位置

which:找可执行文件路径

只搜索 PATH 环境变量里的目录,告诉你命令实际在哪。

# 查找 ls 命令的位置
which ls
# 输出:/usr/bin/ls
# 查找所有匹配项(比如有多个版本的 python)
which -a python
whereis:更全面的定位

同时查找二进制文件、源码、man 手册页三个位置。

# 查找 ls 的相关文件
whereis ls
# 输出:ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
# 只找二进制文件
whereis -b ls
# 只找 man 手册
whereis -m ls

1.4 /usr/share/doc — 软件的详细文档目录

每个安装的软件几乎都会在 /usr/share/doc/ 下放一份完整文档,包含 README、配置示例、变更日志等。

# 查看文档目录里有什么
ls /usr/share/doc/ | head -20
# 查看 openssh 的 README
cat /usr/share/doc/openssh-*/README

本章小结:查帮助优先级

  • 记不住参数 → man 命令 / help 命令
  • 找不到命令在哪 → which 命令 / whereis 命令
  • 想看软件完整说明 → /usr/share/doc/软件名/

第二章 vim 编辑器:运维必备的文本编辑神器

vim 是 vi 的增强版,CentOS 7 默认安装。服务器上没有图形界面时,vim 就是你改配置、写脚本的主力工具。

2.1 vim 的三种模式

vim 最核心的概念就是模式切换,新手90%的困惑都来自没搞清楚当前在什么模式。

模式 进入方式 能做什么
一般模式(命令模式) 打开 vim 默认进入,其他模式按 Esc 返回 移动光标、复制粘贴、删除、查找替换
编辑模式(插入模式) 一般模式按 i / a / o 等键进入 像普通编辑器一样打字输入
命令行模式(底行模式) 一般模式按 : 进入 保存、退出、查找替换、设置选项

⚠️ 新手铁律: 不知道自己在什么模式时,连按几下 Esc 回到一般模式,再继续操作。

2.2 模式切换实战演练

# 第一步:用 vim 新建一个文件
vim test.txt

打开后默认处于一般模式,按 i 进入编辑模式(左下角会显示 – INSERT --),输入以下内容:

hello world
this is my first vim file
line 3
line 4
line 5

输入完按 Esc 回到一般模式,再按 :wq 保存退出(w=write 保存,q=quit 退出)。

常用的底行命令(命令行模式)
命令 作用
:w 保存不退出
:q 退出(没修改时可用)
:wq / ZZ 保存并退出
:q! 强制退出不保存
:wq! 强制保存退出(只读文件 root 可用)
:set nu 显示行号
:set nonu 取消行号
:n 跳到第 n 行,比如 :5 跳到第5行

2.3 一般模式常用快捷键

光标移动
按键 作用
0 / Home 跳到行首
$ / End 跳到行尾
gg 跳到文件第一行
G 跳到文件最后一行
nG 跳到第 n 行,比如 5G 到第5行
Ctrl + f 向下翻一页
Ctrl + b 向上翻一页
删除、复制、粘贴
按键 作用
x 删除光标后一个字符(相当于 Del)
X 删除光标前一个字符(相当于 Backspace)
dd 删除(剪切)整行
ndd 删除光标向下 n 行,比如 3dd 删除3行
yy 复制整行
nyy 复制光标向下 n 行
p 粘贴到光标下一行
P 粘贴到光标上一行
u 撤销上一步(undo)
Ctrl + r 重做(redo)
. 重复上一个操作(超级好用!)
查找替换
# 向下查找关键词 word(在一般模式直接按 / )
/word
# 按 n 找下一个,N 找上一个
# 全文替换 old 为 new(命令行模式)
:%s/old/new/g
# % 表示全文,g 表示一行内全部替换
# 替换第 1 到 5 行的 old 为 new,逐个确认
:1,5s/old/new/gc
# c 表示 confirm,每次替换前询问

2.4 vim 配置文件 .vimrc — 打造你的专属编辑器

每次打开 vim 都要 :set nu 很麻烦,把常用配置写到 ~/.vimrc 里,打开自动生效。

# 创建个人 vim 配置文件
vim ~/.vimrc

写入以下常用配置:

" 显示行号
set number

" 高亮当前行
set cursorline

" 自动缩进
set autoindent
set smartindent

" Tab 键占 4 个空格
set tabstop=4
set shiftwidth=4

" 将 Tab 自动转换为空格
set expandtab

" 显示括号匹配
set showmatch

" 搜索结果高亮
set hlsearch
set incsearch

" 显示状态栏(默认 1 行,2 表示总是显示)
set laststatus=2

" 编码设置
set encoding=utf-8

" 语法高亮
syntax on

保存退出后,下次打开 vim 就自动生效了。想立即生效可以在 vim 里执行:

:source ~/.vimrc

vim 学习建议: 不用一次背完所有快捷键。先掌握 i / Esc / :wq / dd / yy / p / u 这几个最常用的,每天用一点,一周就能形成肌肉记忆。


第三章 Linux 输入输出重定向:命令组合的灵魂

Linux 的设计哲学是「每个工具只做一件事,并做到最好」。把多个小工具串起来靠的就是重定向管道

3.1 三个标准流

Linux 中一切皆文件,每个程序运行时默认打开 3 个文件描述符:

名称 文件描述符 默认去向 说明
标准输入 stdin 0 键盘 程序从这里读取数据
标准输出 stdout 1 屏幕(终端) 程序正常结果输出到这里
标准错误 stderr 2 屏幕(终端) 程序报错信息输出到这里

💡 关键理解: stdout 和 stderr 是两条独立的流。正常输出走 1 号,报错走 2 号。重定向默认只改 stdout,不会带走 stderr。

3.2 标准输出重定向到文件

> 覆盖写入

把命令的输出写入文件,文件不存在就创建,已存在就覆盖

# 把 ls 的结果写到 list.txt 中(覆盖)
ls -l /etc/ > list.txt
cat list.txt
# 连续覆盖,文件只剩最后一次的内容
echo "first line" > test.txt
echo "second line" > test.txt
cat test.txt
# 输出:second line (第一行被覆盖了)
>> 追加写入

把输出追加到文件末尾,不会覆盖原有内容。

# 追加内容到文件末尾
echo "line 1" >> test.txt
echo "line 2" >> test.txt
echo "line 3" >> test.txt
cat test.txt
# 三行都在

3.3 标准错误重定向

报错信息默认也打印到屏幕,但它走的是 2 号流,要用 2> 单独重定向。

# 故意执行一个不存在的命令,把错误信息写到 err.log
ls /not_exist_dir 2> err.log
cat err.log
# 输出:ls: cannot access /not_exist_dir: No such file or directory
# 正常输出和错误分开保存
ls /etc/ /not_exist 1> ok.log 2> err.log
# 正确的目录列表进 ok.log,报错进 err.log
2>&1 — 把错误也合并到标准输出

最常用写法:让正常输出和错误输出都进同一个文件。

# 所有输出(包括报错)都写入 all.log
ls /etc/ /not_exist > all.log 2>&1
# 或者等价写法(bash 4+ 支持)
ls /etc/ /not_exist &> all.log

⚠️ 顺序很重要! 2>&1 必须写在 > 文件后面。意思是「把 2 号流指向 1 号流当前指向的地方」。写反了不会生效。

/dev/null — 黑洞文件

不想看到输出,也不想存文件,就丢进 /dev/null,写进去的内容会直接消失。

# 屏蔽所有错误信息,只看正常输出
ls /etc/ /not_exist 2> /dev/null
# 什么都不输出(静默执行)
ls /etc/ &> /dev/null
echo $?   # 只看执行是否成功(0=成功,非0=失败)

3.4 管道符 | — 把前一个命令的输出传给后一个命令

管道是 Linux 最强大的特性之一,左边命令的 stdout 直接作为右边命令的 stdin。

# 分页查看 /etc 目录内容
ls -l /etc/ | less
# 统计 /etc 下有多少个文件
ls /etc/ | wc -l
# 过滤出包含 root 的行
cat /etc/passwd | grep root
# 多级管道串联:找出占用 CPU 最高的 5 个进程
ps aux | sort -rn -k 3 | head -5

3.5 tee 命令 — 一边显示一边保存

重定向会把输出全写进文件,屏幕上就看不到了。tee 相当于「三通」:数据既流到屏幕,也流到文件。

# 既显示在屏幕,又保存到文件
ls -l /etc/ | tee etc_list.txt
# 追加模式(不覆盖)
echo "new line" | tee -a test.txt

💡 tee 的典型场景: 写脚本时既想在控制台看到日志,又想同时保存到日志文件,就用 command 2>&1 | tee log.txt

3.6 标准输入重定向

< 从文件读取输入

让命令从文件读取内容,而不是等待键盘输入。

# 用 cat 读取文件内容(和直接 cat 文件名效果一样)
cat < /etc/passwd
# 统计文件行数(两种写法等价)
wc -l < /etc/passwd
wc -l /etc/passwd
<< 立即文档(Here Document)

在脚本里一次性输入多行内容非常好用。<< 结束标记 表示「接下来的多行都是输入,直到遇到结束标记为止」。

# 用 cat 配合 here document 生成一个文件
cat > myfile.txt << EOF
第一行内容
第二行内容
第三行内容
EOF

cat myfile.txt
# 给脚本发多条命令(比如用 mysql 批量执行 SQL)
# 示例:这里用 bc 计算器演示
bc << EOF
1 + 1
2 * 3
10 / 2
EOF

本章小结:重定向速查表

  • > 文件:stdout 覆盖写入文件
  • >> 文件:stdout 追加写入文件
  • 2> 文件:stderr 覆盖写入文件
  • > 文件 2>&1:stdout + stderr 都写入文件
  • |:左边 stdout → 右边 stdin(管道)
  • tee 文件:同时输出到屏幕和文件
  • < 文件:从文件读取 stdin
  • << EOF ... EOF:多行文本作为输入

第四章 Shell 基础变量:脚本编程的基石

Shell 变量是写脚本的基础。变量分两种:普通变量(只在当前 Shell 有效)和环境变量(会传给子进程)。

4.1 变量定义和查看

定义变量
# 定义一个普通变量
name="zhang san"
age=25

# 注意:等号两边不能有空格!
# 错误写法:name = "zhang san"  ← 会被当成命令执行
引用变量
# 用 $ 符号引用变量
echo $name
echo ${name}    # 推荐写法,边界清晰

echo "My name is $name, age $age"
# 输出:My name is zhang san, age 25
# 花括号的用处:区分变量名和后面的字符
fruit=apple
echo "I like ${fruit}s"   # 正确:I like apples
echo "I like $fruits"     # 错误:变量 fruits 不存在,输出空
查看变量
# 查看单个变量的值
echo $PATH
# 查看所有变量(包括普通变量和环境变量)
set | head -20
# 只看环境变量
env
# 或者
printenv
删除变量
# unset 删除变量
unset name
echo $name   # 输出为空

4.2 变量的作用范围

普通变量只在当前 Shell 有效,子进程(比如新开一个 bash、执行一个脚本)继承不到。要让子进程也能看到,必须用 export 导出为环境变量

# 实验:普通变量 vs 环境变量

# 定义普通变量
myvar="hello"

# 启动一个子 bash,看看能不能读到
bash -c 'echo $myvar'
# 输出:(空的,子进程看不到普通变量)

# export 导出为环境变量
export myvar

# 再试一次
bash -c 'echo $myvar'
# 输出:hello (子进程能看到了!)

4.3 常用环境变量详解

CentOS 7 默认有很多环境变量,下面是最常用的 5 个。

PATH — 命令搜索路径

你输入的命令,系统去哪找可执行文件?全靠 PATH。它是一堆目录用冒号 : 隔开的列表。

# 查看当前 PATH
echo $PATH
# 类似:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/.local/bin:/home/user/bin
# 把自己的脚本目录加入 PATH
export PATH=$PATH:/opt/my_script
# 这样 /opt/my_script 下的命令就能直接输名字运行了

💡 为什么 ./ 才能运行当前目录的脚本? 因为当前目录 . 不在 PATH 里,系统不会自动去当前目录找命令,必须写完整路径 ./脚本名。这是出于安全考虑。

LANG — 系统语言和字符集
# 查看当前语言设置
echo $LANG
# CentOS 7 默认:en_US.UTF-8
# 临时切换为中文(需要安装中文语言包)
export LANG=zh_CN.UTF-8
# 临时切回英文(遇到乱码时常用)
export LANG=en_US.UTF-8
PS1 — 命令提示符样式

你终端里 [root@localhost ~]# 这个提示符的格式就是 PS1 控制的。

# 查看当前提示符设置
echo $PS1
# 默认:[\u@\h \W]\$

常用转义符:

  • \u:当前用户名
  • \h:主机名(短)
  • \H:完整主机名
  • \w:完整工作目录
  • \W:当前目录名(只显示最后一级)
  • \$:root 显示 #,普通用户显示 $
  • \t:24小时制时间
# 自定义一个带时间的提示符
export PS1="[\u@\h \W \t]\$ "
# 效果类似:[root@localhost ~ 15:30:45]#
HISTTIMEFORMAT — 给历史命令加时间戳

默认 history 只显示命令,不显示什么时候执行的。设置这个变量就能看到时间。

# 设置历史命令时间格式
export HISTTIMEFORMAT="%F %T "

# 再看历史命令
history | tail -5
# 输出会变成:
#   100  2026-07-16 15:30:45 ls -l
#   101  2026-07-16 15:31:02 cd /etc
EDITOR — 默认编辑器

很多程序(比如 crontab -e、visudo)调用编辑器时会读这个变量。

# 设置默认编辑器为 vim
export EDITOR=vim

4.4 变量持久化保存

上面用 export 设置的变量都是临时的,关掉终端就没了。想永久生效要写到配置文件里。

配置文件的加载顺序
文件 作用范围 适用场景
/etc/profile 所有用户,全局生效 系统级环境变量
/etc/bashrc 所有用户,全局生效 bash 相关设置
~/.bash_profile 当前用户 用户登录时执行一次
~/.bashrc 当前用户 每次开新终端都执行

💡 经验法则: 个人用的变量、别名、PS1 样式写 ~/.bashrc;全局生效写 /etc/profile.d/ 下新建一个 .sh 文件(比直接改 /etc/profile 更安全)。

# 实战:让 HISTTIMEFORMAT 永久生效
echo 'export HISTTIMEFORMAT="%F %T "' >> ~/.bashrc

# 让配置立即生效(不用重新登录)
source ~/.bashrc
# 或者
. ~/.bashrc
# 实战:给所有用户加一个全局环境变量

# 新建脚本(推荐方式,不污染原文件)
echo 'export PATH=$PATH:/opt/app/bin' > /etc/profile.d/myapp.sh

# 登录后自动生效,立即生效执行:
source /etc/profile.d/myapp.sh

4.5 命令替换 — 把命令的输出存进变量

两种写法:$()(推荐)和反引号 `(旧写法)。

# 把当前日期存进变量
today=$(date +%Y-%m-%d)
echo $today
# 输出:2026-07-16
# 反引号写法(效果一样,不推荐嵌套)
today=`date +%Y-%m-%d`
echo $today
# 实用场景:带日期的备份文件名
backup_file="etc_backup_$(date +%Y%m%d).tar.gz"
echo $backup_file
# 输出:etc_backup_20260716.tar.gz
# 统计当前登录用户数并存入变量
user_count=$(who | wc -l)
echo "当前在线用户数:$user_count"

4.6 保留字符字面含义(转义与引号)

Shell 里很多字符有特殊含义($、*、?、空格、& 等)。想让它们变回普通字符,有三种方法。

反斜杠 \ — 转义单个字符
# 让 $ 失去变量含义,当普通美元符号用
echo "价格是 \$100"
# 输出:价格是 $100
单引号 ’ ’ — 强引用,里面所有字符都原样输出
# 单引号内变量不展开
name=tom
echo '我的名字是 $name'
# 输出:我的名字是 $name ($name 不会被替换)
双引号 " " — 弱引用,$、`、\ 仍然有特殊含义
# 双引号内变量会展开
name=tom
echo "我的名字是 $name"
# 输出:我的名字是 tom

引号选择口诀: 想让变量生效就用双引号,想完全原样输出就用单引号,只有一个特殊字符就用反斜杠转义。


总结:四大模块知识地图

模块 核心技能 常用命令
帮助系统 遇到问题自己查文档 man, help, which, whereis
vim 编辑器 无图形界面下编辑文件 vim, i, Esc, :wq, dd, yy, p
IO 重定向 命令组合与日志管理 >, >>, 2>&1,
Shell 变量 脚本编程基础 =, $, export, $(), source

🏁 学习建议: 这四块是 Linux 入门的地基。不要死记硬背,建议每个知识点都在 CentOS 7 终端里亲手敲 2-3 遍。接下来学 Shell 脚本、服务管理、用户权限时会反复用到这些基础,用多了自然就记住了。

更多推荐