• shell变量


    变量

    变量简单的理解就是在shell脚本中存储变化的数据的载体

    • $+变量名等于取该变量的值
    • $+变量名与 $+{变量名}的区别在于后者可以截取变量值的一部分

    变量命名规则

    • 只能使用英文字母,数字和下划线,不能以数字开头

    在这里插入图片描述

    • 中间不能有空格

    在这里插入图片描述

    • 不能使用标点符号

    在这里插入图片描述

    • 不能使用bash关键字
    • 变量名尽量做到见名知义

    注意事项:
    (1)变量名区分大小写
    在这里插入图片描述

    (2)赋值号两边不能有空格
    在这里插入图片描述

    变量的定义

    (1)直接赋值给变量

    #变量名=字符串或数字等
    A=你好
    #变量名="字符串1 字符串2"
    B="HELLO 世界"
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    (2)命令执行结果赋值给变量

    #变量名=`命令`
    A=`date +%m`
    #变量名=$(命令)
    B=$(hostname)
    
    • 1
    • 2
    • 3
    • 4

    示例如下:
    在这里插入图片描述

    (3)交互式定义变量——read

    read [选项] 变量名
    
    • 1

    在这里插入图片描述

    • -p——用户可记忆put(放)
    read -p "请输入姓名" name
    
    • 1

    在这里插入图片描述

    • -n——用户可记忆number(数字)
    read -p "请输入id号(4位):" -n 4 id
    
    • 1

    在这里插入图片描述

    • -s——用户可记忆shadow(阴影)
    read -sp 请输入密码: passward
    
    • 1

    在这里插入图片描述

    • -t——用户可记忆为time(时间)
    #五秒后自动退出
    read -t 5 name
    
    • 1
    • 2

    在这里插入图片描述
    拓:交互式定义变量可使用输入重定向将文件中内容赋值给某一变量,示例如下:
    在这里插入图片描述
    (4)定义有类型的变量——declare

    declare [选项] 变量名=变量值
    
    • 1

    在这里插入图片描述

    • -i——用户可以记为int(整数类型)

    在这里插入图片描述

    • -r—— 用户可以记忆为readonly(只读);只读变量只能看不能改能删但不能使用unset删除

    在这里插入图片描述

    在这里插入图片描述

    • -x——等同于export
    declare -x A="HELLO WORLD"
    
    • 1

    在这里插入图片描述

    变量的删除

    unset 变量名
    
    • 1

    注:unset不止可以删除变量名还可以删除函数,格式如下:

    unset -f 函数名
    
    • 1

    变量分类

    该分类本质上来说依据的是变量的作用范围

    (1)本地变量

    本地变量是当前用户自定义的变量,在当前进程有效,其他进程及当前进程的子进程均无效

    在这里插入图片描述
    注:bash命令即在当前bash下再套一层bash即上面所说的当前进程的子进程

    (2)环境变量

    当前进程有效当前子进程有效(“传子不传父”)

    在这里插入图片描述
    注:

    • env——查看当前用户环境变量
    • set——查询当前用户所有变量(临时变量与环境变量)

    在这里插入图片描述
    注:上图仅展示部分

    • export 变量名=变量值——该命令意为将改变量临时设置为环境变量

    拓——环境变量永久生效的方法 如下:

    • 更改/etc/profile(需root用户)——对所有用户生效;该文件为系统每个用户设置环境信息,用户第一次登陆时该文件被执行,重启后永久生效,使用source可使当前bash以及子bash有效
    • 更改~/.bash_profile——对当前用户有效;当用户登陆时该文件只会被读取一次,故用户在开机状态下添加环境变量且不重启的情况下每次开一个shell都需要输入一次source读取该文件以获取更新内容

    在这里插入图片描述

    • 更改~/.bashrc或/etc/.bashrc(该方式不需要重启,etc下的同样需要root用户) —— ~/.bashrc当前用户每次执行shell被读取;/etc/.bashrc每一个运行bash shell用户执行该文件,当bash shell打开时,读取该文件

    在这里插入图片描述

    (3)全局变量

    所有用户与程序均可调用

    在这里插入图片描述
    此处我以$HOME为列简单说明,其他的用户自行思索:
    在这里插入图片描述

    (4)系统变量

    全局变量的一种,shell本身已经固定了它们的名字和作用

    在这里插入图片描述
    前几条命令示例如下:
    在这里插入图片描述

    • $$

    在这里插入图片描述

    • $!

    在这里插入图片描述
    注:&表示将该命令放到后台,将一个与用户有交互的命令放到后台是最糟糕的事情,此处仅作简单解释

    • !$

    在这里插入图片描述

    • 进一步理解source即.运行机制与其他几种运行机制
      有一个shell脚本如下:
      在这里插入图片描述
      使用source执行结果如下:
      在这里插入图片描述

    使用其他执行方式结果如下:
    在这里插入图片描述
    发现区别了吗?我运行同一脚本且两脚本中均有cd命令但一种方式运行出来没改变bash路径,一种方式却改变了bash路径,这就是下面的运行机制:
    (1)source与.方式——使用source执行shell脚本时不会创建子进程,在父进程中直接执行(“父亲亲力亲为”)
    在这里插入图片描述
    在这里插入图片描述
    (2)其他运行方式——会创建子进程,且子进程无法改变父进程属性,故cd失效(“父亲让儿子去做”,本质上来说它改了但他最后没了)
    在这里插入图片描述

    • 前台进程与后台进程

    (1) 前台进程可以理解为依托于bash,bash关闭后该进程消失,bash中运行的脚本或命令都是前台进程(父进程为当前bash的都可以理解为前台进程)
    (2)后台进程也叫守护进程不依托于bash,bash关闭后仍可运行,不需要与bash交互
    拓:将前台命令或脚本强制放到后台执行命令如下:

    命令/运行脚本命令 &
    
    • 1
    • $* 与 $@的区别

    前者把传递的参数看作一个整体中间空格隔开(不论几个都是一个),后者将其分开看待,只在for循环且 $* 与 $@ 在双引号下可以看出区别

    在这里插入图片描述

    • 反撇号(`)、" "、’ '区分

    (1)反撇号功能为命令替换——里面必须为命令
    在这里插入图片描述

    (2)单引号中使用 ${} 与 $无效——不论是啥都当成字符串
    在这里插入图片描述

    (3)双引号中可取变量值但仍允许解析转义符换行、不换行等——有特殊的特殊处理
    在这里插入图片描述

    • ${}截取

    在这里插入图片描述
    注:花括号中第一位代表要截取的变量;第二位代表从第几位开始截取(注意从0开始);第三位代表从第二位数开始截取几位

  • 相关阅读:
    第十三届蓝桥杯嵌入式省赛程序设计详细题解
    Redis 设计与实现
    javascript脚本书写的位置
    Python机器学习算法入门教程(第三部分)
    【C++】C / C++ 内存管理
    排列字母(蓝桥杯)
    【YOLO系列】YOLOv3
    JavaScript事件流:深入理解事件处理和传播机制
    Docker 常用命令
    QT之QChart的简介
  • 原文地址:https://blog.csdn.net/weixin_51371629/article/details/126445040