Linux Shell编程|变量、用户组管理、命令替换实战笔记(CentOS7)
摘要:本文从shell变量开始讲解,包含本地/环境变量、shell登录类型、用户与组管理、passwd/shadow配置文件、命令替换与引号规则。全部命令可直接复制执行,整理大量实验踩坑点与面试高频考点。
一、Shell编程‑变量赋值
变量保存在当前会话内存,终端退出之后变量自动销毁。
变量命名:只能由数字、字母、下划线组成,不能数字开头。
# 变量赋值,等号两边不能有空格
[zjx@localhost ~ 18:14:48]$ z=zhangjunxiang
# 读取变量
[zjx@localhost ~ 18:14:58]$ echo $z
zhangjunxiang
变量分类
普通(本地)变量
# 定义普通变量
z=zhangjunxiang
# 普通变量仅当前shell生效,子shell无法读取
bash # 开启子shell
echo $z # 输出为空
exit # 退出子shell
# 使用export将普通变量升级为环境变量,子shell可继承
export z
bash
echo $z # zhangjunxiang
exit
⚠️踩坑:不加export,子shell看不到本地变量。
环境变量
# 定义环境变量写法
export 变量名=值
系统自带环境变量(PATH、USER、HOSTNAME等)已在配置文件预先export,无需手动导出。
grep export /etc/profile
变量持久化 & shell登录类型
login shell 登录式shell
需要输入账号密码登录的bash终端
加载文件顺序(从上往下,后面覆盖前面)
nologin shell 非登录式shell
不需要账号密码,比如直接bash开启子终端
加载文件顺序
判断当前是登录/非登录shell
# -bash 代表login;bash代表nologin
[zjx@localhost ~ 18:54:18]$ echo $0
-bash
[zjx@localhost ~ 19:01:21]$ bash
[zjx@localhost ~ 19:01:23]$ echo $0
bash
💡面试考点:想要变量永久生效,需要写入对应配置文件;临时export只对当前会话生效。
二、用户和组管理
查看用户信息
# 查看用户uid、gid、附属组
id zjx
/etc/passwd 用户信息文件
保存登录用户基础信息,冒号分隔7个字段
#格式 name:password:UID:GID:GECOS:directory:shell
[zjx@localhost ~ 19:01:23]$ grep zjx /etc/passwd
zjx:x:1000:1000:zjx:/home/zjx:/bin/bash
字段说明:
新用户家目录的初始化文件复制自 /etc/skel。
用户管理命令 useradd / usermod / userdel
useradd 创建用户
# 默认创建用户
useradd zzz
# 指定参数创建用户
# -u 指定UID;-d 指定家目录;-g 指定主组;-c 描述;-s 指定shell
useradd -u 6666 -d /home/zjx1 -g wheel zjx1
usermod 修改用户属性
usermod -u 1234 zjx # 修改uid
usermod -g dev zjx # 修改主组
usermod -G docker zjx # 覆盖式设置附加组(会清空旧附加组!)
usermod -aG docker zjx # 追加附加组,推荐使用‑aG
usermod -c "测试账号" zjx # 修改注释信息
usermod -md /home/zjx2 zjx2 # -d修改家目录,‑m迁移原有数据
usermod -s /sbin/nologin zjx # 禁止用户登录shell
usermod -L zjx # 锁定用户密码,等价 passwd -l
usermod -U zjx # 解锁用户密码,等价 passwd -u
⚠️高频踩坑:usermod -G会覆盖全部附加组,追加一定要加‑a参数。
userdel 删除用户
userdel zjx1
# 默认不会删除家目录,如需连带家目录删除 userdel -r zjx1
/etc/shadow 用户密码文件
存储加密密码、密码有效期,共9个字段,仅root可读
grep zjx /etc/shadow
zjx:$6$jIxPcfC2$t15Qr85DL9m2ui.ZhUnKwMpkCxn488YcNZeJjv34GP.A2MgzSP5LN0LhZgWC.QoRo/6V0Gt6S0JcboMw9J9Tj/:20704:0:99999:5:10::
字段含义:
# chage 修改密码周期
chage -m 3 -M 60 -W 5 -I 7 zjx
⚠️大坑:usermod -p '123' zjx,-p后面需要填写密码密文,直接写明文会导致账号无法登录。
查看登录用户
whoami # 查看我是谁
who # 列出所有登录终端
w # who增强版,显示负载、CPU占用、执行命令
组管理 /etc/group
/etc/group:组配置文件,格式 组名:密码占位符:GID:附加组成员列表
grep wheel /etc/group
wheel:x:10:
组区分
groupadd 创建组
groupadd admin
groupadd admin –g 2000 # 指定GID创建
groupmod 修改组
groupmod -n newname oldname # 修改组名
groupmod -g 2006 admins # 修改GID
groupdel 删除组
groupdel 组名
注意:如果某个用户把该组作为主组,该组不能直接删除,需要先修改用户主组。
groupmems 管理附加组成员
groupmems只操作附加组成员,不处理用户主组。
groupmems -g test -l # 列出附加组成员
groupmems -g test -p # 清空全部附加组成员
groupmems -g test -a test2 # 添加附加组成员
groupmems -g test -d test2 # 删除附加组成员
三、命令替换
将命令执行输出,提取出来当做字符串使用。
两种写法:
# $()
echo "今天日期:$(date)"
# 反引号
echo "今天日期:"`date`
命令替换 vs 变量替换
| 命令替换 | $(cmd) | 执行命令,获取命令输出结果 |
| 变量替换 | ${var} | 读取变量值,不会执行任何命令 |
#命令替换
var=$(hostname)
#变量替换
var=abc
echo ${var}
引号的作用(面试高频)
# 单引号:原样输出,不解析任何替换
echo '$(date)'
# 双引号:允许解析命令替换、变量替换
echo "$(date)"
总结:
- 单引号 ' ':所见即所得,原样输出;
- 双引号 " ":解析变量、$()命令替换。
网硕互联帮助中心




评论前必须登录!
注册