鸟哥的 Linux 私房菜 -- 基础学习篇
变数的可变性与方便性
举例来说,我们每个帐号的邮件信箱预设是以 MAIL 这个变数来进行存取的, 当 dmtsai 这个使用者登入时,他便会取得 MAIL
这个变数,而这个变数的内容其实就是 /var/spool/mail/dmtsai, 那如果 vbird 登入呢?他取得的 MAIL 这个变数的内容其实就是
/var/spool/mail/vbird 。 而我们使用信件读取指令 mail 来读取自己的邮件信箱时,嘿嘿,这支程式可以直接读取 MAIL 这个变数的内容,
就能够自动的分辨出属于自己的信箱信件啰!这样一来,设计程式的设计师就真的很方便的啦!
[图片上传中。。。(1)]图 2.1.1、程式、变数与不同使用者的关系
如上图所示,由于系统已经帮我们规划好 MAIL 这个变数,所以使用者只要知道 mail 这个指令如何使用即可, mail 会主动的取用 MAIL
这个变数,就能够如上图所示的取得自己的邮件信箱了!(注意大小写,小写的 mail 是指令, 大写的 MAIL 则是变数名称喔!)
那么使用变数真的比较好吗?这是当然的!想像一个例子,如果 mail 这个指令将 root 收信的邮件信箱 (mailbox) 档名为
/var/spool/mail/root 直接写入程式码中。那么当 dmtsai 要使用 mail 时,将会取得 /var/spool/mail/root
这个档案的内容! 不合理吧!所以你就需要帮 dmtsai 也设计一个 mail 的程式,将 /var/spool/mail/dmtsai 写死到 mail
的程式码当中! 天呐!那系统要有多少个 mail 指令啊?反过来说,使用变数就变的很简单了!因为你不需要更动到程式码啊! 只要将 MAIL
这个变数带入不同的内容即可让所有使用者透过 mail 取得自己的信件!当然简单多了!
影响 bash 环境操作的变数
某些特定变数会影响到 bash 的环境喔!举例来说,我们前面已经提到过很多次的那个 PATH 变数! 你能不能在任何目录下执行某个指令,与 PATH
这个变数有很大的关系。例如你下达 ls 这个指令时,系统就是透过 PATH 这个变数里面的内容所记录的路径顺序来搜寻指令的呢!如果在搜寻完 PATH
变数内的路径还找不到 ls 这个指令时, 就会在荧幕上显示‘ command not found ’的错误讯息了。
如果说的学理一点,那么由于在 Linux System 下面,所有的执行续都是需要一个执行码, 而就如同上面提到的,你‘真正以 shell 来跟 Linux 沟通,是在正确的登入 Linux 之后!
’这个时候你就有一个 bash
的执行程序,也才可以真正的经由 bash 来跟系统沟通啰!而在进入 shell 之前,也正如同上面提到的,由于系统需要一些变数来提供他资料的存取
(或者是一些环境的设定参数值, 例如是否要显示彩色等等的) ,所以就有一些所谓的‘环境变数
’
需要来读入系统中了!这些环境变数例如 PATH、HOME、MAIL、SHELL 等等,都是很重要的,
为了区别与自订变数的不同,环境变数通常以大写字元来表示呢!
脚本程式设计 (shell script) 的好帮手
这些还都只是系统预设的变数的目的,如果是个人的设定方面的应用呢:例如你要写一个大型的 script
时,有些资料因为可能由于使用者习惯的不同而有差异,比如说路径好了,由于该路径在 script 被使用在相当多的地方,如果下次换了一部主机,都要修改 script
里面的所有路径,那么我一定会疯掉! 这个时候如果使用变数,而将该变数的定义写在最前面,后面相关的路径名称都以变数来取代, 嘿嘿!那么你只要修改一行就等于修改整篇
script 了!方便的很!所以,良好的程式设计师都会善用变数的定义!Bash shell 的功能
命令编修能力 (history):
命令与档案补全功能: ([tab] 按键的好处)
[Tab] 接在一串指令的第一个字的后面,则为命令补全;
[Tab] 接在一串指令的第二个字以后时,则为‘档案补齐’!
命令别名设定功能: (alias)
工作控制、前景背景控制: (job control, foreground, background)
程式化脚本: (shell scripts)
万用字元: (Wildcard)
Bash shell 的内建命令: type
[root@www ~]# type [-tpa] name
选项与参数:
:不加任何选项与参数时,type 会显示出 name 是外部指令还是 bash 内建指令
-t :当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义:
file :表示为外部指令;
alias :表示该指令为命令别名所设定的名称;
builtin :表示该指令为 bash 内建的指令功能;
-p :如果后面接的 name 为外部指令时,才会显示完整档名;
-a :会由 PATH 变数定义的路径中,将所有含 name 的指令都列出来,包含 alias
范例一:查询一下 ls 这个指令是否为 bash 内建?
[root@www ~]# type ls
ls is aliased to `ls --color=tty' <==未加任何参数,列出 ls 的最主要使用情况
[root@www ~]# type -t ls
alias <==仅列出 ls 执行时的依据
[root@www ~]# type -a ls
ls is aliased to `ls --color=tty' <==最先使用 aliase
ls is /bin/ls <==还有找到外部指令在 /bin/ls
范例二:那么 cd 呢?
[root@www ~]# type cd
cd is a shell builtin <==看到了吗? cd 是 shell 内建指令
透过 type 这个指令我们可以知道每个指令是否为 bash 的内建指令。 此外,由于利用 type
搜寻后面的名称时,如果后面接的名称并不能以执行档的状态被找到, 那么该名称是不会被显示出来的。也就是说, type 主要在找出‘执行档’而不是一般档案档名喔!
呵呵!所以,这个 type 也可以用来作为类似 which
指令的用途啦!
找指令用的!
Shell 的变数功能
变数是 bash 环境中非常重要的一个玩意儿,我们知道 Linux 是多人多工的环境,每个人登入系统都能取得一个 bash , 每个人都能够使用 bash 下达 mail 这个指令来收受‘自己’的邮件,问题是, bash 是如何得知你的邮件信箱是哪个档案? 这就需要‘变数’的帮助啦!所以,你说变数重不重要呢?底下我们将介绍重要的环境变数、变数的取用与设定等资料, 呼呼!动动脑时间又来到啰!_
那么,什么是‘变数’呢?简单的说,就是让某一个特定字串代表不固定的内容就是了。举个大家在国中都会学到的数学例子, 那就是:‘ y = ax + b ’这东西,在等号左边的(y)就是变数,在等号右边的(ax+b)就是变数内容。 要注意的是,左边是未知数,右边是已知数喔! 讲的更简单一点,我们可以‘用一个简单的 "字眼" 来取代另一个比较复杂或者是容易变动的资料’。这有什么好处啊?最大的好处就是‘方便!’