• Shell中的变量


    一、什么是变量

    变量在 bash 环境中是非常重要的,简单的说,就是让某一个特定字符串来代表不固定的内容。举例:

    那就是:『 y = ax + b 』这东西,在等号左边的(y)就是变量,在等号右边的(ax+b)就是变量内容。 要注意的是,左边是未知数,右边是已知数

    二、变量的读取与使用规则:

    ①  使用echo命令读取变量

    语法规则:

    [root@www ~]# echo $variable
    
    例:

    [root@localhost ~]# echo $PATH
    /usr/java/jdk1.7.0_79/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
    [root@localhost ~]# echo $JAVA_HOME
    /usr/java/jdk1.7.0_79
    
    利用 echo 就能够读出,只是需要在变量名称前面加上 $ , 或者是以 ${变量} 的方式来使用都可以!
    ② 变量的使用规则

    1. 变量与变量内容以一个等号『=』来连结,如下所示:
      [root@localhost ~]# username=elgin
      [root@localhost ~]# echo $username
      elgin
      
    2. 等号两边不能直接接空格符,如下所示为错误:
      [root@localhost ~]# username= elgin
      bash: elgin: command not found
      
      [root@localhost ~]# username=elgin seth
      bash: seth: command not found
      
    3. 变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误:
      [root@localhost ~]# 2username=elgin
      bash: 2username=elgin: command not found
      
    4. 变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但
      • 双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
        [root@localhost ~]# var="lang is $LANG"
        [root@localhost ~]# echo $var
        lang is en_US.UTF-8
      • 单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
        [root@localhost ~]# var='lang is $LANG'
        [root@localhost ~]# echo $var
        lang is $LANG
        
    5. 可用跳脱字符『 』将特殊符号(如 [Enter], $, \, 空格符, '等)变成一般字符;

    6. 在一串命令中,还需要藉由其他的命令提供的信息,可以使用反单引号『`命令`』或 『$(命令)』。特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号! 例如想要取得核心版本的配置:
      『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』

    7. 若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容,如下所示:
      『PATH="$PATH":/home/bin』

    8. 若该变量需要在其他子程序运行,则需要以 export 来使变量变成环境变量
      『export PATH』

    9. 通常大写字符为系统默认变量,自行配置变量可以使用小写字符,方便判断 (纯粹依照使用者兴趣与嗜好) ;

    10. 取消变量的方法为使用 unset :『unset 变量名称』例如取消 var 的配置:
      [root@localhost ~]# echo $var
      lang is $LANG
      [root@localhost ~]# unset var
      [root@localhost ~]# echo $var
      
      [root@localhost ~]# 
      
    ③ 跟变量相关的几个命令:

    Ⅰ、用 env 观察环境变量与常见环境变量说明

    [root@localhost ~]# env
    HOSTNAME=localhost.localdomain
    SELINUX_ROLE_REQUESTED=
    SHELL=/bin/bash
    TERM=vt100
    HISTSIZE=1000
    SSH_CLIENT=192.168.108.1 64438 22
    SELINUX_USE_CURRENT_RANGE=
    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:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=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:*.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/java/jdk1.7.0_79/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
    MAIL=/var/spool/mail/root
    PWD=/root
    JAVA_HOME=/usr/java/jdk1.7.0_79
    LANG=en_US.UTF-8
    SELINUX_LEVEL_REQUESTED=
    HISTCONTROL=ignoredups
    SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
    HOME=/root
    SHLVL=2
    LOGNAME=root
    SSH_CONNECTION=192.168.108.1 64438 192.168.108.129 22
    CLASSPATH=.:/usr/java/jdk1.7.0_79/lib/dt.jar:/usr/java/jdk1.7.0_79/lib/tools.jar
    LESSOPEN=|/usr/bin/lesspipe.sh %s
    G_BROKEN_FILENAMES=1
    _=/bin/env
    
    env 是 environment (环境) 的简写,上面的例子当中,是列出来所有的环境变量。当然,如果使用 export 也会是一样的内容~ 只不过, export 还有其他额外的功能

    几个重要的环境变量分析:

    • HOME
      代表用户的家目录。可以使用 cd ~ 去到自己的家目录,或者利用 cd 就可以直接回到用户家目录了。那就是取用这个变量,有很多程序都可能会取用到这个变量的值!

    • SHELL
      告知我们,目前这个环境使用的 SHELL 是哪支程序? Linux 默认使用 /bin/bash !

    • HISTSIZE
      这个与『历史命令』有关,亦即是, 我们曾经下达过的命令可以被系统记录下来,而记录的『笔数』则是由这个值来配置的。

    • MAIL
      当我们使用 mail 这个命令在收信时,系统会去读取的邮件信箱文件 (mailbox)。

    • PATH
      就是运行文件搜寻的路径~目录与目录中间以冒号(:)分隔, 文件的搜寻是依序由 PATH 的变量内的目录来查询。

    • LANG
      这个重要!就是语言数据,很多信息都会用到他, 举例来说,当我们在启动某些 perl 的程序语言文件时,他会主动的去分析语系数据文件, 如果发现有他无法解析的编码语系,可能会产生错误!

    • RANDOM
      这个玩意儿就是『随机产生的一个随机数』的变量啦!目前大多数的 distributions 都会有随机数生成器,那就是 /dev/random 这个文件。 我们可以透过这个随机数文件相关的变量 ($RANDOM) 来随机取得随机数值。在 BASH 的环境下,这个 RANDOM 变量的内容,介于 0~32767 之间,所以,你只要 echo $RANDOM 时,系统就会主动的随机取出一个介于 0~32767 的数值。
    Ⅱ、用 set 观察所有变量 (含环境变量与自定义变量)

    bash 可不只有环境变量,还有一些与 bash 操作接口有关的变量,以及用户自己定义的变量存在的。 那么这些变量如何观察呢?这个时候就得要使用 set 这个命令了。 set 除了环境变量之外, 还会将其他在 bash 内的变量通通显示出来!

    set结果只截取一部分:

    [root@localhost ~]# set
    BASH=/bin/bash
    BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
    BASH_ALIASES=()
    BASH_ARGC=()
    BASH_ARGV=()
    BASH_CMDS=()
    BASH_LINENO=()
    
    Ⅲ、$ 符号:

    $符本身也是个变量!它代表的是『目前这个 Shell 的线程代号』,亦即是所谓的 PID (Process ID)。

    [root@localhost ~]# echo $$
    12053
    
    Ⅳ、? 号:

    在 bash 里问好? 这个变量代表的是:『上一个运行的命令所回传的值』, 上面这句话的重点是『上一个命令』与『回传值』两个地方。当我们运行某些命令时, 这些命令都会回传一个运行后的代码。一般来说,如果成功的运行该命令, 则会回传一个 0 值,如果运行过程发生错误,就会回传『错误代码』才对!

    Ⅴ、export 命令 将自定义变量转为环境变量

    我们在原本的 bash 底下运行另一个 bash ,结果操作的环境接口会跑到第二个 bash 去(就是子程序), 那原本的 bash 就会在暂停的情况 (睡着了,就是 sleep)。!若要回到原本的 bash 去, 就只有将第二个 bash 结束掉 (下达 exit 或 logout) 才行。

    因为子程序仅会继承父程序的环境变量, 子程序不会继承父程序的自定义变量。所以你在原本 bash 的自定义变量在进入了子程序后就会消失不见, 一直到你离开子程序并回到原本的父程序后,这个变量才会又出现!

    换个角度来想,也就是说,如果我能将自定义变量变成环境变量的话,那不就可以让该变量值继续存在于子程序了!

    ④  变量的有效范围:

    我们在上面的 export 命令说明中,就提到了这个概念了。如果在跑程序的时候,有父程序与子程序的不同程序关系时, 则『变量』可否被引用与 export 有关。被 export 后的变量,我们可以称他为『环境变量』! 环境变量可以被子程序所引用,但是其他的自定义变量内容就不会存在于子程序中。

    三、变量的键盘读取、数组与声明:read, array, declare

    ①  read

    read命令用来读取来自键盘输入的变量

    语法:

    [root@www ~]# read [-pt] variable
    
    选项与参数:
    
    -p  :后面可以接提示字符!
    
    -t  :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦!
    
    
    例:

    [root@localhost ~]# read -p "your name:" username
    your name:elgindd
    [root@localhost ~]# echo $username
    elgindd
    
    ② declare/typeset

    declare 或 typeset 是一样的功能,就是在『声明变量的类型』。如果使用 declare 后面并没有接任何参数,那么 bash 就会主动的将所有的变量名称与内容通通叫出来,就好像使用 set 一样!

    语法:

    [root@www ~]# declare [-aixr] variable
    
    选项与参数:
    
    -a  :将后面名为 variable 的变量定义成为数组 (array) 类型
    
    -i  :将后面名为 variable 的变量定义成为整数数字 (integer) 类型
    
    -x  :用法与 export 一样,就是将后面的 variable 变成环境变量;
    
    -r  :将变量配置成为 readonly 类型,该变量不可被更改内容,也不能 unset
    
    
    例:

    [root@localhost ~]# sum=100+30+20
    [root@localhost ~]# echo $sum
    100+30+20
    [root@localhost ~]# declare -i sum=100+30+20
    [root@localhost ~]# echo $sum
    150
    

    由于在默认的情况底下, bash 对于变量有几个基本的定义:

    • 变量类型默认为『字符串』,所以若不指定变量类型,则 1+2 为一个『字符串』而不是『算数表达式』。 所以上述第一个运行的结果才会出现那个情况的;
    • bash 环境中的数值运算,默认最多仅能到达整数形态,所以 1/3 结果是 0;
    ③ 数组类型变量 array

    [root@localhost ~]# var[1]="elgin1"
    [root@localhost ~]# var[2]="elgin2"
    [root@localhost ~]# var[3]="elgin3"
    [root@localhost ~]# echo "${var[1]},${var[2]},${var[3]},${var[0]}"
    elgin1,elgin2,elgin3,
    


  • 相关阅读:
    HDU 3081 Marriage Match II
    HDU 4292 Food
    HDU 4322 Candy
    HDU 4183 Pahom on Water
    POJ 1966 Cable TV Network
    HDU 3605 Escape
    HDU 3338 Kakuro Extension
    HDU 3572 Task Schedule
    HDU 3998 Sequence
    Burning Midnight Oil
  • 原文地址:https://www.cnblogs.com/elgin-seth/p/5293732.html
Copyright © 2020-2023  润新知