linux shell变量
linux shell变量
拉普兰德 发表于2年前
linux shell变量
  • 发表于 2年前
  • 阅读 12
  • 收藏 0
  • 点赞 0
  • 评论 0
  • 变量的取用: echo

[root@www ~]# echo $variable
[root@www ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@www ~]# echo ${PATH}
[root@www ~]# echo $myname
       <==这里并没有任何数据~因为这个变量尚未被配置!是空的!
[root@www ~]# myname=VBird
[root@www ~]# echo $mynameVBird  <==出现了!因为这个变量已经被配置了!
  • 变量的配置守则

  1. 变量与变量内容以一个等号『=』来连结,如下所示:
    『myname=VBird』

  2. 等号两边不能直接接空格符,如下所示为错误:
    『myname = VBird』或『myname=VBird Tsai』

  3. 变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误:
    『2myname=VBird』

  4. 变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但

    • 双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
      『var="lang is $LANG"』则『echo $var』可得『lang is en_US』

    • 单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
      『var='lang is $LANG'』则『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 变量名称』例如取消 myname 的配置:
    『unset myname』

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

范例一:列出目前的 shell 环境下的所有环境变量与其内容。 
[root@www ~]# env 
HOSTNAME=www.vbird.tsai    <== 这部主机的主机名 
TERM=xterm                 <== 这个终端机使用的环境是什么类型 
SHELL=/bin/bash            <== 目前这个环境下,使用的 Shell 是哪一个程序? 
HISTSIZE=1000              <== 『记录命令的笔数』在 CentOS 默认可记录 1000 笔 
USER=root                  <== 使用者的名称啊! 
LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;
33;01: or=01;05;37;41:mi=01;05;37;41:ex=00;32:*NaNd=00;32:*.exe=00;32:*.com=00;32:*.btm=0 0;
32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz= 00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;
31:*.gz=00;31:*.bz2=00;31:*.bz=00;3 1:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00 ;
35:*.xpm=00;35:*.png=00;35:*.tif=00;35: <== 一些颜色显示 
MAIL=/var/spool/mail/root  <== 这个用户所取用的 mailbox 位置 
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin: /root/bin                  <== 不再多讲啊!是运行文件命令搜寻路径 
INPUTRC=/etc/inputrc       <== 与键盘按键功能有关。可以配置特殊按键! 
PWD=/root                  <== 目前用户所在的工作目录 (利用 pwd 取出!)
LANG                 <== 这个与语系有关,底下会再介绍! 
HOME=/root                 <== 这个用户的家目录啊! 
_=/bin/env                 <== 上一次使用的命令的最后一个参数(或命令本身)

env 是 environment (环境) 的简写啊,上面的例子当中,是列出来所有的环境变量。当然,如果使用 export 也会是一样的内容~ 只不过, export 还有其他额外的功能就是了,我们等一下再提这个 export 命令。 那么上面这些变量有些什么功用呢?底下我们就一个一个来分析分析!

  • 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 之间的数值喔!

大致上是有这些环境变量啦~里面有些比较重要的参数,在底下我们都会另外进行一些说明的~


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

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

[root@www ~]# set BASH=/bin/bash           <== bash 的主程序放置路径 BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release"  [5]="i686-redhat-linux-gnu")      <== bash 的版本啊! BASH_VERSION='3.2.25(1)-release'  <== 也是 bash 的版本啊! COLORS=/etc/DIR_COLORS.xterm      <== 使用的颜色纪录文件 COLUMNS=115              <== 在目前的终端机环境下,使用的字段有几个字符长度 HISTFILE=/root/.bash_history      <== 历史命令记录的放置文件,隐藏档 HISTFILESIZE=1000        <== 存起来(与上个变量有关)的文件之命令的最大纪录笔数。 HISTSIZE=1000            <== 目前环境下,可记录的历史命令最大笔数。 HOSTTYPE=i686            <== 主机安装的软件主要类型。我们用的是 i686 兼容机器软件 IFS=$' \t\n'             <== 默认的分隔符 LINES=35                 <== 目前的终端机下的最大行数 MACHTYPE=i686-redhat-linux-gnu    <== 安装的机器类型 MAILCHECK=60             <== 与邮件有关。每 60 秒去扫瞄一次信箱有无新信! OLDPWD=/home             <== 上个工作目录。我们可以用 cd - 来取用这个变量。 OSTYPE=linux-gnu         <== 操作系统的类型! PPID=20025               <== 父程序的 PID (会在后续章节才介绍) PS1='[\u@\h \W]\$ '      <== PS1 就厉害了。这个是命令提示字符,也就是我们常见的                              [root@www ~]# 或 [dmtsai ~]$ 的配置值啦!可以更动的! PS2='> '                 <== 如果你使用跳脱符号 (\) 第二行以后的提示字符也 name=VBird               <== 刚刚配置的自定义变量也可以被列出来喔! $                        <== 目前这个 shell 所使用的 PID ?                        <== 刚刚运行完命令的回传值。

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

PS1:(提示字符的配置)

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

  • \d :可显示出『星期 月 日』的日期格式,如:"Mon Feb 2"

  • \H :完整的主机名。举例来说,鸟哥的练习机为『www.vbird.tsai』

  • \h :仅取主机名在第一个小数点之前的名字,如鸟哥主机则为『www』后面省略

  • \t :显示时间,为 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 的数值来取代。 我们以底下的例子来看看:

    [root@www ~]# echo $SHELL/bin/bash                                  <==可顺利显示!没有错误!
    [root@www ~]# echo $?0                                          <==因为没问题,所以回传值为 0
    [root@www ~]# 12name=VBird-bash: 12name=VBird: command not found     <==发生错误了!bash回报有问题
    [root@www ~]# echo $?127                                        <==因为有问题,回传错误代码(非为0)# 错误代码回传值依据软件而有不同,我们可以利用这个代码来搜寻错误的原因喔![root@www ~]# echo $?0# 咦!怎么又变成正确了?这是因为 "?" 只与『上一个运行命令』有关,
    # 所以,我们上一个命令是运行『 echo $? 』,当然没有错误,所以是 0 没错!

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

变量的有效范围

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

变量键盘读取、数组与宣告: read, array, declare

  • read

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

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

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


  • declare / typeset

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 $sum100+300+50  <==咦!怎么没有帮我计算加总?因为这是文字型态的变量属性啊![root@www ~]# declare -i sum=100+300+50[root@www ~]# echo $sum450         <==瞭乎??

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

  • 变量类型默认为『字符串』,所以若不指定变量类型,则 1+2 为一个『字符串』而不是『计算式』。 所以上述第一个运行的结果才会出现那个情况的;

  • bash 环境中的数值运算,默认最多仅能到达整数形态,所以 1/3 结果是 0;

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

范例二:将 sum 变成环境变量[root@www ~]# declare -x sum
[root@www ~]# export | grep sumdeclare -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 啰!

declare 也是个很有用的功能~尤其是当我们需要使用到底下的数组功能时, 他也可以帮我们宣告数组的属性喔!不过,老话一句,数组也是在 shell script 比较常用的啦! 比较有趣的是,如果你不小心将变量配置为『只读』,通常得要注销再登陆才能复原该变量的类型了! @_ @


  • 数组 (array) 变量类型

某些时候,我们必须使用数组来宣告一些变量,这有什么好处啊?在一般人的使用上, 果然是看不出来有什么好处的!不过,如果您曾经写过程序的话,那才会比较了解数组的意义~ 数组对写数值程序的设计师来说,可是不能错过学习的重点之一哩!好!不啰唆~ 那么要如何配置数组的变量与内容呢?在 bash 里头,数组的配置方式是:

var[index]=content

意思是说,我有一个数组名为 var ,而这个数组的内容为 var[1]=小明, var[2]=大明, var[3]=好明 .... 等等,那个 index 就是一些数字啦,重点是用中刮号 ([ ]) 来配置的。 目前我们 bash 提供的是一维数组。老实说,如果您不必写一些复杂的程序, 那么这个数组的地方,可以先略过,等到有需要再来学习即可!因为要制作出数组, 通常与循环或者其他判断式交互使用才有比较高的存在意义!

范例:配置上面提到的 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

数组的变量类型比较有趣的地方在于『读取』,一般来说,建议直接以 ${数组} 的方式来读取,比较正确无误的啦!


共有 人打赏支持
粉丝 2
博文 34
码字总数 50893
评论 (0)
×
拉普兰德
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: