shell 编程-变量


变量

  1. 局部变量
    局部变量就是指在某个Shell中生效的变量,对其他Shell来说无效,而且会随着当前Shell的消失而消失,局部变量的作用域被限定在声明它们的Shell中,可以使用local内建命令来“显式”的声明局部变量,但仅限于函数内使用。

    ronie@ronie-virtual-machine:~/Desktop$ a=1
    ronie@ronie-virtual-machine:~/Desktop$ echo $a
    1
    ronie@ronie-virtual-machine:~/Desktop$ local b=2
    bash: local: can only be used in a function
    ronie@ronie-virtual-machine:~/Desktop$ 
    
  2. 环境变量

    • 环境变量通常又称“全局变量”,以区别于局部变量。在Shell脚本中,变量默认就是全局的,无论在脚本的任何位置声明,但是为了让子Shell继承当前Shell的变量,则可以使用export内建命令将其导出为环境变量。环境变量可用在创建变量的Shell和从该Shell派生的任意子Shell或进程中(使用export内建命令将变量导出为环境变量),因此,环境变量通常又被称作全局变量。环境变量被创建时所处的Shell被称为父Shell,如果在父Shell中再创建一个Shell,则该Shell被称作子Shell。当子Shell产生时,它会继承父Shell的环境变量为自己所用,所以说环境变量可从父Shell传给子Shell。环境变量只能向下传递而不能向上传递。

      ronie@ronie-virtual-machine:~/Desktop$ a=1
      ronie@ronie-virtual-machine:~/Desktop$ bash  # 进入子shell
      ronie@ronie-virtual-machine:~/Desktop$ echo $a
      
      ronie@ronie-virtual-machine:~/Desktop$ exit  # 退出子shell
      exit
      ronie@ronie-virtual-machine:~/Desktop$ export a=1
      ronie@ronie-virtual-machine:~/Desktop$ bash
      ronie@ronie-virtual-machine:~/Desktop$ echo $a
      1
      ronie@ronie-virtual-machine:~/Desktop$ 
      
    • 预设环境变量

      • $BASH:Bash Shell的全路径。

        ronie@ronie-virtual-machine:~/Desktop$ echo $BASH
        /usr/bin/bash
      • $BASH_VERSION:Bash Shell的版本。

        ronie@ronie-virtual-machine:~/Desktop$ echo $BASH_VERSION
        5.1.16(1)-release
      • $CDPATH:用于快速进入某个目录。

        ronie@ronie-virtual-machine:~/Desktop$ CDPATH='/usr/local'
        ronie@ronie-virtual-machine:~/Desktop$ cd bin
        /usr/local/bin
        ronie@ronie-virtual-machine:/usr/local/bin$ 
      • $EUID:记录当前用户的UID。

        ronie@ronie-virtual-machine:~/Desktop$ echo $EUID
        1000
        
      • $FUNCNAME:在用户函数体内部,记录当前函数体的函数名。

        ronie@ronie-virtual-machine:~/Desktop$ vim bashLearn.sh
        #! /bin/bash
        
        ronie(){
        echo $FUNCNAME;
        }
        ronie
        ronie@ronie-virtual-machine:~/Desktop$ chmod +x bashLearn.sh 
        ronie@ronie-virtual-machine:~/Desktop$ ./bashLearn.sh 
        ronie
      • $HISTCMD:记录下一条命令在history命令中的编号。

        ronie@ronie-virtual-machine:~/Desktop$ history
        ......
        281  history
        ronie@ronie-virtual-machine:~/Desktop$ echo $HISTCMD
        282
        ronie@ronie-virtual-machine:~/Desktop$ 
        
      • $HISTFILE:记录history命令记录文件的位置。

        ronie@ronie-virtual-machine:~/Desktop$ echo $HISTFILE
        /home/ronie/.bash_history
        ronie@ronie-virtual-machine:~/Desktop$ 
      • $HISTFILESIZE:设置HISTFILE文件记录命令的行数。

        ronie@ronie-virtual-machine:~/Desktop$ echo $HISTFILESIZE
        2000
        ronie@ronie-virtual-machine:~/Desktop$ 
      • $HISTSIZE:Shell采用了命令缓冲区来记录所有已运行过的命令,在缓冲区满或退出Shell时才将缓冲区的记录写到HISTFILE文件中。缓冲区的大小使用HISTSIZE定义。

        ronie@ronie-virtual-machine:~/Desktop$ echo $HISTSIZE
        1000
        ronie@ronie-virtual-machine:~/Desktop$ 
      • $HOSTNAME:展示主机名。

        ronie@ronie-virtual-machine:~/Desktop$ echo $HOSTNAME
        ronie-virtual-machine
        ronie@ronie-virtual-machine:~/Desktop$ 
      • $HOSTTYPE:展示主机的架构

        ronie@ronie-virtual-machine:~/Desktop$ echo $HOSTTYPE
        x86_64
        ronie@ronie-virtual-machine:~/Desktop$
      • $MACHTYPE:主机类型的GNU标识,这种标识有统一的结构。一般来说是:主机架构-公司-系统-gnu

        ronie@ronie-virtual-machine:~/Desktop$ echo $MACHTYPE
        x86_64-pc-linux-gnu
        ronie@ronie-virtual-machine:~/Desktop$ 
      • $LANG:设置当前系统的语言环境

        ronie@ronie-virtual-machine:~/Desktop$ echo $LANG
        en_US.UTF-8
        ronie@ronie-virtual-machine:~/Desktop$ 
        
      • $PWD:记录当前目录。

        ronie@ronie-virtual-machine:~/Desktop$ echo $PWD
        /home/ronie/Desktop
        ronie@ronie-virtual-machine:~/Desktop$ 
        
      • $PATH:代表命令的搜索路径

        ronie@ronie-virtual-machine:~/Desktop$ echo $PATH
        /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
        ronie@ronie-virtual-machine:~/Desktop$ 
  3. 变量使用

    • 变量命名:Shell中的变量必须以字母或者下划线开头,后面可以跟数字、字母和下划线,变量长度没有限制。
    • 变量赋值

      ronie@ronie-virtual-machine:~/Desktop$ name=ronie  # 定义变量
      ronie@ronie-virtual-machine:~/Desktop$ echo $name 
      ronie
      ronie@ronie-virtual-machine:~/Desktop$ name='ronie'  # 可以加单引号或双引号
      ronie@ronie-virtual-machine:~/Desktop$ echo $name
      ronie
      ronie@ronie-virtual-machine:~/Desktop$ name=ronie ren  # 变量有空格加引号
      Command 'ren' not found, but there are 17 similar ones.
      ronie@ronie-virtual-machine:~/Desktop$ name='ronie ren'
      ronie@ronie-virtual-machine:~/Desktop$ echo $name
      ronie ren
      ronie@ronie-virtual-machine:~/Desktop$ name= 'ronie ren'  # 等号两边不要有空格
      ronie ren: command not found
      ronie@ronie-virtual-machine:~/Desktop$ 
    • 变量取值:
    ronie@ronie-virtual-machine:~/Desktop$ echo $name
    ronie ren
    ronie@ronie-virtual-machine:~/Desktop$ echo ${name}
    ronie ren
    ronie@ronie-virtual-machine:~/Desktop$ echo $namehello
    
    ronie@ronie-virtual-machine:~/Desktop$ echo ${name}hello
    ronie renhello
    ronie@ronie-virtual-machine:~/Desktop$ echo ${name} hello
    ronie ren hello
    ronie@ronie-virtual-machine:~/Desktop$ echo $name hello
    ronie ren hello
    ronie@ronie-virtual-machine:~/Desktop$ name2='$name'  # 单引号会阻止shell解析特殊字符$
    ronie@ronie-virtual-machine:~/Desktop$ echo $name2
    $name
    ronie@ronie-virtual-machine:~/Desktop$ name2="$name"
    ronie@ronie-virtual-machine:~/Desktop$ echo $name2
    ronie ren
    ronie@ronie-virtual-machine:~/Desktop$ name2=$name
    ronie@ronie-virtual-machine:~/Desktop$ echo $name2
    ronie ren
    • 取消变量:将变量从内存中释放
    ronie@ronie-virtual-machine:~/Desktop$ unset name2
    ronie@ronie-virtual-machine:~/Desktop$ echo $name2
    
    ronie@ronie-virtual-machine:~/Desktop$ 
  4. 特殊变量

    • 位置参数:Shell中还有一些预先定义的特殊只读变量,它们的值只有在脚本运行时才能确定。首先是“位置参数”,位置参数的命名简单直接,比如,脚本本身为$0,第一个参数为$1,第二个参数为$2,第三个为$3,以此类推。当位置参数的个数大于9时,需要用${}括起来标识。$#表示脚本参数的个数总和,$@或$*表示脚本的所有参数。

      #! /bin/bash
      
      echo "script name: "  $0;
      echo "args total: "  $#;
      echo "arg 1: "  $1;
      echo "arg 2: "  $2;
      echo "arg 3: "  $3;
      echo "arg 4: "  $4;
      echo "all args: "  $@;
      ronie@ronie-virtual-machine:~/Desktop$ ./bashLearn.sh a1 b2 c3 d4 e5
      script name:  ./bashLearn.sh
      args total:  5
      arg 1:  a1
      arg 2:  b2
      arg 3:  c3
      arg 4:  d4
      all args:  a1 b2 c3 d4 e5
    • 脚本或命令返回值:$?,$?永远是上一个命令的返回值,Linux中规定正常退出的命令和脚本应该以0作为其返回值,任何非0的返回值都表示命令未正确退出或未正常执行。

      ronie@ronie-virtual-machine:~/Desktop$ ronie
      ronie: command not found
      ronie@ronie-virtual-machine:~/Desktop$ echo $?  # 上一个命令的返回值为127
      127
      ronie@ronie-virtual-machine:~/Desktop$ 
  5. 变量作用域
    Shell变量的作用域是在本Shell内,属于本Shell的全局变量,也就是从定义该变量的地方开始到Shell结束,或到主动使用unset删除了该变量的地方为止。在变量的作用域内,该变量都是可见的,在函数内对变量也是可以访问、可修改的。

    #! /bin/bash
    v=100
    ronie(){
         v=200;
    }
    echo $v;
    ronie;
    echo $v;
    ~               
    ronie@ronie-virtual-machine:~/Desktop$ ./bashLearn.sh 
    100
    200
    ronie@ronie-virtual-machine:~/Desktop$ 
    

    用local指定其为只在函数内生效的“局部变量”,这样这些变量将只存在于局部的命名空间内,从而不会对全局变量有影响。

    #! /bin/bash
    v=100
    ronie(){
         local v=200;
    }
    echo $v;
    ronie;
    echo $v;
    ~                   
    ronie@ronie-virtual-machine:~/Desktop$ ./bashLearn.sh 
    100
    100

声明:Hello World|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - shell 编程-变量


我的朋友,理论是灰色的,而生活之树是常青的!