Loading

【Shell】变量

Shell变量

变量用于存储管理临时的数据, 这些数据都是在运行内存中的

  • 变量类型

    • 系统环境变量

    • 自定义变量

    • 特殊符号变量

系统环境变量

是系统提供的共享变量是linux系统加载Shell的配置文件中定义的变量共享给所有的Shell程序使用

  • Shell的配置文件分类

    1. 全局配置文件
      /etc/profile
      /etc/profile.d/*.sh
      /etc/bashrc
    2. 个人配置文件
      当前用户/.bash_profile
      当前用户/.bashrc
      一般情况下,我们都是直接针对全局配置进行操作。
  • 环境变量分类

    在Linux系统中,环境变量按照其作用范围不同大致可以分为系统级环境变量用户级环境变量

    系统级环境变量:Shell环境加载全局配置文件中的变量共享给所有用户所有Shell程序使用, 全局共享

    用户级环境变量:Shell环境加载个人配置文件中的变量共享给当前用户的Shell程序使用, 登录用户使用

  • 查看系统变量

    • 查看当前Shell系统环境变量

      # 查看命令
      env
      
      image
    • 查看Shell变量(系统环境变量+自定义变量+函数)

      # 命令
      set
      
      image
  • 常用系统环境变量

    变量名称含义
    PATH与windows环境变量PATH功能一样,设置命令的搜索路径,以冒号为分割
    HOME当前用户主目录:/root
    SHELL当前shell解析器类型:/bin/bash
    HISTFILE显示当前用户执行命令的历史列表文件:/root/.bash_history
    PWD显示当前所在路径:/root
    OLDPWD显示之前的路径
    HOSTNAME显示当前主机名:itheima
    HOSTTYPE显示主机的架构,是i386、i686、还是x86、x64等:x86_64
    LANG设置当前系统语言环境:zh_CN.UTF-8
  • 环境变量输出演示

    image

    image

自定义变量

就是自己定义的变量

  • 自定义变量的分类

    1. 自定义局部变量

      就是定义在一个脚本文件中的变量, 只能在这个脚本文件中使用的变量, 就是局部变量

    2. 自定义常量
    3. 自定义全局变量
  • 自定义变量进行 增\删\改\查

    • 变量定义规则:

      1. 变量名称可以有字母,数字和下划线组成, 但是不能以数字开头
      2. 等号两侧不能有空格
      3. 在bash环境中, 变量的默认类型都是字符串类型, 无法直接进行数值运算
      4. 变量的值如果有空格, 必须使用双引号括起来
      5. 不能使用Shell的关键字作为变量名称
    • 定义变量和修改变量:

      # 定义语法
      var_name=value # 变量名=变量值
      

      image

    • 查询变量值(推荐使用${var_name}查询):

      # 语法1: 直接使用变量名查询
      $var_name
      # 语法2: 使用花括号
      ${var_name}
      # 区别: 花括号方式适合拼接字符串
      

      image

      注意:如果"My name is ${var2}Style"$var2 不带花括号, 系统会认为获取$var2Style 变量数据, 这个变量不存在就获取不到数据,执行效果如下

      image

    • 变量删除:

      # 语法
      unset var_name
      

      image

  • 自定义常量

    就是变量设置值以后不可以修改的变量叫常量, 也叫只读变量

    # 语法
    readonly var_name
    
    image
  • 自定义全局变量

    • 父子Shell环境介绍

      例如: 有2个Shell脚本文件 A.sh 和 B.sh
      如果 在A.sh脚本文件中执行了B.sh脚本文件, 那么A.sh就是父Shell环境, B.sh就是子Shell环境

    • 自定义全局变量介绍

      就是在当前脚本文件中定义全局变量, 这个全局变量可以在当前Shell环境与子Shell环境中都可以使用

      # 自定义全局变量语法
      export var_name1 var_name2 # 可以设置多个全局变量(定义好这个变量,在导出)
      或者
      export var_name1 var_name2=value # (导出的时候直接定义)
      
    • 全局变量在当前Shell环境与子Shell环境中可用, 父Shell环境中不可用

      • 创建2个脚本文件 demo2.sh 和 demo3.sh
        image
      • 编辑demo2.sh, 里面定义变量VAR4并设置为全局, 并里面执行demo3.sh脚本文件
        vim demo2.sh
        
        image
      • 编辑demo3.sh, 里面打印VAR4
        vim demo3.sh
        
        image
      • 执行脚本文件demo2.sh, 观察打印VAR4效果
        image
      • 执行脚本文件后, 在交互式Shell环境打印VAR4, 观察打印VAR4效果
        image

特殊变量

  • 常用的特殊符号变量:

    特殊变量含义
    $n获取输入参数的
    $0, 获取当前Shell脚本文件名字
    $1~$9, 获取第一个输入参数到第九个输入参数
    ${10} 获取10和10以上的参数需要使用花括号
    $#获取所有输入参数的个数
    $*$@获取所有输入参数数据
    区别: 如果不使用双引号, 功能一样,
    $*获取所有参数数据为一个字符串, 如果使用了双引号,
    $@获取的就是参数列表对象, 每个参数都是一个独立字符串,
    $?获取上一个命令的退出状态码, 一般;来说0代表命令成功, 非0代表执行失败
    $$获取当前shell环境进程的ID号
  • 特殊变量:$n

    • 语法:

      $n
      
    • 含义:

      1. 用于接收脚本文件执行时传入的参数
      2. $0 用于获取当前脚本文件名称的
      3. $1~$9, 代表获取第一输入参数到第9个输入参数
      4. 第10个以上的输入参数获取参数的格式: ${数字}, 否则无法获取
    • 执行脚本文件传入参数语法

      sh 脚本文件 输入参数1 输入参数2 ...
      
    • 案例

      创建脚本文件demo4.sh文件, 并在脚本文件内部执行打印脚本文件名字, 第一个输入参数, 第二个输入参数

      1. 创建脚本文件demo4.sh
        image

      2. 编辑demo4.sh文件, 输出脚本文件名称\第一个输入参数\第二个输入参数 \…
        image

      3. 执行demo4.sh文件,输入输出参数itcast itheima的2个输入参数, 观察效果
        image

        image

  • 特殊变量:$#

    • 语法:

      $#
      
    • 含义:

      获取所有输入参数的个数

    • 案例

      在demo4.sh中输出输入参数个数

      1. 编辑demo4.sh, 输出输入参数个数
        image

      2. 执行demo4.sh传入参数itcast, itheima
        image

  • 特殊变量:$n$@

    • 语法:

      $*
      $@
      # 含义都是获取所有输入参数, 用于以后输出所有参数
      
    • 含义

      都是获取所有输入参数, 用于以后输出所有参数

    • $*$@区别:

      1.不使用双引号括起来, 功能一样
        $*和$@获取所有输入参数,格式为: $1 $2 ... $n
      2.使用双引号括起来
        "$*"获取的所有参数拼接为一个字符串, 格式为: "$1 $2 ... $n",(但是不包括$0)
        "$@"获取一组参数列表对象, 格式为: "$1" "$2" ... "$n"
        使用循环打印所有输入参数可以看出区别
      
    • 案例

      在demo4.sh中循环打印输出所有输入参数, 体验$*$@的区别

      • 编辑demo4.sh文件
        #!/bin/bash
        # 增加命令: 实现直接输出所有输入后参数
        echo '使用$*直接输出:'$*
        echo '使用$@直接输出:'$@
        
        # 增加命令: 使用循环打印输出所有输入参数
        echo '循环遍历输出$*所有参数'
        for item in "$*"
        do
          echo $item
        done
        echo '循环遍历输出$@所有参数'
        for item in "$@"
        do
          echo $item
        done
        
      • 运行观察区别
        image
  • 特殊变量:$?

    • 语法:

      $?
      
    • 含义:

      • 用于获取上一个Shell命令的退出状态码, 或者是函数的返回值
        • 每个Shell命令的执行都有一个返回值, 这个返回值用于说明命令执行是否成功
        • 一般来说, 返回0代表命令执行成功, 非0代表执行失败
    • 演示:

      • 输入一个正确命令, 再输出$?
        image
      • 输入一个错误命令, 在输出$?
        image
  • 特殊变量:$$

    • 语法:

      $$
      
    • 含义:

      用于获取当前Shell环境的进程ID号

    • 演示:

      • 查看当前Shell环境进程编号
        ps -aux|grep bash # 抓取这个进程的id号
        ps -aux # 查看所有的进程信息
        grep # 抓取
        bash # 默认shell环境
        
        image
      • 输出 $ 显示当前shell环境进程编号
        image
posted @ 2023-02-08 23:57  爱learn  阅读(15)  评论(0编辑  收藏  举报