zoukankan      html  css  js  c++  java
  • Shell变量之自定义变量、环境变量

    1:环境变量

           环境变量可以帮我们达到很多功能~包括家目录的变换啊、提示字符的显示啊、运行文件搜寻的路径啊等等的那么,既然环境变量有那么多的功能,问一下,目前我的 shell 环境中, 有多少默认的环境变量啊?我们可以利用两个命令来查阅,分别是 env 与 export 呢!

           such as:[root@hadoopHost ~]#  export 或者env 

           常见的环境变量有:

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

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

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

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

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

    • LANG
      这个重要!就是语系数据啰~很多信息都会用到他, 举例来说,当我们在启动某些 perl 的程序语言文件时,他会主动的去分析语系数据文件, 如果发现有他无法解析的编码语系,可能会产生错误喔!一般来说,我们中文编码通常是 zh_TW.Big5 或者是 zh_TW.UTF-8,这两个编码偏偏不容易被解译出来,所以,有的时候,可能需要修订一下语系数据。 这部分我们会在下个小节做介绍的!

    • RANDOM
      这个玩意儿就是『随机随机数』的变量啦!目前大多数的 distributions 都会有随机数生成器,那就是 /dev/random 这个文件。 我们可以透过这个随机数文件相关的变量 ($RANDOM) 来随机取得随机数值喔。在 BASH 的环境下,这个 RANDOM 变量的内容,介于 0~32767 之间,所以,你只要 echo $RANDOM 时,系统就会主动的随机取出一个介于 0~32767 的数值。万一我想要使用 0~9 之间的数值呢?呵呵~利用 declare 宣告数值类型, 然后这样做就可以了:
      [root@www ~]# declare -i number=$RANDOM*10/32768 ; echo $number
      8   <== 此时会随机取出 0~9 之间的数值喔!
      

    2:自定义变量(包含 bash 操作接口有关的变量)

          除了那些环境变量外,还有一些还有一些与 bash 操作接口有关的变量以及用户自定义的变量,这类变量改如何查询呢?

          用 set 观察所有变量 (含环境变量与自定义变量)

          一般来说,不论是否为环境变量,只要跟我们目前这个 shell 的操作接口有关的变量, 通常都会被配置为大写字符,也就是说,『基本上,在 Linux 默认的情况中,使用{大写的字母}来配置的变量一般为系统内定需要的变量』有哪些是比较重要的系统变量呢?大概有这几个吧!

      • PS1:(提示字符的配置)

        这是 PS1 (数字的 1 不是英文字母),这个东西就是我们的『命令提示字符』喔! 当我们每次按下 [Enter] 按键去运行某个命令后,最后要再次出现提示字符时, 就会主动去读取这个变量值了。上头 PS1 内显示的是一些特殊符号,这些特殊符号可以显示不同的信息, 每个 distributions 的 bash 默认的 PS1 变量内容可能有些许的差异,不要紧,『习惯你自己的习惯』就好了。 你可以用 man bash (注3)去查询一下 PS1 的相关说明,以理解底下的一些符号意义。

        • d :可显示出『星期 月 日』的日期格式,如:"Mon Feb 2"
        • H :完整的主机名。举例来说,鸟哥的练习机为『www.vbird.tsai』
        • h :仅取主机名在第一个小数点之前的名字,如鸟哥主机则为『www』后面省略
        • :显示时间,为 24 小时格式的『HH:MM:SS』
        • T :显示时间,为 12 小时格式的『HH:MM:SS』
        • A :显示时间,为 24 小时格式的『HH:MM』
        • @ :显示时间,为 12 小时格式的『am/pm』样式
        • u :目前使用者的账号名称,如『root』;
        • v :BASH 的版本信息,如鸟哥的测试主板本为 3.2.25(1),仅取『3.2』显示
        • w :完整的工作目录名称,由根目录写起的目录名称。但家目录会以 ~ 取代;
        • W :利用 basename 函数取得工作目录名称,所以仅会列出最后一个目录名。
        • # :下达的第几个命令。
        • $ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $ 啰~

        好了,让我们来看看 CentOS 默认的 PS1 内容吧:『[u@h W]$ 』,现在你知道那些反斜杠后的数据意义了吧? 要注意喔!那个反斜杠后的数据为 PS1 的特殊功能,与 bash 的变量配置没关系啦!不要搞混了喔! 那你现在知道为何你的命令提示字符是:『 [root@www ~]# 』了吧? 好了,那么假设我想要有类似底下的提示字符:
        [root@www /home/dmtsai 16:50 #12]#
        那个 # 代表第 12 次下达的命令。那么应该如何配置 PS1 呢?可以这样啊:
        [root@www ~ ]# cd /home
        [root@www home]# PS1='[u@h w A ##]$ '
        [root@www /home 17:02 #85]# 
        # 看到了吗?提示字符变了!变的很有趣吧!其中,那个 #85 比较有趣,
        # 如果您再随便输入几次 ls 后,该数字就会添加喔!为啥?上面有说明滴!
        
      • $:(关于本 shell 的 PID)

        钱字号本身也是个变量喔!这个咚咚代表的是『目前这个 Shell 的线程代号』,亦即是所谓的 PID (Process ID)。 更多的程序观念,我们会在第四篇的时候提及。想要知道我们的 shell 的 PID ,就可以用:『 echo $$ 』即可!出现的数字就是你的 PID 号码。

      • ?:(关于上个运行命令的回传值)

        什么?问号也是一个特殊的变量?没错!在 bash 里面这个变量可重要的很! 这个变量是:『上一个运行的命令所回传的值』, 上面这句话的重点是『上一个命令』与『回传值』两个地方。当我们运行某些命令时, 这些命令都会回传一个运行后的代码。一般来说,如果成功的运行该命令, 则会回传一个 0 值,如果运行过程发生错误,就会回传『错误代码』才对!一般就是以非为 0 的数值来取代。 

      • OSTYPE, HOSTTYPE, MACHTYPE:(主机硬件与核心的等级)

    3:自定义变量转成环境变量---export

            谈了 env 与 set 现在知道有所谓的环境变量与自定义变量,那么这两者之间有啥差异呢?其实这两者的差异在于『 该变量是否会被子程序所继续引用

             如你想要让该变量内容继续的在子程序中使用,那么就请运行:

    [root@www ~]# export 变量名称

             我们常常在自己的主控文件后面呼叫其他附属文件(类似函式的功能),但是主控文件与附属文件内都有相同的变量名称, 若一再重复配置时,要修改也很麻烦,此时只要在原本的第一个文件内配置好『 export 变量 』, 后面所呼叫的文件就能够使用这个变量配置了!而不需要重复配置,

     如果仅下达 export 而没有接变量时,那么此时将会把所有的『环境变量』秀出来喔!例如:(跟env作用一样)

    [root@www ~]# export
    declare -x HISTSIZE="1000"
    declare -x HOME="/root"
    declare -x HOSTNAME="www.vbird.tsai"
    declare -x INPUTRC="/etc/inputrc"
    declare -x LANG="en_US"
    declare -x LOGNAME="root"
    
    

     

    4:将环境变量转成自定义变量----declare 

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

    [root@www ~]# declare [-aixr] variable
    选项与参数:
    -a  :将后面名为 variable 的变量定义成为数组 (array) 类型
    -i  :将后面名为 variable 的变量定义成为整数数字 (integer) 类型
    -x  :用法与 export 一样,就是将后面的 variable 变成环境变量;
    -r  :将变量配置成为 readonly 类型,该变量不可被更改内容,也不能 unset
    
    范例一:让变量 sum 进行 100+300+50 的加总结果
    [root@www ~]# sum=100+300+50
    [root@www ~]# echo $sum
    100+300+50  <==咦!怎么没有帮我计算加总?因为这是文字型态的变量属性啊!
    [root@www ~]# declare -i sum=100+300+50
    [root@www ~]# echo $sum
    450         <==瞭乎??
    

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

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

    现在你晓得为啥你需要进行变量声明了吧?如果需要非字符串类型的变量,那就得要进行变量的声明才行啦! 底下继续来玩些其他的 declare 功能。

    范例二:将 sum 变成环境变量
    [root@www ~]# declare -x sum
    [root@www ~]# export | grep sum
    declare -ix sum="450"  <==果然出现了!包括有 i 与 x 的宣告!
    
    范例三:让 sum 变成只读属性,不可更动!
    [root@www ~]# declare -r sum
    [root@www ~]# sum=tesgting
    -bash: sum: readonly variable  <==老天爷~不能改这个变量了!
    
    范例四:让 sum 变成非环境变量的自定义变量吧!
    [root@www ~]# declare +x sum  <== 将 - 变成 + 可以进行『取消』动作
    [root@www ~]# declare -p sum  <== -p 可以单独列出变量的类型
    declare -ir sum="450" <== 看吧!只剩下 i, r 的类型,不具有 x 啰!
    

     

     5: read

           要读取来自键盘输入的变量,就是用 read 这个命令了。这个命令最常被用在 shell script 的撰写当中, 想要跟使用者对谈?用这个命令就对了。关于 script 的写法,我们会在第十三章介绍,底下先来瞧一瞧 read 的相关语法吧!

    [root@www ~]# read [-pt] variable
    选项与参数:
    -p  :后面可以接提示字符!
    -t  :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦!
    
    范例一:让用户由键盘输入一内容,将该内容变成名为 atest 的变量
    [root@www ~]# read atest
    This is a test        <==此时光标会等待你输入!请输入左侧文字看看
    [root@www ~]# echo $atest
    This is a test          <==你刚刚输入的数据已经变成一个变量内容!
    
    范例二:提示使用者 30 秒内输入自己的大名,将该输入字符串作为名为 named 的变量内容
    [root@www ~]# read -p "Please keyin your name: " -t 30 named
    Please keyin your name: VBird Tsai   <==注意看,会有提示字符喔!
    [root@www ~]# echo $named
    VBird Tsai        <==输入的数据又变成一个变量的内容了!
    

    read 之后不加任何参数,直接加上变量名称,那么底下就会主动出现一个空白行等待你的输入(如范例一)。 如果加上 -t 后面接秒数,例如上面的范例二,那么 30 秒之内没有任何动作时, 该命令就会自动略过了~如果是加上 -p ,嘿嘿!在输入的光标前就会有比较多可以用的提示字符给我们参考!

     

    6:数组 (array) 变量类型

    数组的配置方式是:

    var[index]=content
    范例:配置上面提到的 var[1] ~ var[3] 的变量。
    [root@www ~]# var[1]="small min"
    [root@www ~]# var[2]="big min"
    [root@www ~]# var[3]="nice min"
    [root@www ~]# echo "${var[1]}, ${var[2]}, ${var[3]}"
    small min, big min, nice min

     

  • 相关阅读:
    java第四次作业
    JAVA第三次作业
    Java第二次作业
    Java第一次作业
    android studio下载
    Android面试常问到的知识点
    [Java基础]List,Map集合总结
    搞ACM的你伤不起[转自RoBa]------(看一次,笑一次)
    06.5.1.Functions
    05.virsh命令的常用操作(kvm)
  • 原文地址:https://www.cnblogs.com/chenfei0801/p/3552389.html
Copyright © 2011-2022 走看看