zoukankan      html  css  js  c++  java
  • 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)等
  • 相关阅读:
    Asp.net2.0 中自定义过滤器对Response内容进行处理 dodo
    自动化测试工具 dodo
    TestDriven.NET 2.0——单元测试的好助手(转) dodo
    JS弹出窗口的运用与技巧 dodo
    ElasticSearch 简介 规格严格
    修改PostgreSQL字段长度导致cached plan must not change result type错误 规格严格
    Linux系统更改时区(转) 规格严格
    mvn编译“Cannot find matching toolchain definitions for the following toolchain types“报错解决方法 规格严格
    ElasticSearch 集群 & 数据备份 & 优化 规格严格
    Elasticsearch黑鸟教程22:索引模板的详细介绍 规格严格
  • 原文地址:https://www.cnblogs.com/shenjianping/p/14257481.html
Copyright © 2011-2022 走看看