初学的同学鸟哥BASH Shell.docx
- 文档编号:5370406
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:48
- 大小:53.46KB
初学的同学鸟哥BASH Shell.docx
《初学的同学鸟哥BASH Shell.docx》由会员分享,可在线阅读,更多相关《初学的同学鸟哥BASH Shell.docx(48页珍藏版)》请在冰点文库上搜索。
初学的同学鸟哥BASHShell
引用:
认识BASHShell
文字模式(commandline)这种指令下达的方式,在Linux里面,其实就相当于是bash的工具与接口!
因为Linux就是以bash为预设的shell的!
那么前几章我们都已经很快乐的进行了很多的指令下达啰~所以说,bashshell根本就不难吧~是啦!
只要能够熟悉的话,那么确实他也不是这么不可亲近的一项工具啊~这个章节中,鸟哥会由变量谈起,先讲到环境变量的功能与修改的问题,然后会继续提到历史指令的运用。
接下来,就会谈一下『数据流重导向』这个重要概念,最后就是管线命令的利用啦!
好好清一清脑门,准备用功去啰~^_^这个章节几乎是所有commandline与未来主机维护与管理的重要基础,一定要好好仔细的阅读喔!
1.Bashshell
1.1什么是shell?
1.2系统的shell与/etc/shells功能
1.3Bashshell的功能
1.4Bashshell的内建命令:
type
1.5指令的下达
2.Shell的变量功能
2.1变量的取用与设定:
echo,变量设定规则,unset
2.2变数的用途?
2.3环境变量的功能:
env,一些重要的环境变量,set,export
2.4语系档案的变量(locale)
2.5变量的有效范围:
2.6变量键盘读取、数组与宣告:
read,declare,array
2.7与档案系统及程序的限制关系:
ulimit
2.8其它额外变量功能
3.命令别名与历史命令:
3.1命令别名设定:
alias,unalias
3.2历史命令:
history,HISTSIZE
4.Bashshell使用环境:
4.1绝对路径与相对路径
4.2登录讯息显示数据:
/etc/issue,/etc/motd
4.3环境设定档:
bashrc,~/.bashrc,~/.profile,profile...,/etc/inputrc,source
4.4终端机的环境设定:
stty,set
4.5万用字符与特殊符号:
5.数据流重导向(redirecte)
5.1何谓数据流重导向?
5.2命令执行的判断依据:
;,&&,||
6.管线命令(pipe):
6.1撷取命令:
cut,grep
6.2排序命令:
sort,wc,uniq
6.3双向重导向:
tee
6.4字符转换命令:
tr,col,join,paste,expand
6.5分割命令:
split
6.6参数代换:
xargs
6.7关于减号-的用途
7.本章习题练习
--------------------------------------------------------------------------------
Bashshell
我们在前面的什么是Linux那个章节当中,提到了,管理整个硬件的其实是核心(kernel),那我们一般使用者(user)则是以shell来跟核心沟通~让核心达到我们所想要达到的工作目的。
那么系统有多少shell可用呢?
为什么我们要使用bash啊?
!
底下分别来谈一谈喔!
--------------------------------------------------------------------------------
什么是Shell?
这应该是个蛮有趣的话题:
『什么是Shell?
』相信只要摸过计算机,对于操作系统(不论是Linux、Unix或者是Windows)有点概念的朋友们大多听过这个名词,因为只要有『操作系统』那么就离不开Shell这个东西。
不过,在讨论Shell之前,我们先来了解一下计算机的运作状况吧!
举个例子来说:
当你要计算机传输出来『音乐』的时候,你的计算机需要什么东西呢?
当然就是需要你的硬件有『声卡芯片』这个硬件配备,否则怎么会有声音;
操作系统的核心可以支持这个芯片组,当然还需要提供芯片的驱动程序啰;
需要使用者(就是你)输入发生声音的指令啰!
这就是基本的一个输出声音的需要的步骤!
那么也就是说,你必须要『输入』一个指令之后,『硬件』才会透过你下达的指令来工作!
嘿嘿!
那么硬件如何知道你下达的指令呢?
那就是kernel(核心)的控制工作了!
了解了吗?
没错!
也就是说,我们必须要透过『Shell』将我们输入的指令与Kernel沟通,好让Kernel可以控制硬件来正确无误的工作!
基本上,我们可以透过底下这两张图来说明一下:
图一、硬件、核心与使用者的相关性图示
图二、硬件、核心与使用者的相关性图示
基本上,替我们工作的是『硬件』,而控制硬件的是『核心』,再来,我们使用者乃是利用『Shell』控制一些kernel提供的『工具(Utility)』来操控硬件替我们正确的工作。
再进一步来说,由于kernel听不懂人类的语言,而人类也没有办法直接记得kernel的语言,所以两者的沟通就得藉由shell来支持了!
(其实早期的DOS的文字接口也是使用shell来沟通呀!
那个shell的名称就叫做,还记得吗?
^_^)
以字面上的意思来说,kernel是『核心』的意思,而Shell是『壳』的意思,呵呵!
也就是说,shell是最外头的咚咚!
而kernel乃是最内层的的咚咚啦!
核心是操作系统的最底层的东西!
这个核心里头包括了各种的支持硬件的工具!
当然啰,如果你的硬件太新,而你的kernel并没有支持的话,那么很抱歉,你的Shell能力再怎么强,也没有办法使硬件工作的!
这样可以了解了吗?
呵呵!
没错!
使计算机主机工作的正是核心的任务,但是操作核心来替使用者工作的,却是shell喔!
因此,有时候你的shell搞了老半天,硬件却不能工作的时候,请注意,您的『核心』是否正确呢?
阿!
扯远了!
这是kernel章节才要说的东西。
我干嘛要学习文字模式的Shell呢?
我们常常提到的shell其实是比较狭隘的定义,一般来说,在Linux里头,所谓的shell就是指BASH这个文字模式的shell啰。
但是,广义的shell也可以是KDE之类的图形接口控制软件呢!
因为他也可以帮我们与kernel进行沟通啊!
不过,在鸟哥的Linux私房菜里面,如果没有特别说明的话,那么我们的shell指的是比较狭义的,也就是文字模式的shell喔!
另外,鸟哥常常听到这个问题:
『我干嘛要学习shell呢?
不是已经有很多的工具可以提供我设定我的主机了?
我为何要花这么多时间去学指令呢?
不是以XWindow按一按几个按钮就可以搞定了吗?
为什么要这么麻烦?
』唉~还是得一再地强调,XWindow还有Web接口的设定工具例如webmin是真的好用的家伙,他真的可以帮助我们很简易的设定好我们的主机,甚至是一些很进阶的设定都可以帮我们搞定。
但是鸟哥在序章里面也已经提到过相当多次了,XWindow的接口虽然亲善,功能虽然强大,而web接口的工具也可以提供我们很友善的服务,但是毕竟他是将所有利用到的套件都整合在一起的一个套件而已,并非是一个完整的套件,所以某些时候当你升级或者是使用其它套件管理模块(例如tarball而非rpm档案等等)时,就会造成设定的困扰了。
此外,远程联机时,文字接口的传输速度一定比较快,而且,较不容易出现断线或者是信息外流的问题,因此,shell真的是得学习的一项工具。
而且,他可以让您更深入Linux,更了解他,而不是只会按一按鼠标而已!
所谓『天助自助者!
』多摸一点文字模式的东西,会让你与Linux更亲近呢!
有些朋友也很可爱,常会说:
『我学这么多干什么?
又不常用,也用不到!
』嘿嘿!
有没有听过『书到用时方恨少?
』当你的主机一切安然无恙的时候,您当然会觉得好像学这么多的东西一点帮助也没有呀!
万一,某一天真的不幸给他中标了,您该如何是好?
是直接重新安装?
还是先追踪入侵来源后进行漏洞的修补?
或者是干脆就关站好了?
这当然涉及很多的考虑,但就以鸟哥的观点来看,多学一点总是好的,尤其我们可以有备而无患嘛!
甚至学的不精也没有关系,了解概念也就OK啦!
毕竟没有人要您一定要被这么多的内容啦!
了解概念就很了不起了!
此外,如果您真的有心想要将您的主机管理的好,那么良好的shell程序编写是一定需要的啦!
就鸟哥自己来说,我管理的主机虽然还不算多,只有区区不到十部,但是如果每部主机都要花上几十分钟来查阅他的logfile以及相关的信息,那么我可能会疯掉!
基本上,也太没有效率了!
这个时候,如果能够藉由shell提供的命令重导向(或称数据流重导向),以及管线命令,呵呵!
那么我分析logfile只要花费不到十分钟就可以看完所有的主机之重要信息了!
相当的好用呢!
由于学习shell的好处真的是多多啦!
所以,如果您是个系统管理员,或者有心想要管理系统的话,那么shell这个东西与shellscripts这个东西,真的真的有必要看一看!
--------------------------------------------------------------------------------
系统的shell与/etc/shells功能
知道什么是Shell之后,那么我们来了解一下Linux使用的是哪一个shell呢?
什么!
哪一个?
难道说shell不就是『一个shell吗?
』哈哈!
那可不!
由于早年的Unix年代,发展者众,所以由于shell依据发展者的不同就有许多的版本,例如常听到的BourneSHell(sh)、在Sun里头预设的CSHell、商业上常用的KSHell、,还有TCSH等等,每一种Shell都各有其特点。
至于Linux使用的这一种版本就称为『BourneAgainSHell(简称bash)』,这个Shell是BourneShell的增强版本,也是基准于GNU的架构下发展出来的呦!
在介绍shell的优点之前,先来说一说shell的简单历史吧:
第一个流行的shell是由StevenBourne发展出来的,为了纪念他所以就称为Bourneshell,或直接简称为sh!
而后来另一个广为流传的shell是由柏克莱大学的BillJoy设计依附于BSD版的Unix系统中的shell,这个shell的语法有点类似C语言,所以才得名为Cshell,简称为csh!
由于在学术界Sun主机势力相当的庞大,而Sun主要是BSD的分支之一,所以Cshell也是另一个很重要而且流传很广的shell之一(因为太多的程序设计师使用的就是C语言啦!
)!
(还记得我们在Linux是什么那一章提到的吧?
Sun公司的创始人就是BillJoy,而BSD最早就是BillJoy发展出来的啊!
)。
那么目前我们的Linux(以FC4为例)有多少我们可以使用的shells呢?
你可以检查一下/etc/shells这个档案,至少就有底下这几个可以用的shells:
/bin/sh(已经被/bin/bash所取代)
/bin/bash(就是Linux预设的shell)
/bin/ksh(Kornshell由AT&TBelllab.发展出来的,兼容于bash)
/bin/tcsh(整合CShell,提供更多的功能)
/bin/csh(已经被/bin/tcsh所取代)
/bin/zsh(基于ksh发展出来的,功能更强大的shell)
由上面的说明中,我们大概可以发现,其实各主要shell的功能都差不多,有的只是语法上面的不同而已。
目前一般的使用者使用习惯上,似乎是以bash及csh为主要的两个shell。
OK!
这么多的shell我要使用哪一个啊?
呵呵!
使用Linux支持最广泛的bash就好了!
不要想太多!
另外,咦!
为什么我们系统上的shell要写入/etc/shells这个档案啊?
这是因为系统某些服务在运行过程中,会去检查使用者能够使用的shells,而这些shell的查询就是藉由/etc/shells这个档案啰!
举例来说,某些FTP网站会去检查使用者的可用shell,而如果你不想要让这些使用者使用FTP以外的主机资源时,可能会给予该使用者一些怪怪的shell,让使用者无法以其它服务登入主机。
这个时候,你就得将那些怪怪的shell写到/etc/shells当中了。
举例来说,我们的FC4的/etc/shells里头就有个/sbin/nologin档案的存在,这个就是我们说的怪怪的shell啰~
那么,再想一想,我这个使用者什么时候可以取得shell来工作呢?
还有,我这个使用者预设会取得哪一个shell啊?
!
还记得我们在首次进入Linux--以文字方式登入那个章节当中提到的登入动作吧?
当我登入的时候,系统就会给我一个shell让我来工作了。
而这个登入取得的shell就记录在/etc/passwd这个档案内!
这个档案的内容是啥?
[root@linux~]#cat/etc/passwd
root:
x:
0:
0:
root:
/root:
/bin/bash
bin:
x:
1:
1:
bin:
/bin:
/sbin/nologin
daemon:
x:
2:
2:
daemon:
/sbin:
/sbin/nologin
.....(中间省略).....
如上所示,在每一行的最后一个数据,就是您登入后,可以取得的预设的shell啦!
那你也会看到,root是/bin/bash,不过,系统账号bin与daemon等等,就使用那个怪怪的/sbin/nologin啰~关于使用者这部分的内容,我们留在账号管理时提供更多的说明。
--------------------------------------------------------------------------------
Bashshell的功能
既然/bin/bash是Linux预设的shell,那么总是得了解一下这个玩意儿吧!
BASH是怎么一回事呢?
这个shell是GNU计划中重要的工具软件之一,目前也是GNU操作系统中标准的shell,他主要兼容于sh,并且依据一些使用者需求,而加强的shell版本,可以说目前几乎所有的Linuxdistribution都是使用bash作为管理核心的主要shell!
因此,不论您使用的是那个distribution,你都难逃需要学习bash的宿命啦!
那么这个shell有什么好处,干嘛Linux要使用他作为预设的shell呢?
BASH主要的优点有底下几个:
命令编修能力(类似DOS的doskey功能):
使用bash里头,个人认为相当棒的一个功能就是『他能记忆使用过的指令!
』这功能真的相当的棒!
因为我只要在指令列按『上下键』就可以找到前一个输入的指令!
而在很多distribution里头,预设的指令记忆功能可以到达1000个!
也就是说,你曾经下达过的指令都被记录下来了,记录的档案在你的家目录内的.bash_history!
不过,需要留意的是,~/.bash_history记录的是前一次登入以前所执行过的指令,而至于这一次登入所执行的指令都被暂存在暂内存中,当您成功的注销系统后,该指令记忆才会记录到.bash_history当中!
这有什么功能呢?
最大的好处就是可以『查询曾经做过的举动!
』,如此可以知道你的执行步骤,那么就可以追踪您曾下达的指令,以作为除错的工具!
但如此一来也有个烦恼,就是如果被黑客入侵了,那么他只要翻你曾经执行过的指令,刚好你的指令又跟系统有关(例如直接输入MySQL的密码在指令列上面)那么很容易就被破解你的Linux主机!
所以,最好是将记录的指令数目减小一点较好!
命令与档案补全功能:
还记得我们在首次进入Linux的热门按键一节当中提到的[tab]这个按键吗?
!
这个按键的功能就是在bash里头才有的啦!
常常在bash环境中使用[tab]是个很棒的习惯喔!
因为至少可以让你1)少打很多字;2)确定输入的数据是正确的!
使用[tab]按键的时机依据[tab]接在指令后或参数后而有所不同。
我们再复习一次:
[Tab]接在一串指令的第一个字的后面,则为命令补全;
[Tab]接在一串指令的第二个字以后时,则为『档案补齐』!
所以说,如果我想要知道我的环境中,所有可以执行的指令有几个?
就直接在bash的提示字符后面输入两个[tab][tab]就能够输出所有的可执行指令了。
那如果想要知道系统当中所有以c为开头的指令呢?
就按下c[tab][tab]就好啦!
^_^
是的!
真的是很方便的功能,所以,有事没事,在bashshell底下,多按几次[tab]是一个不错的习惯啦!
命令别名(alias)设定功能:
假如我需要知道这个目录底下的所有档案(包含隐藏档)及所有的档案属性,那么我就必须要下达ls-al这样的指令列,唉!
真麻烦,有没有更快的取代方式?
呵呵!
就使用命令别名呀!
例如我最喜欢直接以lm这个自订的命令来取代上面的命令,也就是说,lm会等于ls-al这样的一个功能,嘿!
那么要如何作呢?
就使用alias即可!
你可以在指令列输入alias就可以知道目前的命令别名有哪些了!
也可以直接下达命令来设定别名呦:
aliaslm='ls-al'
工作控制(jobs)、前景背景控制:
这部分我们在之后的资源管理章节中会再提及!
使用前、背景的控制可以让工作进行的更为顺利!
至于工作控制(jobs)的用途则更广,可以让我们随时将工作丢到背景中执行!
而不怕不小心使用了[Ctrl]+c来停掉该程序!
真是好样的!
此外,也可以在单一登入的环境中,达到多任务的目的呢!
Shellscripts的强大功能:
在DOS年代还记得将一堆指令写在一起的所谓的『批次档』吧?
在Linux底下的shellscripts则发挥的更为强大的功能,可以将您日常生活当中常需要下达的连续指令写成一个档案,该档案并且可以透过对谈交互式的方式来进行主机的侦测工作!
也可以藉由shell提供的环境变量及相关指令来进行设计,哇!
整个设计下来几乎就是一个小型的程序语言了!
该scripts的功能真的是超乎我的想象之外!
以前在DOS底下需要程序语言才能写的东西,在Linux底下使用简单的shellscripts就可以帮你达成了!
真的厉害!
!
这部分我们在后续章节再来谈!
万用字符!
除了完整的字符串之外,bash还支持许多的万用字符来帮助使用者查询与指令下达。
举例来说,想要知道/usr/X11R6/bin底下有多少以xt为开头的档案吗?
使用:
ls-l/usr/X11R6/bin/xt*就能够知道啰~此外,还有其它可供利用的万用字符,这些都能够加快使用者的操作呢!
--------------------------------------------------------------------------------
Bashshell的内建命令:
type
我们在首次进入Linux章节当中,提到关于Linux的在线说明文件部分,也就是manpage的内容,那么bash有没有什么说明文件啊?
开玩笑~这么棒的东西怎么可能没有说明文件!
请您在shell的环境下,直接输入manbash瞧一瞧,嘿嘿!
不是盖的吧!
让您看个几天几夜也无法看完的bash说明文件,可是很详尽的数据啊!
^_^
不过,在这个manbash所出现的manpage当中,不知道您是否有察觉到,咦!
怎么这个说明文件里面有其它的档案说明啊?
举例来说,那个cd指令的说明就在这个manpage内?
然后我直接输入mancd时,怎么出现的画面中,最上方竟然出现一堆指令的介绍?
?
这是怎么回事?
为了方便shell的操作,其实bash已经『内建』了很多指令了,例如上面提到的cd,还有例如umask等等的指令,都是内建在bash当中的呢!
那我怎么知道这个指令是来自于外部指令(指的是其它非bash套件所提供的指令)或是内建在bash当中的呢?
嘿嘿!
利用type这个指令来观察即可!
举例来说:
[root@linux~]#type[-tpa]name
参数:
:
不加任何参数时,则type会显示出那个name是外部指令还是bash内建的指令!
-t:
当加入-t参数时,type会将name以底下这些字眼显示出他的意义:
file:
表示为外部指令;
alias:
表示该指令为命令别名所设定的名称;
builtin:
表示该指令为bash内建的指令功能;
-p:
如果后面接的name为指令时,会显示完整文件名(外部指令)或显示为内建指令;
-a:
会将由PATH变量定义的路径中,将所有含有name的指令都列出来,包含alias
范例:
范例一:
查询一下ls这个指令是否为bash内建?
[root@linux~]#typels
lsisaliasedto`ls--color=tty'
#没有加上任何参数,仅列出ls这个指令的最主要使用情况
[root@linux~]#type-tls
alias
#-t参数则仅列出ls这个指令的最主要使用情况说明
[root@linux~]#type-als
lsisaliasedto`ls--color=tty'
lsis/bin/ls
#利用所有方法找出来的ls相关信息都会被列出来!
范例二:
那么cd呢?
[root@linux~]#typecd
cdisashellbuiltin
透过type这个指令的用途,我们可以知道每个指令是否为bash的内建指令。
此外,由于利用type搜寻后面的名称时,如果后面接的名称并不能以执行档的状态被找到,那么该名称是不会被显示出来的。
举例来说,您的FC4应该不会有vbird这个指令吧?
!
输入
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 初学的同学鸟哥BASH Shell 初学 同学 BASH