您的位置:首页 > 运维架构 > Shell

BASH学习之Shell 的变量功能

2013-08-28 11:42 281 查看

变量的取用与配置:echo, 变量配置守则, unset

变量的取用: 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}


变量的取用就如同上面的范例,利用 echo 就能够读出,只是需要在变量名称前面加上 $ ,或者是以 ${变量} 的方式来取用都可以!当然啦,那个 echo 的功能可是很多的,我们这里单纯是拿 echo 来读出变量的内容而已,更多的 echo 使用,请自行给他 man echo 吧! ^_^

现在我们知道了变量与变量内容之间的相关性了,好了,那么我要如何『配置』或者是『修改』某个变量的内容啊?很简单啦!用『等号(=)』连接变量与他的内容就好啦!举例来说:我要将 myname 这个变量名称的内容配置为 VBird ,那么:

[root@www ~]# echo $myname
<==这里并没有任何数据~因为这个变量尚未被配置!是空的!
[root@www ~]# myname=VBird
[root@www ~]# echo $myname
VBird  <==出现了!因为这个变量已经被配置了!

瞧!如此一来,这个变量名称 myname 的内容就带有 VBird 这个数据啰~而由上面的例子当中,我们也可以知道:在 bash 当中,当一个变量名称尚未被配置时,默认的内容是『空』的。另外,变量在配置时,还是需要符合某些规定的,否则会配置失败喔!这些守则如下所示啊!

变量的配置守则

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

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

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

变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但
双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:

『var="lang is $LANG"』则『echo $var』可得『lang is en_US』

单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:

『var='lang is $LANG'』则『echo $var』可得『lang is $LANG』

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

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

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

通常大写字符为系统默认变量,自行配置变量可以使用小写字符,方便判断 (纯粹依照使用者兴趣与嗜好) ;
取消变量的方法为使用 unset :『unset 变量名称』例如取消 myname 的配置:
『unset myname』

范例一:配置一变量 name ,且内容为 VBird

[root@www ~]# 12name=VBird

-bash: 12name=VBird: command not found <==屏幕会显示错误!因为不能以数字开头!

[root@www ~]# name = VBird <==还是错误!因为有空白!

[root@www ~]# name=VBird <==OK 的啦!

范例二:承上题,若变量内容为 VBird's name 呢,就是变量内容含有特殊符号时:

[root@www ~]# name=VBird's name

# 单引号与双引号必须要成对,在上面的配置中仅有一个单引号,因此当你按下 enter 后,

# 你还可以继续输入变量内容。这与我们所需要的功能不同,失败啦!

# 记得,失败后要复原请按下 [ctrl]-c 结束!

[root@www ~]# name="VBird's name" <==OK 的啦!

# 命令是由左边向右找→,先遇到的引号先有用,因此如上所示,单引号会失效!

[root@www ~]# name='VBird's name' <==失败的啦!

# 因为前两个单引号已成对,后面就多了一个不成对的单引号了!因此也就失败了!

[root@www ~]# name=VBird\'s\ name <==OK 的啦!

# 利用反斜杠 (\) 跳脱特殊字符,例如单引号与空格键,这也是 OK 的啦!

范例三:我要在 PATH 这个变量当中『累加』:/home/dmtsai/bin 这个目录

[root@www ~]# PATH=$PATH:/home/dmtsai/bin

[root@www ~]# PATH="$PATH":/home/dmtsai/bin

[root@www ~]# PATH=${PATH}:/home/dmtsai/bin

# 上面这三种格式在 PATH 里头的配置都是 OK 的!但是底下的例子就不见得啰!

范例四:承范例三,我要将 name 的内容多出 "yes" 呢?

[root@www ~]# name=$nameyes

# 知道了吧?如果没有双引号,那么变量成了啥?name 的内容是 $nameyes 这个变量!

# 呵呵!我们可没有配置过 nameyes 这个变量吶!所以,应该是底下这样才对!

[root@www ~]# name="$name"yes

[root@www ~]# name=${name}yes <==以此例较佳!

范例五:如何让我刚刚配置的 name=VBird 可以用在下个 shell 的程序?

[root@www ~]# name=VBird

[root@www ~]# bash <==进入到所谓的子程序

[root@www ~]# echo $name <==子程序:再次的 echo 一下;

<==嘿嘿!并没有刚刚配置的内容喔!

[root@www ~]# exit <==子程序:离开这个子程序

[root@www ~]# export name

[root@www ~]# bash <==进入到所谓的子程序

[root@www ~]# echo $name <==子程序:在此运行!

VBird <==看吧!出现配置值了!

[root@www ~]# exit <==子程序:离开这个子程序

什么是『子程序』呢?就是说,在我目前这个 shell 的情况下,去激活另一个新的 shell ,新的那个 shell 就是子程序啦!在一般的状态下,父程序的自定义变量是无法在子程序内使用的。但是透过 export 将变量变成环境变量后,就能够在子程序底下应用了!
范例六:如何进入到您目前核心的模块目录?

[root@www ~]# cd /lib/modules/`uname -r`/kernel

[root@www ~]# cd /lib/modules/$(uname -r)/kernel

其实上面的命令可以说是作了两次动作,亦即是:

先进行反单引号内的动作『uname -r』并得到核心版本为 2.6.18-128.el5
将上述的结果带入原命令,故得命令为:『cd /lib/modules/2.6.18-128.el5/kernel/』

范例七:取消刚刚配置的 name 这个变量内容

[root@www ~]# unset name

根据上面的案例你可以试试看!就可以了解变量的配置啰!这个是很重要的呦!请勤加练习!其中,较为重要的一些特殊符号的使用啰!例如单引号、双引号、跳脱字符、钱字号、反单引号等等

环境变量的功能

用 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:*.cmd=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=en_US                 <== 这个与语系有关,底下会再介绍!
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 观察所有变量 (含环境变量与自定义变量)

[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 的 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 没错!


参考连接:http://vbird.dic.ksu.edu.tw/linux_basic/0320bash_2.php
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: