Linux下变量的使用规则
2015-07-19 16:36
429 查看
变量的配置守则
变量与变量内容以一个等号『=』来连结,如下所示:
『myname=VBird』
等号两边不能直接接空格符,如下所示为错误:
『myname = VBird』或『myname=VBird Tsai』
变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误:
『2myname=VBird』
变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但可用跳脱字符『 \ 』将特殊符号(如 [Enter], $, \, 空格符, '等)变成一般字符;
双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
『var="lang is $LANG"』则『echo $var』可得『lang is en_US』
单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
『var='lang is $LANG'』则『echo $var』可得『lang is $LANG』
在一串命令中,还需要藉由其他的命令提供的信息,可以使用反单引号『`命令`』或 『$(命令)』。特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号! 例如想要取得核心版本的配置:
『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』
若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容,如下所示:
『PATH="$PATH":/home/bin』
若该变量需要在其他子程序运行,则需要以 export 来使变量变成环境变量:
『export PATH』
通常大写字符为系统默认变量,自行配置变量可以使用小写字符,方便判断 (纯粹依照使用者兴趣与嗜好) ;
取消变量的方法为使用 unset :『unset 变量名称』例如取消 myname 的配置:
『unset myname』
底下让鸟哥举几个例子来让你试看看,就知道怎么配置好你的变量啰!
什么是『子程序』呢?就是说,在我目前这个 shell 的情况下,去激活另一个新的 shell ,新的那个 shell 就是子程序啦!在一般的状态下,父程序的自定义变量是无法在子程序内使用的。但是透过 export 将变量变成环境变量后,就能够在子程序底下应用了!很不赖吧!至于程序的相关概念, 我们会在第十七章程序管理当中提到的喔!
每个 Linux 都能够拥有多个核心版本,且几乎 distribution 的核心版本都不相同。以 CentOS 5.3 (未升级前) 为例,他的默认核心版本是 2.6.18-128.el5 ,所以核心模块目录在 /lib/modules/2.6.18-128.el5/kernel/ 内。 也由于每个 distributions 的这个值都不相同,但是我们却可以利用 uname -r 这个命令先取得版本信息。所以啰,就可以透过上面命令当中的内含命令 `uname -r` 先取得版本输出到 cd ... 那个命令当中,就能够顺利的进入目前核心的驱动程序所放置的目录啰!很方便吧!
其实上面的命令可以说是作了两次动作,亦即是:
先进行反单引号内的动作『uname -r』并得到核心版本为 2.6.18-128.el5
将上述的结果带入原命令,故得命令为:『cd /lib/modules/2.6.18-128.el5/kernel/』
根据上面的案例你可以试试看!就可以了解变量的配置啰!这个是很重要的呦!请勤加练习! 其中,较为重要的一些特殊符号的使用啰!例如单引号、双引号、跳脱字符、钱字号、反单引号等等,底下的例题想一想吧!
[align=right] [/align]
自定义变量和环境变量的关系,set和env的输出的不同之处
export: 自定义变量转成环境变量
谈了 env 与 set 现在知道有所谓的环境变量与自定义变量,那么这两者之间有啥差异呢?其实这两者的差异在于『 该变量是否会被子程序所继续引用』啦!唔!那么啥是父程序?子程序? 这就得要了解一下命令的下达行为了。
当你登陆 Linux 并取得一个 bash 之后,你的 bash 就是一个独立的程序,被称为 PID 的就是。 接下来你在这个 bash 底下所下达的任何命令都是由这个 bash 所衍生出来的,那些被下达的命令就被称为子程序了。 我们可以用底下的图示来简单的说明一下父程序与子程序的概念:
图 2.3.1、程序相关性示意图
如上所示,我们在原本的 bash 底下运行另一个 bash ,结果操作的环境接口会跑到第二个 bash 去(就是子程序), 那原本的 bash 就会在暂停的情况 (睡着了,就是 sleep)。整个命令运行的环境是实线的部分!若要回到原本的 bash 去, 就只有将第二个 bash 结束掉 (下达 exit 或 logout) 才行。更多的程序概念我们会在第四篇谈及,这里只要有这个概念即可。
这个程序概念与变量有啥关系啊?关系可大了!因为子程序仅会继承父程序的环境变量, 子程序不会继承父程序的自定义变量啦!所以你在原本 bash 的自定义变量在进入了子程序后就会消失不见, 一直到你离开子程序并回到原本的父程序后,这个变量才会又出现!
换个角度来想,也就是说,如果我能将自定义变量变成环境变量的话,那不就可以让该变量值继续存在于子程序了? 呵呵!没错!此时,那个 export 命令就很有用啦!如你想要让该变量内容继续的在子程序中使用,那么就请运行:
这东西用在『分享自己的变量配置给后来呼叫的文件或其他程序』啦! 像鸟哥常常在自己的主控文件后面呼叫其他附属文件(类似函式的功能),但是主控文件与附属文件内都有相同的变量名称, 若一再重复配置时,要修改也很麻烦,此时只要在原本的第一个文件内配置好『 export 变量 』, 后面所呼叫的文件就能够使用这个变量配置了!而不需要重复配置,这非常实用于 shell script 当中喔! 如果仅下达 export 而没有接变量时,那么此时将会把所有的『环境变量』秀出来喔!例如:
那如何将环境变量转成自定义变量呢?可以使用本章后续介绍的 declare 呢!
变量与变量内容以一个等号『=』来连结,如下所示:
『myname=VBird』
等号两边不能直接接空格符,如下所示为错误:
『myname = VBird』或『myname=VBird Tsai』
变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误:
『2myname=VBird』
变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但可用跳脱字符『 \ 』将特殊符号(如 [Enter], $, \, 空格符, '等)变成一般字符;
双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
『var="lang is $LANG"』则『echo $var』可得『lang is en_US』
单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
『var='lang is $LANG'』则『echo $var』可得『lang is $LANG』
在一串命令中,还需要藉由其他的命令提供的信息,可以使用反单引号『`命令`』或 『$(命令)』。特别注意,那个 ` 是键盘上方的数字键 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 <==子程序:离开这个子程序 |
范例六:如何进入到您目前核心的模块目录? [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 |
例题: 在变量的配置当中,单引号与双引号的用途有何不同? 答: 单引号与双引号的最大不同在于双引号仍然可以保有变量的内容,但单引号内仅能是一般字符 ,而不会有特殊符号。我们以底下的例子做说明:假设您定义了一个变量, name=VBird ,现在想以 name 这个变量的内容定义出 myname 显示 VBird its me 这个内容,要如何订定呢? [root@www ~]# name=VBird [root@www ~]# echo $name VBird [root@www ~]# myname="$name its me" [root@www ~]# echo $myname VBird its me [root@www ~]# myname='$name its me' [root@www ~]# echo $myname $name its me 发现了吗?没错!使用了单引号的时候,那么 $name 将失去原有的变量内容,仅为一般字符的显示型态而已!这里必需要特别小心在意! |
例题: 在命令下达的过程中,反单引号( ` )这个符号代表的意义为何? 答: 在一串命令中,在 ` 之内的命令将会被先运行,而其运行出来的结果将做为外部的输入信息!例如 uname -r 会显示出目前的核心版本,而我们的核心版本在 /lib/modules 里面,因此,你可以先运行 uname -r 找出核心版本,然后再以『 cd 目录』到该目录下,当然也可以运行如同上面范例六的运行内容啰。 另外再举个例子,我们也知道, locate 命令可以列出所有的相关文件档名,但是,如果我想要知道各个文件的权限呢?举例来说,我想要知道每个 crontab 相关档名的权限: [root@www ~]# ls -l `locate crontab` 如此一来,先以 locate 将文件名数据都列出来,再以 ls 命令来处理的意思啦!瞭了吗? ^_^ |
例题: 若你有一个常去的工作目录名称为:『/cluster/server/work/taiwan_2005/003/』,如何进行该目录的简化? 答: 在一般的情况下,如果你想要进入上述的目录得要『cd /cluster/server/work/taiwan_2005/003/』, 以鸟哥自己的案例来说,鸟哥跑数值模式常常会配置很长的目录名称(避免忘记),但如此一来变换目录就很麻烦。 此时,鸟哥习惯利用底下的方式来降低命令下达错误的问题: [root@www ~]# work="/cluster/server/work/taiwan_2005/003/" [root@www ~]# cd $work 未来我想要使用其他目录作为我的模式工作目录时,只要变更 work 这个变量即可!而这个变量又可以在 bash 的配置文件中直接指定,那我每次登陆只要运行『 cd $work 』就能够去到数值模式仿真的工作目录了!是否很方便呢? ^_^ |
Tips: 老实说,使用『 version=$(uname -r) 』来取代『 version=`uname -r` 』比较好,因为反单引号大家老是容易打错或看错! 所以现在鸟哥都习惯使用 $( 命令 ) 来介绍这个功能! |
export: 自定义变量转成环境变量
谈了 env 与 set 现在知道有所谓的环境变量与自定义变量,那么这两者之间有啥差异呢?其实这两者的差异在于『 该变量是否会被子程序所继续引用』啦!唔!那么啥是父程序?子程序? 这就得要了解一下命令的下达行为了。
当你登陆 Linux 并取得一个 bash 之后,你的 bash 就是一个独立的程序,被称为 PID 的就是。 接下来你在这个 bash 底下所下达的任何命令都是由这个 bash 所衍生出来的,那些被下达的命令就被称为子程序了。 我们可以用底下的图示来简单的说明一下父程序与子程序的概念:
图 2.3.1、程序相关性示意图
如上所示,我们在原本的 bash 底下运行另一个 bash ,结果操作的环境接口会跑到第二个 bash 去(就是子程序), 那原本的 bash 就会在暂停的情况 (睡着了,就是 sleep)。整个命令运行的环境是实线的部分!若要回到原本的 bash 去, 就只有将第二个 bash 结束掉 (下达 exit 或 logout) 才行。更多的程序概念我们会在第四篇谈及,这里只要有这个概念即可。
这个程序概念与变量有啥关系啊?关系可大了!因为子程序仅会继承父程序的环境变量, 子程序不会继承父程序的自定义变量啦!所以你在原本 bash 的自定义变量在进入了子程序后就会消失不见, 一直到你离开子程序并回到原本的父程序后,这个变量才会又出现!
换个角度来想,也就是说,如果我能将自定义变量变成环境变量的话,那不就可以让该变量值继续存在于子程序了? 呵呵!没错!此时,那个 export 命令就很有用啦!如你想要让该变量内容继续的在子程序中使用,那么就请运行:
[root@www ~]# export 变量名称 |
[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" # 后面的鸟哥就都直接省略了!不然....浪费版面~ ^_^ |
相关文章推荐
- linux常用命令
- Linux学习与总结:-2Linux常用命令
- Python学习-centos7.0下matplotlib安装及问题解决
- linux下安装storm
- linux下的 一些常识
- Linux 磁盘管理
- 在linux下安装jdk
- vmware centOS 开机进度条 卡死 Determining IP Information for eth0...
- linux中运行一个二进制的文件
- LINUX中system()函数详解
- 在VMware下建立一个linux和Windows共享的文件夹
- LINUX中fork()函数详解
- Linux strace命令(转)
- 如何查看/修改Linux时区和时间
- Centos 6.5 配置hadoop2.7.1
- 在Linux上实现摄像头中的霍夫圆检测
- linux——ssh服务器的配置
- Linux忘记ROOT密码后的处理方式
- c实现linux下的数据库备份
- linux命令,系统安全相关命令--passwd