日期:2014-05-16  浏览次数:20874 次

鸟哥的linux私房菜(基础篇--14、认识BASH Shell)笔记

???? shell 依据发展者的不同就有许多的版本,例如常听到的 Bourne SHell (sh) 、在 Sun 里头预设的 C SHell、 商业上常用的 K SHell、, 还有 TCSH 等等,每一种 Shell 都各有其特点。至于 Linux 使用的这一种版本就称为『 Bourne Again SHell (简称 bash) 』,这个 Shell 是 Bourne Shell 的增强版本,也是基准于 GNU 的架构下发展出来的呦!

?

Bash shell 的功能

? 命令编修能力(类似 DOS 的 doskey 功能):

? 命令与档案补全功能:

? 命令别名(alias)设定功能:

? 工作控制(jobs)、前景背景控制:

? Shell scripts 的强大功能:

? 万用字符!

?

1、Bash shell 的内建命令: type

[root@linux ~]# type [-tpa] name
参数:
:不加任何参数时,则 type 会显示出那个 name 是外部指令还是 bash 内建的指令!
-t :当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义:
file :表示为外部指令;
alias :表示该指令为命令别名所设定的名称;
builtin :表示该指令为 bash 内建的指令功能;
-p :如果后面接的 name 为指令时,会显示完整文件名(外部指令)或显示为内建指令;
-a :会将由 PATH 变量定义的路径中,将所有含有 name 的指令都列出来,包含 alias

?

2、变量的取用与设定:echo, 变量设定规则, unset

范例六:如何进入到您目前核心的模块目录?
[root@linux ~]# cd /lib/modules/`uname -r`/kernel
# 每个操作系统核心版本都不相同,以 FC4 为例,他的预设核心版本是
# 2.6.11-1.1369_FC4 所以,他的模块目录在 /lib/modules/2.6.11-1.1369_FC4/kernel 。
# 因为每个 distributions 的这个值都不相同,但是我们却可以利用 uname -r 这个指令
# 先取得版本信息,所以啰,就可以透过上面指令当中的内含指令 `uname -r`
# 先取得版本输出到 cd .. 那个指令当中,就能够顺利的进入目前核心的驱动程序所放置
# 的目录啰!很方便吧!

?

范例七:取消刚刚设定的 name 这个变量内容
[root@linux ~]# unset name

?

单引号与双引号的用途有何不同?

[root@linux ~]# name=VBird

[root@linux ~]# echo $name

VBird

[root@linux ~]# myname="$name its me"

[root@linux ~]# echo $myname

VBird its me

[root@linux ~]# myname='$name its me'

[root@linux ~]# echo $myname

$name its me

?

3、一些环境变量的说明: env

[root@linux ~]# declare -i number=$RANDOM*10/32767 ; echo $number
8 <== 此时会随机取出 0~9 之间的数值喔!

?

4、其它所有的变量说明: set

? PS1:(提示字符的设定)

[root@linux home]# PS1='[\u@\h \w \A #\#]\$ '
[root@linux /home 17:02 #85]#
# 看到了吗?提示字符变了!变的很有趣吧!

?

? $:(关于本 shell 的 PID)

echo $$

?

? ?:(关于上个执行指令的回传码)

[root@linux ~]# echo $SHELL
/bin/bash
[root@linux ~]# echo $?
0
# 因为上个指令执行过程中,并没有错误,为成功的执行完毕,所以回传 0 。
[root@linux ~]# 12name=VBird
-bash: 12name=VBird: command not found
[root@linux ~]# echo $?
127
# 发生错误啦!所以 echo $? 时,就会出现错误的代码!
# 我们可以利用这个代码来搜寻错误的原因喔!
[root@linux ~]# echo $?
0
# 咦!怎么又变成正确了?这是因为 "?" 只与『上一个执行指令』有关,
# 所以,我们上一个指令是执行『 echo $? 』,当然没有错误,所以是 0 没错!

?

? OSTYPE, HOSTTYPE, MACHTYPE:(主机硬件与核心的等级)

?

5、自订变量转成环境变量: export

?

6、语系档案的变量 (locale)

?

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

? read

[root@linux ~]# read [-pt] variable
参数:
-p :后面可以接提示字符!
-t :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦!

?

? declare / typeset

[root@linux ~]# declare [-aixr] variable
参数:
-a :将后面的 variable 定义成为数组 (array)
-i :将后面接的 variable 定义成为整数数字 (integer)

-x :用法与 export 一样,就是将后面的 variable 变成环境变量;
-r :将一个 variable 的变量设定成为 readonly ,该变量不可被更改内容,也不能 unset

?

8、与档案系统及程序的限制关系: ulimit

?

9、命令别名设定: alias, unalias

?

10、历史命令:history

?

11、登录讯息显示数据: /etc/issue, /etc/motd

?

12、系统设定值

? /etc/sysconfig/i18n

? /etc/profile

? /etc/bashrc

? /etc/profile.d/*.sh

? /etc/man.config

这就是系统在设定的时候常常会使用的档案!需要特别留意的是,通常设定完了这几个档案之后,都需要先 logout 在 login 之后才会将设定整个启动起来!

?

13、个人设定值

? ~/.bash_profile, ~/.bash_login, ~/.profile

? ~/.bashrc

? ~/.bash_history

? ~/.bash_logout

?

14、

在我们登入 bash 的时候,这些设定档到底是如何读取的呢?他是这样读取的:
1. 先读取 /etc/profile ,再根据 /etc/profile 的内容去读取其它额外的设定档, 例如 /etc/profile.d 与 /etc/inputrc 等等设定档;
2. 根据不同的使用者,到使用者家目录去读取 ~/.bash_profile 或 ~/.bash_login 或 ~/.profile 等设定档;
3. 根据不同使用者,到他家目录去读取 ~/.bashrc 。

?

15、

利用 source 或小数点 (.) 都可以将设定档的内容读进来目前的 shell 环境中!

[root@linux ~]# source file
范例:
[root@linux ~]# source ~/.bashrc
[root@linux ~]# .