影响 bash 环境操作的变量
某些特定变量会影响到 bash 的环境喔! 举例来说, 我们前面已经提到过很多次的那个 PATH变量! 你能不能在任何目录下执行某个指令, 与 PATH 这个变量有很大的关系。 例如你下达ls 这个指令时, 系统就是通过 PATH 这个变量里面的内容所记录的路径顺序来搜寻指令的呢! 如果在搜寻完 PATH 变量内的路径还找不到 ls 这个指令时, 就会在屏幕上显示“command not found ”的错误讯息了。
如果说的学理一点, 那么由于在 Linux System 下面, 所有的线程都是需要一个执行码, 而就如同上面提到的, 你“真正以 shell 来跟 Linux 沟通, 是在正确的登陆 Linux 之后! ”这个时候你就有一个 bash 的执行程序, 也才可以真正的经由 bash 来跟系统沟通啰! 而在进入 shell之前, 也正如同上面提到的, 由于系统需要一些变量来提供他数据的存取 ( 或者是一些环境的设置参数值, 例如是否要显示彩色等等的) , 所以就有一些所谓的“环境变量” 需要来读入系统中了! 这些环境变量例如 PATH、 HOME、 MAIL、 SHELL 等等, 都是很重要的, 为了区别与自订变量的不同, 环境变量通常以大写字符来表示呢!
变量的取用与设置: echo, 变量设置规则, unset
说的口沫横飞的, 也不知道“变量”与“变量代表的内容”有啥关系? 那我们就将“变量”的“内容”拿出来给您瞧瞧好了。 你可以利用 echo 这个指令来取用变量, 但是, 变量在被取用时,前面必须要加上钱字号“ $ ”才行, 举例来说, 要知道 PATH 的内容, 该如何是好?
变量的设置规则
- 变量与变量内容以一个等号“=”来链接, 如下所示: “myname=VBird”
- 等号两边不能直接接空白字符, 如下所示为错误: “myname = VBird”或“myname=VBird
Tsai” - 变量名称只能是英文字母与数字, 但是开头字符不能是数字, 如下为错误:“2myname=VBird”
- 变量内容若有空白字符可使用双引号“””或单引号“’”将变量内容结合起来, 但
- 双引号内的特殊字符如 $ 等, 可以保有原本的特性, 如下所示: “var=”lang is
$LANG””则“echo $var”可得“lang is zh_TW.UTF-8” - 单引号内的特殊字符则仅为一般字符 ( 纯文本) , 如下所示: “var=’lang is
$LANG’”则“echo $var”可得“lang is $LANG”
- 双引号内的特殊字符如 $ 等, 可以保有原本的特性, 如下所示: “var=”lang is
- 可用跳脱字符“ \ ”将特殊符号( 如 [Enter], $, \, 空白字符, ‘等) 变成一般字符, 如:“myname=VBird\ Tsai”
- 在一串指令的执行中, 还需要借由其他额外的指令所提供的信息时, 可以使用反单引
号“ 指令 ”或 “$( 指令) ”。 特别注意, 那个 ` 是键盘上方的数字键 1 左边那个按键, 而不
是单引号! 例如想要取得核心版本的设置: “version=$( uname -r) ”再“echo
$version”可得“3.10.0-229.el7.x86_64” - 若该变量为扩增变量内容时, 则可用 “$变量名称” 或 ${变量} 累加内容, 如下所示“PATH=”$PATH”:/home/bin”或“PATH=${PATH}:/home/bin”
- 若该变量需要在其他子程序执行, 则需要以 export 来使变量变成环境变量: “export
PATH” - 通常大写字符为系统默认变量, 自行设置变量可以使用小写字符, 方便判断 ( 纯粹依照
使用者兴趣与嗜好) ;
取消变量的方法为使用 unset : “unset 变量名称”例如取消 myname 的设置: “unset
myname”下面让鸟哥举几个例子来让你试看看, 就知道怎么设置好你的变量啰!范例
范例一: 设置一变量 name , 且内容为 VBird
[dmtsai@study ~]$ 12name=VBird
bash: 12name=VBird: command not found... <==屏幕会显示错误! 因为不能以数字开头!
[dmtsai@study ~]$ name = VBird <==还是错误! 因为有空白!
[dmtsai@study ~]$ name=VBird <==OK 的啦!
范例二: 承上题, 若变量内容为 VBird's name 呢, 就是变量内容含有特殊符号时: [dmtsai@study ~]$ name=VBird's name # 单引号与双引号必须要成对, 在上面的设置中仅有一个单引号, 因此当你按下 enter 后, # 你还可以继续输入变量内容。 这与我们所需要的功能不同, 失败啦! # 记得, 失败后要复原请按下 [ctrl]-c 结束! [dmtsai@study ~]$ name="VBird's name" <==OK 的啦! # 指令是由左边向右找→, 先遇到的引号先有用, 因此如上所示, 单引号变成一般字符! [dmtsai@study ~]$ name='VBird's name' <==失败的啦! # 因为前两个单引号已成对, 后面就多了一个不成对的单引号了! 因此也就失败了! [dmtsai@study ~]$ name=VBird\'s\ name <==OK 的啦! # 利用反斜线 ( \) 跳脱特殊字符, 例如单引号与空白键, 这也是 OK 的啦!
范例三: 我要在 PATH 这个变量当中“累加”:/home/dmtsai/bin 这个目录 [dmtsai@study ~]$ PATH=$PATH:/home/dmtsai/bin [dmtsai@study ~]$ PATH="$PATH":/home/dmtsai/bin [dmtsai@study ~]$ PATH=${PATH}:/home/dmtsai/bin # 上面这三种格式在 PATH 里头的设置都是 OK 的! 但是下面的例子就不见得啰!
范例四: 承范例三, 我要将 name 的内容多出 "yes" 呢? [dmtsai@study ~]$ name=$nameyes # 知道了吧? 如果没有双引号, 那么变量成了啥? name 的内容是 $nameyes 这个变量! # 呵呵! 我们可没有设置过 nameyes 这个变量呐! 所以, 应该是下面这样才对! [dmtsai@study ~]$ name="$name"yes [dmtsai@study ~]$ name=${name}yes <==以此例较佳!
什么是“子程序”呢? 就是说, 在我目前这个 shell 的情况下, 去启用另一个新的 shell , 新的那个 shell 就是子程序啦! 在一般的状态下, 父程序的自订变量是无法在子程序内使用的。 但是通过 export 将变量变成环境变量后, 就能够在子程序下面应用了! 很不赖吧! 至于程序的相关概念, 我们会在第十六章程序管理当中提到的喔!范例五: 如何让我刚刚设置的 name=VBird 可以用在下个 shell 的程序? [dmtsai@study ~]$ name=VBird [dmtsai@study ~]$ bash <==进入到所谓的子程序 [dmtsai@study ~]$ echo $name <==子程序: 再次的 echo 一下; <==嘿嘿! 并没有刚刚设置的内容喔! [dmtsai@study ~]$ exit <==子程序: 离开这个子程序 [dmtsai@study ~]$ export name [dmtsai@study ~]$ bash <==进入到所谓的子程序 [dmtsai@study ~]$ echo $name <==子程序: 在此执行! VBird <==看吧! 出现设置值了! [dmtsai@study ~]$ exit <==子程序: 离开这个子程序
范例六: 如何进入到您目前核心的模块目录? [dmtsai@study ~]$ cd /lib/modules/`uname -r`/kernel [dmtsai@study ~]$ cd /lib/modules/$ (uname -r)/kernel # 以此例较佳!
范例七: 取消刚刚设置的 name 这个变量内容 [dmtsai@study ~]$ unset name
单引号与双引号
例题: 在变量的设置当中, 单引号与双引号的用途有何不同? 答: 单引号与双引号的最大不同在于双引号仍然可以保有变量的内容, 但单引号内仅能是一般字符 , 而不会有特殊符号。