一文吃透 Shell 变量、用户与组管理(CentOS7 实战)
📅 2026/7/21 6:42:19
👁️ 阅读次数
📝 编程学习
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$var1key1# 多变量演示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_nameliu yifei# 双引号保留多个空格liuyifei@centos7 ~17:20:40$echo"$last_name$first_name"liu yifei# 变量拼接歧义问题liuyifei@centos7 ~17:22:02$echo$last_name_$first_nameyifei# {} 大括号限定变量边界,解决拼接识别错误liuyifei@centos7 ~17:23:55$echo${last_name}_${first_name}liu_yifei# 查看当前所有变量、函数liuyifei@centos7 ~17:24:24$set|grepfirst_namefirst_name=yifei# 销毁变量liuyifei@centos7 ~17:25:59$unsetfirst_name liuyifei@centos7 ~17:27:19$echo$first_name# declare 实现变量大小写转换liuyifei@centos7 ~17:27:34$declare-lname=LIUYIFEI liuyifei@centos7 ~17:28:43$echo$nameliuyifei liuyifei@centos7 ~17:28:53$declare-uname=liuyifei liuyifei@centos7 ~17:29:14$echo$nameLIUYIFEI2. 常用系统环境变量详解
环境变量分为系统内置环境变量、用户自定义变量,控制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 visudo2.2 LANG 语言切换
liuyifei@centos7 ~17:36:39$date2026年 07月17日 星期五17:37:04 CST# 切换英文liuyifei@centos7 ~17:37:04$exportLANG=en_US.utf8 liuyifei@centos7 ~17:37:30$dateFri Jul1717:37:33 CST2026# 切回中文liuyifei@centos7 ~17:37:33$exportLANG=zh_CN.utf8 liuyifei@centos7 ~17:37:57$date2026年 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$lsbash: 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:/rootliuyifei@centos7 ~17:43:41$lsanaconda-ks.cfg initial-setup-ks.cfgls# 还原ls程序位置[root@centos7 ~]# mv ./ls /usr/bin2.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 'HELLOechohello world hello world# 常用转义字符说明\h 主机短名\H完整主机\t24小时时间\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/doc13: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/bashrc2.5 HISTTIMEFORMAT 历史命令时间
# 完整年月日时分秒exportHISTTIMEFORMAT="%F %T "# 简洁月-日 时:分exportHISTTIMEFORMAT="%m-%d %H:%M "liuyifei@centos7 ~$history3. 变量持久化(永久生效配置)
区分两种Shell登录模式,加载配置文件不同
- login shell(ssh远程登录)加载顺序:
/etc/profile→ ~/.bash_profile → ~/.bashrc → /etc/bashrc - nologin shell(新开bash子窗口):~/.bashrc → /etc/bashrc
# 全局配置英文语言,所有ssh登录生效[root@centos7 ~14:28:15]# echo 'export LANG=en_US.utf8' >> /etc/profile# ssh登录验证liuyifei@centos7 ~14:29:48$dateSat Jul1814:30:23 CST2026# 全局配置默认编辑器,新开bash生效[root@centos7 ~14:33:42]# echo 'export EDITOR=vim' >> /etc/bashrc# 新开子shell验证liuyifei@centos7 ~$bashliuyifei@centos7 ~$echo$EDITORvim4. 命令替换 $() 和 `` 反引号
作用:抓取命令输出结果,嵌入字符串、文件名
liuyifei@centos7 ~15:35:08$echoToday is`date+%A`Today is 星期六 liuyifei@centos7 ~15:35:20$echoThetimeis$(date+%M)minutes past$(date+%l%p).Thetimeis35minutes past3下午.# 按日期创建文件,两种写法等价liuyifei@centos7 ~15:35:45$touchfile-$(date+%Y%m%d)liuyifei@centos7 ~$touchfile-`date+%Y%m%d`liuyifei@centos7 ~15:36:10$lsfile-20260717 file-20260718# 算术展开 $[] 实现1~100求和liuyifei@centos7 ~15:36:13$echo$[1+2+3]6liuyifei@centos7 ~15:37:43$echo{1..3}123liuyifei@centos7 ~15:39:21$echo{1..3}|tr' ''+'1+2+3 liuyifei@centos7 ~16:52:04$echo$[$(echo{1..100}|tr' ''+')]50505. 转义符与三种引号区别
\:转义单个特殊字符,取消$、通配符的特殊功能- 双引号
"":保留空格,解析变量、命令替换,通配符失效 - 单引号
'':所有内容原样输出,不解析任何变量、命令
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$PATHusername=liuyifei# 不加引号,空格、特殊字符被shell拆分liuyifei@centos7 ~16:59:43$echo******* Welcome$usernameto Linux Classroom On$(date+%F)********# 双引号保留空格,正常解析变量和命令liuyifei@centos7 ~17:01:11$echo"******** Welcome$usernameto On$(date+%F)********"# 双引号内\可转义$,原样打印$符号liuyifei@centos7 ~17:02:58$echo"******** Welcome \$usernameto m On \$(date+%F)********"# 单引号完全不解析,全部原文输出liuyifei@centos7 ~17:04:46$echo'******** Welcome $username to Linux Classroom On $(date +%F) ********'二、Linux 用户与组管理
1 用户分类
- root超级用户:UID=0,拥有系统全部权限
- 系统用户:后台服务进程使用,登录shell为
/sbin/nologin,禁止交互式登录 - 普通用户:日常登录操作账号
核心配置文件说明
/etc/passwd 用户基础信息
格式:用户名: x :UID:GID:描述:家目录:登录shell
示例:
liuyifei@centos7 ~$grepliuyifei /etc/passwd liuyifei:x:1000:1000::/home/liuyifei:/bin/bash# 系统用户示例liuyifei@centos7 ~$greppostfix /etc/passwd postfix:x:89:89::/var/spool/postfix:/sbin/nologin/etc/group 用户组信息
格式:组名: x :GID:附属用户列表
liuyifei@centos7 ~$grepwheel /etc/group wheel:x:10:laoma,liuyifei/etc/shadow 加密密码文件
9段字段,存储加密密码、密码有效期、账户过期策略
主组 vs 附属补充组
- 主组:创建用户默认同名组,新建文件默认归属主组,passwd中GID标识
- 附属组:用户额外加入权限组,
usermod -aG添加,不加-a会覆盖原有附属组
liuyifei@centos7 ~$iduid=1000(liuyifei)gid=1000(liuyifei)groups=1000(liuyifei),10(wheel)liuyifei@centos7 ~$id-uliuyifei10002 用户查看命令
# 查看当前登录账号liuyifei@centos7 ~$whoamiliuyifei# 查看所有在线终端用户liuyifei@centos7 ~$who# 查看在线用户+负载、进程liuyifei@centos7 ~$ w# 仅打印在线用户名liuyifei@centos7 ~$users3 用户管理命令(root执行)
useradd 创建用户
# 最简创建用户user01[root@centos7 ~]# useradd user01liuyifei@centos7 ~$grepuser01 /etc/passwd# 自定义UID、家目录、主组、登录shell[root@centos7 ~]# useradd -u 8888 -d /opt/user02 -c "software manager" -g wheel -s /sbin/nologin user02# 用户初始化模板目录 /etc/skelliuyifei@centos7 ~$ls-a/etc/skel# 用户默认配置文件 /etc/login.defs[root@centos7 ~]# vim /etc/login.defsusermod 修改用户属性
# 修改UID、迁移家目录、更换登录shell[root@centos7 ~]# usermod user02 -u 1008 -md /home/user02 -s /bin/bash# 添加附属组,-a 追加不覆盖[root@centos7 ~]# usermod -aG user01 user02liuyifei@centos7 ~$iduser02uid=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 user02userdel 删除用户
[root@centos7 ~]# useradd user03[root@centos7 ~]# userdel user03# 用户在线无法直接删除,慎用-f强制删除[root@centos7 ~]# userdel -f user024 用户组管理命令
groupadd 创建组
[root@centos7 ~]# groupadd admin# 指定GID创建组[root@centos7 ~]# groupadd -g 2000 sysadminliuyifei@centos7 ~$grepadmin /etc/groupgroupmod 修改组名、GID
[root@centos7 ~]# groupmod --new-name admins admin[root@centos7 ~]# groupmod -g 2002 adminsgroupdel 删除空组
[root@centos7 ~]# groupdel sysadmingroupmems 管理组内成员
# 添加用户到组[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 -p5 密码时效管理 chage
# 查看用户完整密码策略liuyifei@centos7 ~$ chage-lliuyifei# 设置密码最大有效期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
编程学习
技术分享
实战经验