📄 0320bash.htm
字号:
<!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en"><html><head> <meta http-equiv="Content-Type" content="text/html; "> <meta name="Author" content="VBird"> <meta name="GENERATOR" content="Mozilla/4.5 [zh-TW] (WinNT; I) [Netscape]"> <title>鸟哥的 Linux 私房菜 -- 学习 BASH Shell 咯</title><!-- saved from url=(0022)http://internet.e-mail --><style> <!-- body{background-image=url(http://linux.vbird.org/VBirdLinux.jpg);background-ATTACHMENT=FIXED} --></style></head><body nosave="" background="0320bash_files/VBirdLinux.jpg"><center><center><b><font size="+2" color="#3333ff"><font face="SimSun">鸟哥的</font><font face="Times New Roman,Times"> Linux </font><font face="SimSun">与</font><font face="Times New Roman,Times"> ADSL </font><font face="SimSun">私房菜</font></font></b><br><a href="http://linux.vbird.org/" target="_top"><img src="0320bash_files/VBirdTitle2.jpg" nosave="" border="0" height="25" width="90"></a><a href="http://linux.vbird.org/linux_basic"><img src="0320bash_files/icon_system.gif" nosave="" border="0" height="25" width="90"></a><a href="http://linux.vbird.org/linux_server"><img src="0320bash_files/icon_server.gif" nosave="" border="0" height="25" width="90"></a><a href="http://linux.vbird.org/linux_security"><img src="0320bash_files/icon_security.jpg" nosave="" border="0" height="25" width="90"></a><a href="http://phorum.vbird.org/" target="_blank"><img src="0320bash_files/icon_forums.gif" nosave="" border="0" height="25" width="90"></a><a href="http://linux.vbird.org/adsl"><img src="0320bash_files/icon_adsl.gif" nosave="" border="0" height="25" width="90"></a><br><hr width="100%"></center><font size="+2" color="#3333ff"><a href="http://linux.vbird.org//linux_basic/0320bash.php" target="_self"><font face="SimSun">认识</font><font face="Times New Roman,Times">BASH Shell</font></a></font></center><div align="right"><font size="-1" color="#3333ff" face="SimSun">最近更新日期:2003/02/10</font></div><font size="+1" color="#000099"><a href="#whatisshell">什么是 Shell</a></font><br><font size="+1" color="#000099"><a href="#bash">BASH Shell</a></font><br><font color="#000099"><font size="+1"><a href="#variable">变量与变量的设定</a>:</font><a href="#echo">echo</a>,<a href="#env">env</a>,<a href="#set">set</a>,<a href="#rule">变量设定规则</a>,<a href="#export">export</a>,<a href="#unset">unset</a>,<a href="#effective_variable">变量的有效范围</a>,<a href="#read">read</a>,<a href="#array">array</a>,<a href="#random">$RANDOM</a>,<a href="#eval">eval</a>,重要的环境变量(?, HOME, SHELL, MAIL, HISTSIZE...)</font><br><font color="#000099"><font size="+1"><a href="#aliasandhistory">命令别名与历史命令</a></font>:<a href="#aliascommand">alias(设定命令别名)</a>,<a href="#history">history</a>,<a href="#historycom">!command</a>,</font><br><font color="#000099"><font size="+1"><a href="#BASHsettings">bash shell的设定档案</a>:</font><a href="#source">source</a>,</font><br><font size="+1" color="#000099"><a href="#regulare%20express">万用字符与特殊符号</a>:</font><br><font size="+1" color="#000099"><a href="#PATHsettings">绝对路径与相对路径</a></font><br><font size="+1" color="#000099"><a href="#redirect">命令重导向( redirect )</a></font><br><font size="+1" color="#000099"><a href="#pipe">管线命令 ( pipe)</a>: </font><a href="#cut">cut</a>,<a href="#sort">sort</a>,<a href="#wc">wc</a>,<a href="#uniq">uniq</a>,<a href="#tee">tee</a>,<a href="#tr">tr</a>,<a href="#split">split</a>,<br><font size="+1" color="#000099"><a href="#FAQ">本章习题练习</a></font><br><hr width="100%"><a name="whatisshell"></a><font size="+1" color="#000099">什么是Shell</font><blockquote>这应该是个蛮有趣的话题:『<font color="#000066">什么是 Shell</font>?』相信只要摸过计算机,对于操作系统(不论是 Linux 、 Unix 或者是 Windows)有点概念的朋友们大多听过这个名词,因为只要有『操作系统』那么就离不开Shell 这个东西。不过,在讨论 Shell 之前,我们先来了解一下计算机的运作状况吧!举个例子来说:<font color="#000066">当你要计算机传输出来『音乐』的时候,你的计算机需要什么东西呢</font>?<ol><li>当然就是需要你的硬件有『声卡芯片』这个硬件配备,否则怎么会有声音;</li><li>操作系统的核心可以支持这个芯片组,当然还需要提供芯片的驱动程序啰;</li><li>需要使用者(就是你)输入发生声音的指令啰!</li></ol>这就是基本的一个输出声音的需要的步骤!那么也就是说,你必须要『输入』一个指令之后,『硬件』才会透过你下达的指令来工作!嘿嘿!那么硬件如何知道你下达的指令呢?那就是kernel (核心)的控制工作了!了解了吗?没错!也就是说,<font color="#000066">我们必须要透过『Shell 』将我们输入的指令与 Kernel 沟通,好让 Kernel 可以控制硬件来正确无误的工作</font>!基本上,我们可以透过底下这两张图来说明一下:<center><img src="0320bash_files/0320bash_1.jpg" nosave="" height="378" width="415"><br><img src="0320bash_files/0320bash_2.jpg" nosave="" height="160" width="160"></center></blockquote><blockquote>基本上,替我们工作的是『硬件』,而控制硬件的是『核心』,再来,我们使用者乃是利用『Shell』控制一些kernel 提供的 『工具 Utility』来操控硬件替我们正确的工作。再进一步来说,由于kernel 听不懂人类的语言,而人类也没有办法直接记得 kernel 的语言,所以两者的沟通就得藉由shell 来支援了!(其实早期的 DOS 的文字接口也是使用 shell 来沟通呀!那个shell 的名称就叫做 command.com ,还记得吗? ^_^)<br> <br>以字面上的意思来说, kernel 是『核心』的意思,而 Shell 是『壳』的意思,呵呵!也就是说,shell 是最外头的咚咚!而 kernel 乃是最内层的的咚咚啦!核心是操作系统的最底层的东西!这个核心里头包括了各种的支持硬件的工具!当然啰,如果你的硬件太新,而你的kernel 并没有支持的话,那么很抱歉,你的 Shell 能力再怎么强,也没有办法使硬件工作的!这样可以了解了吗?呵呵!没错!使计算机主机工作的正是核心的任务,但是操作核心来替使用者工作的,却是shell 喔!因此,有时候你的 shell 搞了老半天,硬件却不能工作的时候,请注意,您的『核心』是否正确呢?阿!扯远了!这是kernel 章节才要说的东西??<ul><li><b><font color="#000099">我干嘛要学习 Shell 呢?</font></b></li><br>常常听到这个问题:『<font color="#000066">我干嘛要学习 shell 呢?不是已经有很多的工具可以提供我设定我的主机了?我为何要花这么多时间去学指令呢?不是以X-Window 按一按几个按钮就可以搞定了吗?为什么要这么麻烦?</font>』唉?还是得一再地强调,X-Window还有 Web 接口的设定工具例如 webmin 是真的好用的家伙,他真的可以帮助我们很简易的设定好我们的主机,甚至是一些很进阶的设定都可以帮我们搞定。但是VBird 在序章里面也已经提到过相当多次了, X-Window 的接口虽然亲善,功能虽然强大,而web 接口的工具也可以提供我们很友善的服务,但是毕竟他是整合的一个套件而已,并非是一个完整的套件,所以某些时候当你升级或者是使用其它套件管理模块(例如 tarball 而非 rpm 档案等等 )时,就会造成设定的困扰了,此外,远程联机时,文字接口的传输速度一定比较快,而且,较不容易出现断线或者是信息外流的问题,因此,shell 真的是得学习的一项工具。而且,他可以让您更深入 Linux ,更了解他,而不是只会按一按鼠标而已!所谓『天助自助者!』多摸一点文字模式的东西,会让你与Linux 更亲近呢!<br> <br>有些朋友也很可爱,常会说:『<font color="#000066">我学这么多干什么?又不常用,也用不到</font>!』嘿嘿!有没有听过『书到用时方恨少?』当你的主机一切安然无恙的时候,您当然会觉得好像学这么多的东西一点帮助也没有呀!万一,某一天真的不幸给他中标了,您该如何是好?是直接重新安装?还是先追踪入侵来源后进行漏洞的修补?或者是干脆就关站好了?这当然涉及很多的考虑,但就以VBird 的观点来看,多学一点总是好的,尤其我们可以有备而无患嘛!甚至学的不精也没有关系,了解概念也就OK 啦!毕竟没有人要您一定要被这么多的内容啦!了解概念就很了不起了!<br> <br>此外,<b><font color="#000066">如果您真的有心想要将您的主机管理的好,那么良好的shell 程序编写是一定需要的啦</font></b>!就 VBird 来说,我管理的主机虽然还不算多,只有区区不到十部,但是如果每部主机都要花上几十分钟来查阅他的log file 以及相关的信息,那么我可能会疯掉!基本上,也太没有效率了!这个时候,如果能够藉由shell 提供的命令重导向( 或称数据流重导向 ),以及管线命令,呵呵!那么我分析log file 只要花费不到十分钟就可以看完所有的主机之重要信息了!相当的好用呢!<br> <br>由于学习 shell 的好处真的是多多啦!所以,如果您是个系统管理员,或者有心想要管理系统的话,那么shell 这个东西与 shell scripts 这个东西,真的真的有必要看一看!</ul></blockquote><hr width="100%"><a name="bash"></a><font size="+1" color="#000099">BASHShell</font><blockquote>知道什么是 Shell 之后,那么我们来了解一下 Linux 使用的是哪一个shell 呢?什么!哪一个?难道说 shell 不就是『一个 shell 吗?』哈哈!那可不!由于早年的Unix 年代,发展者众,所以由于 shell 依据发展者的不同就有许多的版本,例如常听到的Bourne SHell (sh) 、在 Sun 里头预设的 C SHell、 商业上常用的 K SHell、,还有 TCSH 等等,每一种 Shell 都各有其特点。至于 Linux 使用的这一种版本就称为『<font color="#000066">Bourne Again SHell (简称 bash )</font> 』,这个 Shell 是 Bourne Shell的增强版本,也是基准于 GNU 的架构下发展出来的呦!<p>在介绍 shell 的优点之前,先来说一说 shell 的简单历史吧:第一个流行的shell 是由 Steven Bourne 发展出来的,为了纪念他所以就称为 Bourne shell,或直接简称为 sh !而后来另一个广为流传的 shell 是由柏克莱大学的 BillJoy 设计依附于 BSD 版的 Unix 系统中的 shell ,这个 shell 的语法有点类似C 语言,所以才得名为 C shell ,简称为 csh !由于在学术界 Sun 主机势力相当的庞大,而Sun 主要是 BSD 的分支之一,所以 C shell 也是另一个很重要而且流传很广的shell 之一(因为太多的程序设计师使用的就是 C 语言啦!)!</p><p>好了,那么 BASH 是怎么一回事呢?这个 shell 是 GNU 计划中重要的工具软件之一,目前也是GNU 操作系统中标准的 shell ,他主要兼容于 sh ,并且依据一些使用者需求,而加强的shell 版本,可以说目前几乎所有的 Linux distribution 都是使用 bash 作为管理核心的主要shell !因此,不论您使用的是那个 distribution ,你都难逃需要学习 bash 的宿命啦!那么这个shell 有什么好处,干嘛 Linux 要使用他作为预设的 shell 呢? BASH 主要的优点有底下几个:</p><ul><li><b><font color="#000099">命令编修能力(类似 DOS 的 doskey 功能):</font></b></li><br>使用 bash 里头,个人认为相当棒的一个功能就是『他能记忆使用过的指令!』这功能真的相当的棒!因为我只要在指令列按『上下键』就可以找到前一个输入的指令!而在Mandrake 9.0 预设的指令记忆功能可以到达 1000 个!也就是说,你曾经下达过的指令都被记录下来了,记录的档案在你的家目录内的<b><font color="#000066">.bash_history</font></b>!不过,需要留意的是,<font color="#000066">~/.bash_history 记录的是前一次登入以前所执行过的指令,而至于这一次登入所执行的指令都被暂存在暂内存中,当您成功的注销系统后,该指令记忆才会记录到.bash_history 当中</font>!这有什么功能呢?最大的好处就是可以『<b><font color="#000066">查询曾经做过的举动</font></b>!』,如此可以知道你的执行步骤,那么就可以追踪您曾下达的指令,以作为除错的工具!但如此一来也有个烦恼,就是如果被黑客入侵了,那么他只要翻你曾经执行过的指令,刚好你的指令又跟系统有关(例如直接输入MySQL 的密码在指令列上面)那么很容易就被破解你的 Linux 主机!所以,<b><font color="#000066">最好是将记录的指令数目减小一点较好</font></b>!</ul><ul><li><b><font color="#000099">档案比对补全功能(比对数据正确性):</font></b></li><br>这个功能也相当的棒!主要分为指令补全与文件名称补全:<ul><li>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -