CentOS7 课堂实操:Shell变量与用户组完整教程
前言
本篇完全根据7.17课堂笔记整理,全部命令采用 liuyifei@centos7 终端格式,分为两大核心板块:Shell变量全套实操、Linux用户与组管理,覆盖定义变量、环境变量、持久化配置、引号转义、用户/组增删改、密码时效、常见故障修复,命令可直接复制到CentOS7运行,配套课后练习巩固知识点。
一、Shell 基础变量实操
1. 变量定义、取值、基础操作
变量存储在当前终端内存,命名仅支持字母、数字、下划线,不能以数字开头,Shell无需声明数据类型。
liuyifei@centos7 ~ 16:15:01$ var1=key1
liuyifei@centos7 ~ 17:17:48$ echo $var1
key1
# 多变量演示
liuyifei@centos7 ~ 17:17:57$ first_name=yifei
liuyifei@centos7 ~ 17:20:04$ last_name=liu
liuyifei@centos7 ~ 17:20:14$ echo $last_name $first_name
liu yifei
# 双引号保留多个空格
liuyifei@centos7 ~ 17:20:40$ echo "$last_name $first_name"
liu yifei
# 变量拼接歧义问题
liuyifei@centos7 ~ 17:22:02$ echo $last_name_$first_name
yifei
# {} 大括号限定变量边界,解决拼接识别错误
liuyifei@centos7 ~ 17:23:55$ echo ${last_name}_${first_name}
liu_yifei
# 查看当前所有变量、函数
liuyifei@centos7 ~ 17:24:24$ set | grep first_name
first_name=yifei
# 销毁变量
liuyifei@centos7 ~ 17:25:59$ unset first_name
liuyifei@centos7 ~ 17:27:19$ echo $first_name
# declare 实现变量大小写转换
liuyifei@centos7 ~ 17:27:34$ declare -l name=LIUYIFEI
liuyifei@centos7 ~ 17:28:43$ echo $name
liuyifei
liuyifei@centos7 ~ 17:28:53$ declare -u name=liuyifei
liuyifei@centos7 ~ 17:29:14$ echo $name
LIUYIFEI
2. 常用系统环境变量详解
环境变量分为系统内置环境变量、用户自定义变量,控制Shell整体运行环境。
| EDITOR | 默认编辑器,visudo等工具读取该变量 |
| LANG | 系统语言编码,控制日期、报错中英文 |
| PATH | 命令检索路径,系统查找程序目录 |
| PS1 | 终端命令提示符样式 |
| HISTTIMEFORMAT | history命令显示时间格式 |
| HOME | 当前用户家目录 |
| USER | 当前登录用户名 |
| PWD | 当前所在工作目录 |
2.1 EDITOR 默认编辑器
# root执行,默认vi无语法高亮
[root@centos7 ~ 17:33:30]# visudo
# 临时指定vim为编辑器
[root@centos7 ~]# export EDITOR=/bin/vim
[root@centos7 ~]# visudo
# 单次临时生效,不改变全局环境
[root@centos7 ~]# EDITOR=/bin/vim visudo
2.2 LANG 语言切换
liuyifei@centos7 ~ 17:36:39$ date
2026年 07月 17日 星期五 17:37:04 CST
# 切换英文
liuyifei@centos7 ~ 17:37:04$ export LANG=en_US.utf8
liuyifei@centos7 ~ 17:37:30$ date
Fri Jul 17 17:37:33 CST 2026
# 切回中文
liuyifei@centos7 ~ 17:37:33$ export LANG=zh_CN.utf8
liuyifei@centos7 ~ 17:37:57$ date
2026年 07月 17日 星期五 17:38:00 CST
# 编码说明:en_US.utf8英文、zh_CN.utf8简体中文、zh_TW.utf8繁体中文
2.3 PATH 命令搜索路径
liuyifei@centos7 ~ 17:38:00$ echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
# 移动ls程序,PATH找不到命令
[root@centos7 ~]# mv /usr/bin/ls .
liuyifei@centos7 ~ 17:41:28$ ls
bash: ls: 未找到命令...
# 恢复原始PATH
[root@centos7 ~]# PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
# 追加/root目录到PATH
[root@centos7 ~]# export PATH=$PATH:/root
liuyifei@centos7 ~ 17:43:41$ ls
anaconda-ks.cfg initial-setup-ks.cfg ls
# 还原ls程序位置
[root@centos7 ~]# mv ./ls /usr/bin
2.4 PS1 自定义命令提示符
liuyifei@centos7 ~ 17:54:25$ echo $PS1
\\[\\e[1;31m\\]\\u\\[\\e[1;33m\\]@\\[\\e[0m\\]\\[\\e[92;1m\\]\\h \\[\\e[0m\\]\\[\\e[94m\\]\\W\\[\\e[m\\] \\[\\e[35m\\]\\t\\[\\e[m\\]$
# 简易修改提示符
liuyifei@centos7 ~ 17:54:34$ PS1='HELLO '
HELLO echo hello world
hello world
# 常用转义字符说明
\\h 主机短名 \\H完整主机 \\t 24小时时间 \\u用户名 \\w完整路径 \\W目录名 \\#普通用户$ root#
# 带时间提示符
liuyifei@centos7 ~$ PS1='[\\u@\\h \\W \\t]\\$ '
# 显示完整工作目录
liuyifei@centos7 ~$ PS1='[\\u@\\h \\w \\t]\\$ '
liuyifei@centos7 ~$ cd /usr/share/doc
liuyifei@centos7 /usr/share/doc 13:53:04$
# 彩色提示符永久配置(root写入全局)
[root@centos7 ~]# echo "PS1='[\\[\\e[91m\\]\\u\\[\\e[0m\\]\\[\\e[93m\\]@\\[\\e[0m\\]\\[\\e[92;1m\\]\\h\\[\\e[0m\\] \\[\\e[94m\\] \\W\\[\\e[0m\\] \\[\\e[35m\\]\\t\\[\\e[0m\\]]\\[\\e[93m\\]\\$\\[\\e[0m\\] '" >> /etc/bashrc
2.5 HISTTIMEFORMAT 历史命令时间
# 完整年月日时分秒
export HISTTIMEFORMAT="%F %T "
# 简洁月-日 时:分
export HISTTIMEFORMAT="%m-%d %H:%M "
liuyifei@centos7 ~$ history
3. 变量持久化(永久生效配置)
区分两种Shell登录模式,加载配置文件不同
# 全局配置英文语言,所有ssh登录生效
[root@centos7 ~ 14:28:15]# echo 'export LANG=en_US.utf8' >> /etc/profile
# ssh登录验证
liuyifei@centos7 ~ 14:29:48$ date
Sat Jul 18 14:30:23 CST 2026
# 全局配置默认编辑器,新开bash生效
[root@centos7 ~ 14:33:42]# echo 'export EDITOR=vim' >> /etc/bashrc
# 新开子shell验证
liuyifei@centos7 ~$ bash
liuyifei@centos7 ~$ echo $EDITOR
vim
4. 命令替换 $() 和 `` 反引号
作用:抓取命令输出结果,嵌入字符串、文件名
liuyifei@centos7 ~ 15:35:08$ echo Today is `date +%A`
Today is 星期六
liuyifei@centos7 ~ 15:35:20$ echo The time is $(date +%M) minutes past $(date +%l%p).
The time is 35 minutes past 3下午.
# 按日期创建文件,两种写法等价
liuyifei@centos7 ~ 15:35:45$ touch file-$(date +%Y%m%d)
liuyifei@centos7 ~$ touch file-`date +%Y%m%d`
liuyifei@centos7 ~ 15:36:10$ ls
file-20260717 file-20260718
# 算术展开 $[] 实现1~100求和
liuyifei@centos7 ~ 15:36:13$ echo $[1+2+3]
6
liuyifei@centos7 ~ 15:37:43$ echo {1..3}
1 2 3
liuyifei@centos7 ~ 15:39:21$ echo {1..3} | tr ' ' '+'
1+2+3
liuyifei@centos7 ~ 16:52:04$ echo $[ $(echo {1..100} | tr ' ' '+') ]
5050
5. 转义符与三种引号区别
liuyifei@centos7 ~ 16:52:32$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/liuyifei/.local/bin:/home/liuyifei/bin
# 转义$,原样输出
liuyifei@centos7 ~ 16:58:12$ echo \\$PATH
$PATH
username=liuyifei
# 不加引号,空格、特殊字符被shell拆分
liuyifei@centos7 ~ 16:59:43$ echo ******* Welcome $username to Linux Classroom On $(date +%F) ********
# 双引号保留空格,正常解析变量和命令
liuyifei@centos7 ~ 17:01:11$ echo "******** Welcome $username to On $(date +%F) ********"
# 双引号内\\可转义$,原样打印$符号
liuyifei@centos7 ~ 17:02:58$ echo "******** Welcome \\$username to m On \\$(date +%F) ********"
# 单引号完全不解析,全部原文输出
liuyifei@centos7 ~ 17:04:46$ echo '******** Welcome $username to Linux Classroom On $(date +%F) ********'
二、Linux 用户与组管理
1 用户分类
核心配置文件说明
/etc/passwd 用户基础信息
格式:用户名: x :UID:GID:描述:家目录:登录shell
示例:
liuyifei@centos7 ~$ grep liuyifei /etc/passwd
liuyifei:x:1000:1000::/home/liuyifei:/bin/bash
# 系统用户示例
liuyifei@centos7 ~$ grep postfix /etc/passwd
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
/etc/group 用户组信息
格式:组名: x :GID:附属用户列表
liuyifei@centos7 ~$ grep wheel /etc/group
wheel:x:10:laoma,liuyifei
/etc/shadow 加密密码文件
9段字段,存储加密密码、密码有效期、账户过期策略
主组 vs 附属补充组
- 主组:创建用户默认同名组,新建文件默认归属主组,passwd中GID标识
- 附属组:用户额外加入权限组,usermod -aG 添加,不加-a会覆盖原有附属组
liuyifei@centos7 ~$ id
uid=1000(liuyifei) gid=1000(liuyifei) groups=1000(liuyifei),10(wheel)
liuyifei@centos7 ~$ id -u liuyifei
1000
2 用户查看命令
# 查看当前登录账号
liuyifei@centos7 ~$ whoami
liuyifei
# 查看所有在线终端用户
liuyifei@centos7 ~$ who
# 查看在线用户+负载、进程
liuyifei@centos7 ~$ w
# 仅打印在线用户名
liuyifei@centos7 ~$ users
3 用户管理命令(root执行)
useradd 创建用户
# 最简创建用户user01
[root@centos7 ~]# useradd user01
liuyifei@centos7 ~$ grep user01 /etc/passwd
# 自定义UID、家目录、主组、登录shell
[root@centos7 ~]# useradd -u 8888 -d /opt/user02 -c "software manager" -g wheel -s /sbin/nologin user02
# 用户初始化模板目录 /etc/skel
liuyifei@centos7 ~$ ls -a /etc/skel
# 用户默认配置文件 /etc/login.defs
[root@centos7 ~]# vim /etc/login.defs
usermod 修改用户属性
# 修改UID、迁移家目录、更换登录shell
[root@centos7 ~]# usermod user02 -u 1008 -md /home/user02 -s /bin/bash
# 添加附属组,-a 追加不覆盖
[root@centos7 ~]# usermod -aG user01 user02
liuyifei@centos7 ~$ id user02
uid=1008(user02) gid=10(wheel) groups=10(wheel),1003(user01)
# -L 锁定密码 -U解锁
[root@centos7 ~]# usermod -L user02
[root@centos7 ~]# usermod -U user02
# 修改登录shell禁止登录
[root@centos7 ~]# usermod -s /sbin/nologin user02
userdel 删除用户
[root@centos7 ~]# useradd user03
[root@centos7 ~]# userdel user03
# 用户在线无法直接删除,慎用-f强制删除
[root@centos7 ~]# userdel -f user02
4 用户组管理命令
groupadd 创建组
[root@centos7 ~]# groupadd admin
# 指定GID创建组
[root@centos7 ~]# groupadd -g 2000 sysadmin
liuyifei@centos7 ~$ grep admin /etc/group
groupmod 修改组名、GID
[root@centos7 ~]# groupmod –new-name admins admin
[root@centos7 ~]# groupmod -g 2002 admins
groupdel 删除空组
[root@centos7 ~]# groupdel sysadmin
groupmems 管理组内成员
# 添加用户到组
[root@centos7 ~]# groupmems -g admins -a liuyifei
# 列出组内所有成员
[root@centos7 ~]# groupmems -g admins -l
# 删除组内成员
[root@centos7 ~]# groupmems -g admins -d liuyifei
# 清空所有组成员
[root@centos7 ~]# groupmems -g admins -p
5 密码时效管理 chage
# 查看用户完整密码策略
liuyifei@centos7 ~$ chage -l liuyifei
# 设置密码最大有效期100天
[root@centos7 ~]# chage -M 100 liuyifei
# 最小修改间隔10天
[root@centos7 ~]# chage -m 10 liuyifei
# 强制下次登录修改密码
[root@centos7 ~]# chage -d 0 liuyifei
# 设置账户过期日期
[root@centos7 ~]# chage -E 2026-07-18 liuyifei




