云计算百科
云计算领域专业知识百科平台

Linux的Shell编程、变量、用户与组管理、命令替换实战

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终端
加载文件顺序(从上往下,后面覆盖前面)

  • /etc/profile 全局配置
  • ~/.bash_profile 用户个人配置
  • ~/.bashrc
  • /etc/bashrc
  • nologin shell 非登录式shell

    不需要账号密码,比如直接bash开启子终端
    加载文件顺序

  • ~/.bashrc
  • /etc/bashrc
  • 判断当前是登录/非登录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

    字段说明:

  • name:登录用户名
  • password:密码占位符x,真正密文存放在/etc/shadow
  • UID:用户ID
  • GID:主组ID
  • GECOS:用户描述信息
  • directory:家目录
  • shell:登录shell程序
  • 新用户家目录的初始化文件复制自 /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::

    字段含义:

  • 登录用户名
  • 加密密码串
  • 上次改密码时间戳
  • -m 最小密码有效期,n天内不能改密码,0代表随时修改
  • -M 最大密码有效期,n天后必须改密码
  • -W 过期告警天数
  • -I 密码宽限天数,过期后还能登录的缓冲时间
  • 账号过期时间
  • 保留字段
  • # 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:

    组区分

  • 主组:每个用户仅有1个主组,新建文件默认归属主组。
  • 附加组(补充组):用户可以拥有多个附加组。
  • 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 # 删除附加组成员

    三、命令替换

    将命令执行输出,提取出来当做字符串使用。
    两种写法:

  • $(command) 推荐写法
  • `command` 反引号写法
  • # $()
    echo "今天日期:$(date)"

    # 反引号
    echo "今天日期:"`date`

    命令替换 vs 变量替换

    类型语法作用
    命令替换 $(cmd) 执行命令,获取命令输出结果
    变量替换 ${var} 读取变量值,不会执行任何命令

    #命令替换
    var=$(hostname)

    #变量替换
    var=abc
    echo ${var}

    引号的作用(面试高频)

    # 单引号:原样输出,不解析任何替换
    echo '$(date)'

    # 双引号:允许解析命令替换、变量替换
    echo "$(date)"

    总结:

    • 单引号 ' ':所见即所得,原样输出;
    • 双引号 " ":解析变量、$()命令替换。

    避坑总结

  • shell变量赋值等号两边不能有空格;export才可以让子shell继承变量。
  • usermod -G直接覆盖附加组,追加成员必须用‑aG。
  • usermod -p接收密文,不要直接填明文密码,会造成账号无法登录。
  • groupmems只管理附加组,对用户主组无效。
  • 单引号关闭解析,双引号允许$()命令替换、变量解析。
  • login shell和nologin shell读取配置文件顺序不同,写永久环境变量要注意。
  • 学习笔记小结【面试速记】

  • 普通变量只当前shell有效;export导出成环境变量,子shell继承。
  • /etc/passwd存用户基础信息;/etc/shadow存储加密密码,权限严格。
  • 用户添加附加组:usermod -aG 组名 用户名,不要忘记‑a。
  • groupmems仅操作附加组成员,无法修改用户主组。
  • 命令替换优先用$(cmd),反引号嵌套可读性差;单引号原样输出,双引号解析替换。
  • 赞(0)
    未经允许不得转载:网硕互联帮助中心 » Linux的Shell编程、变量、用户与组管理、命令替换实战
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!