• Shell之环境变量、局部变量


    一、变量的类型

    变量可分为两类:

    • 环境变量(全局变量)
    • 局部变量

    环境变量又被称为全局变量,可以在创建的shell以及任意子进程shell中使用。局部变量只能在创建的shell脚本中使用。

    二、环境变量

    (一)内置环境变量

       环境变量用于定义Shell的运行环境,保证Shell命令的正确执行,Shell通过环境变量来确定登录的用户名、登录目录等。所有的环境变量都是系统的全局变量,可用于所有的子进程中。

      环境变量可以在命令行中设置,但用户退出后这些变量值也会随之丢失,所以最好在下面的文件或者目录中配置,每次用户登录都将会被初始化:

    • .bash_profile(用户家目录下)
    • /etc/profile
    • /etc/bashrc
    • /etc/profile.d

      环境变量可用在任意的Shell进程中,环境变量名一般大写,并且是已经使用export内置命令进行了导出。比如HOME、PATH、UID、USER等,在用户登陆之前已经本/bin/login程序设置好了。

    下面是常见的系统环境变量:

    变量名 含义
    HOME 家目录
    USER 登录的用户名
    HOSTNAME 主机名称

    ...

    更多详情请通过env命令查看:

    [root@localhost ~]# env
    XDG_SESSION_ID=1
    HOSTNAME=localhost.localdomain
    SHELL=/bin/bash
    TERM=xterm
    HISTSIZE=1000
    SSH_CLIENT=192.168.159.1 1503 22
    SSH_TTY=/dev/pts/0
    USER=root
    LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    MAIL=/var/spool/mail/root
    PWD=/root
    LANG=en_US.UTF-8
    HISTCONTROL=ignoredups
    HOME=/root
    SHLVL=2
    LOGNAME=root
    SSH_CONNECTION=192.168.159.1 1503 192.168.159.128 22
    LESSOPEN=||/usr/bin/lesspipe.sh %s
    XDG_RUNTIME_DIR=/run/user/0
    _=/usr/bin/env
    View Code

    (二)自定义环境变量

     如果设置想自己设置环境变量,有临时生效和永久生效两种:

    • 临时生效 (命令行通过name=value,export name)
    • 永久生效(在之前的配置文件中添加,如.bash_profile或者/etc/profile)

    1、临时生效

    [root@localhost ~]# NAME1="zhangsan"
    [root@localhost ~]# echo $NAME1
    zhangsan

    2、永久生效

    在.bash_profile或者/etc/profile文件中使用export导出变量,然后使用"."或者source命令使其生效。

    (三)显示与取消环境变量

    系统的内置的环境变量或者自定义的环境变量可以通过echo或者printf进行打印:

    [root@localhost ~]# echo $HOME
    /root
    [root@localhost ~]# echo $UID
    0
    [root@localhost ~]# echo $PWD
    /root
    [root@localhost ~]# printf "$USER
    "
    root

    对于有哪些变量使用env(上述已经说过)或者set命令:

    [root@localhost ~]# set
    BASH=/bin/bash
    BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
    BASH_ALIASES=()
    BASH_ARGC=()
    BASH_ARGV=()
    BASH_CMDS=()
    BASH_LINENO=()
    BASH_SOURCE=()
    BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
    BASH_VERSION='4.2.46(1)-release'
    COLUMNS=76
    DIRSTACK=()
    EUID=0
    GROUPS=()
    HISTCONTROL=ignoredups
    HISTFILE=/root/.bash_history
    HISTFILESIZE=1000
    HISTSIZE=1000
    HOME=/root
    HOSTNAME=localhost.localdomain
    HOSTTYPE=x86_64
    ID=0
    IFS=$' 	
    '
    LANG=en_US.UTF-8
    LESSOPEN='||/usr/bin/lesspipe.sh %s'
    LINES=16
    LOGNAME=root
    LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:'
    MACHTYPE=x86_64-redhat-linux-gnu
    MAIL=/var/spool/mail/root
    MAILCHECK=60
    NAME1=zhangsan
    OPTERR=1
    OPTIND=1
    OSTYPE=linux-gnu
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    PIPESTATUS=([0]="0")
    PPID=2011
    PROMPT_COMMAND='printf "33]0;%s@%s:%s07" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
    PS1='[u@h W]$ '
    PS2='> '
    PS4='+ '
    PWD=/root
    SHELL=/bin/bash
    SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
    SHLVL=2
    SSH_CLIENT='192.168.159.1 1503 22'
    SSH_CONNECTION='192.168.159.1 1503 192.168.159.128 22'
    SSH_TTY=/dev/pts/0
    TERM=xterm
    UID=0
    USER=root
    XDG_RUNTIME_DIR=/run/user/0
    XDG_SESSION_ID=1
    _='root
    '
    colors=/root/.dircolors
    View Code

    使用unset取消变量,不要随意使用,尤其是系统环境变量:

    [root@localhost ~]# echo $NAME1
    zhangsan
    [root@localhost ~]# unset NAME1
    [root@localhost ~]# echo $NAME1 #为空

    三、局部变量 

    局部变量的生命周期是当前的Shell脚本,如果启动另一个Shell进程或者退出当前Shell进程,变量就会丢失。

    (一)定义

    局部变量又三种定义方式:

    • name=value
    • name='value'
    • name="value"

    变量名一般以字母、数字、下划线组成,其中以字母开头。

    为了更好的说明上面定义的三种方式,即不加引号、加单引号、加双引号的区别,以下面的例子说明:

    a=192.168.159.128
    b='192.168.159.128'
    c="192.168.159.128"
    echo "a=$a"
    echo "b=$b"
    echo "c=${c}"

    上述a、b、c输出为:

    [root@localhost ~]# a=192.168.159.128
    [root@localhost ~]# b='192.168.159.128'
    [root@localhost ~]# c="192.168.159.128"
    [root@localhost ~]# echo "a=$a"
    a=192.168.159.128
    [root@localhost ~]# echo "b=$b"
    b=192.168.159.128
    [root@localhost ~]# echo "c=${c}"
    c=192.168.159.128

    在上面的基础上如果变成下面的例子:

    a=192.168.159.128-$a
    b='192.168.159.128-$a'
    c="192.168.159.128-$a"
    echo "a=$a"
    echo "b=$b"
    echo "c=${c}"

    a、b、c的输出有时什么呢?

    [root@localhost ~]# a=192.168.159.128-$a
    [root@localhost ~]# b='192.168.159.128-$a'
    [root@localhost ~]# c="192.168.159.128-$a"
    [root@localhost ~]# echo "a=$a"
    a=192.168.159.128-192.168.159.128
    [root@localhost ~]# echo "b=$b"
    b=192.168.159.128-$a
    [root@localhost ~]# echo "c=${c}"
    c=192.168.159.128-192.168.159.128

      从上面的例子中可以看出第一种定义a变量的方式(不带引号),内容一般为简单连续的数字、字符串等;第二种定义b变量的方式(单引号)所见即所得,内容原样输出;第三种定义c变量的方式(双引号),输出变量时引号中变量会经过解析后输出。

      所以,脚本中单纯的数字可以不使用引号,但是其它普通字符串尽量使用双引号。

    (二)单、双、不加引号实例

    [root@localhost ~]# echo today is date
    today is date
    [root@localhost ~]# echo 'today is date'
    today is date
    [root@localhost ~]# echo "today is date"
    today is date
    
    
    [root@localhost ~]# echo today is `date`
    today is Tue Jan 12 23:11:20 CST 2021
    [root@localhost ~]# echo 'today is `date`'
    today is `date`
    [root@localhost ~]# echo "today is `date`"
    today is Tue Jan 12 23:11:39 CST 2021
    
    
    [root@localhost ~]# echo today is $(date)
    today is Tue Jan 12 23:13:22 CST 2021
    [root@localhost ~]# echo 'today is $(date)'
    today is $(date)
    [root@localhost ~]# echo "today is $(date)"
    today is Tue Jan 12 23:13:00 CST 2021
    • 单引号中内容原样输出
    • 反引号中变量可以被解析
    • $()中变量可以被解析

    (三)总结

    1、自定义变量

    • 自定义纯数字变量的值可以不加任何引号
    • 一般情况,字符串使用双引号
    • 如果内容原样输出使用单引号

    2、变量命令规范

    • 变量名使用大写,比如:JAVA_HOME等
    • 变量名取得尽量有意义一些
    • 变量名使用括号()扩起来,比如:$(date)等
  • 相关阅读:
    编写一个程序的步骤
    vue实现瀑布流
    Vue 解决动态生成列表点击事件无效的问题
    筛选分类列表展示
    php实现类似慕课网,php中文网的分类功能
    在一个页面修改数据,并且ajax刷新数据列表的数据实现。
    记账小程序系统简单规划
    茶叶项目---产品的规格添加
    茶叶商城开发
    后端图片上传
  • 原文地址:https://www.cnblogs.com/shenjianping/p/14257481.html
Copyright © 2020-2023  润新知