Linux学习日记09-shell
时间:2007-03-29 来源:junzero
几乎所有Linux高手都会告诉大家shell是个好东西,这东西用起来会很爽,办事的效率很高!同事所有的电脑初学者都会觉得,这玩意太不好玩了,用这玩意还不要死人啊!
高手说的话往往都是对的(这似乎是对高手的迷信,但是往往事实也是这样的),所以我们还是要花些时间来学习shell!
1、 shell是什么东西?
2、 shell能做什么?
3、 shell相关知识
1、 shell是什么东西?
从字面上讲,它就是一个壳,这个壳将kernel(内核)给包裹起来,不会让我们轻易的触碰到kernel,以免出现危险(系统的危险,如果系统出现了问题,老板怪罪下来,你也就危险了)。
2、 shell能做什么?
在linux下面会有很多有用的指令例如ls,cat,cp等,在shell中输入这些指令,系统就会做相应的动作,所以shell做的动作是,解析你输入的内容然后传达给kernel,kernel将结果再给shell。
shell是有不同版本的,有Bourne Shell,C shell,K shell,TCSH,Bourne Again Shell(bash)。目前比较常用的是bash,是shell的增强版,它具有以下一些优点:
命令编修能力(类似DOS的doskey 功能):可以通过方向键中的上下键来快速的查看你之前输入过的指令
文件比对补全功能(比对数据正确性):可以通过<tab>键来自动补全你要输入的命令或者文件名
命令别名(alias)设定功能:可以自定义一个命令,让你自定义的命令等于另外一个命令的组合,例如alias lm=’ls -al’
工作控制(jobs)、前景背景控制:可以让程序在后台工作
Shell scripts 的强大功能:这个Shell脚本的功能真的是太强大了,只有实际用到了,才会感觉到
3、 shell的一些知识
下面的知识点是关系到shell的:
a、环境变量
在linux下有个东西很重要,那就是环境变量!环境变量有什么用?环境变量是用一个符合来代替一些设置或者一串数据,这些东西可能在系统操作中要用到。使用了环境变量之后,很多操作就不用去人工指定一些设置了,例如我可以设置一个环境变量叫做MYTEST,并给它复制为/home/jun/test/,这样我如果要往这个目录里放文件,就不用输入全路径了,只要输入环境变量就行了,下面是例子:
常用的环境变量:PATH、HOME、MAIL、SHELL,有了这个环境变量,那如何知道这个变量的值。很简单,通过echo $<变量名>,可以输出变量信息!
这是显示指定的环境变量,那如果我想了解我这个系统中有些什么环境变量怎么办,可以使用env和set来查看:
env:显示系统中的环境变量
set:显示所的变量
下面是截图:
在这里有两个变量很特别,’$’和’?’,他们都是什么意思,可以从上图的最后3行看出:
$-----目前shell的PID,(PID是什么?进程的标识,唯一的)
?-----最后一个命令的回传值,若之前的命令被正确执行则回传0,否则会回传1或者其它错误代码。
接下来是如何设置环境变量:
没种游戏都有其自己的规则,环境变量的设置也有其自己的规则:
1. 变量与变量内容以等号『=』来连结;
2. 等号两边不能直接接空格符;
3. 变量名称只能是英文字母与数字,但是数字不能是开头字符;
4. 若有空格符可以使用双引号『 " 』或单引号『 ' 』来将变量内容结合起来,但须要特别留意,
双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符;
5. 必要时需要以跳脱字符『 \ 』来将特殊符号(如Enter, $, \, 空格符, '等)变成一般符号;
6. 在一串指令中,还需要藉由其它的指令提供的信息,可以使用 quote 『 `command` 』;(请注意:这个“`”是数字‘Esc‘下面的那个字符,放大的效果是“`”)
7. 若该变量为扩增变量内容时,则需以双引号及 $变量名称如:『 "$PATH":/home』继续累加
内容;
8. 若该变量需要在其它子程序执行,则需要以 export 来使变量可以动作,如『export PATH』;
9. 通常大写字符为系统预设变量,自行设定变量可以使用小写字符,方便判断(纯粹依照使用
者兴趣与嗜好);
10.取消变量的方法为:『unset 变量名称』。
下面是截图:
以上的例子动手试试就明了了!
了解了规则之后,看看这个export的用处,因为它似乎很重要:
export 可以将一般自订的变量变成环境变量!
单独输入export,不带参数的话,可以输出所有的环境变量信息。
当然设置好的环境变量如果不想用了,还是可以删掉的:unset 变量 (不用加$,不过你可以尝试着加上$试试效果)
变量的有效范围:
如果不使用export,直接定义变量,那么此变量只在当前shell中有效,而在子进程或者其它shell中将不起作用。但是使用了export之后,此变量将变成系统的环境变量,在其它shell进程中都将有效!
可以多了解一下下面的东西:
read、array、$RANDOM、eval
在使用shell的时候会涉及到一些关于shell的设置文档:
/etc/profile:该文件设置了几个重要的变量,包括PATH、USER、MAIL、HOSTNAME、HISTSIZE、umask等。
/etc/bashrc:规划umask的功能,和提示字符的内容;(umask的作用是在创建新文件或者目录的时候,屏蔽掉新文件或目录不应有的访问权限)
/etc/man.config:该文件其实跟bash shell没有什么关系,可是它指定了man的路径
跟个人设置有关的设置文档:
以下的[~]代表的是个人的home目录
~/.bash_profile:定义了个人化的路径。例如可以在这里面设置自己要用到的PATH。
~/.bashrc:可以在这个文件里面随自己的喜好设置一些自己的环境变量。
~/.bash_history:用来记录你的操作历史
~/.bash_logout:定义了在你注销shell时要做的一些后续动作。
这些设置文件都是在登录和注销的时候才去读取的,那如果在登录后,改变了这样的文件,又要马上生效,该怎样做?这边有source指令可以完成这样的功能!
在Bash中往往会用到一些万用字符和特殊字符,如下表:
简单的例子:
(上图取自《鸟哥的linux私房菜》)
Shell下连续指令的使用方式:
command1;command2
用‘;’格开,代表不管command1的结果如何,都执行command2
command1&&command2
command1执行正确才执行command2
command1 || command2
command1执行错误了才执行command2
Shell下的相对路径与绝对路径:
绝对路径: 从根目录一直延续到文件或指令所在目录,这些目录都要输出。
相对路径: 知道了当前的路径,或者环境变量中设置的路径,要追溯到文件而不需要输出其全部路径就可以找到。
[.]和[..]分别代表[当前路径]和[上一级路径]
命令重定向
就是将命令执行的结果重新转移到其它指定的地方。
几种标准的输入输出状况:
1. 标准输入;代码为 0 ;或称为 stdin ;使用的方式为 <
2. 标准输出:代码为 1 ;或称为 stdout;使用的方式为 1>或者>
3. 错误输出:代码为 2 ;或称为 stderr;使用的方式为 2>
基本指令格式:
例子:
几种常用的重定向符号含义:
• < :由 < 的右边读入参数档案;
• > :将原本由屏幕输出的正确数据输出到 > 右边的 file ( 文件名称 ) 或 device ( 装置,如printer )去;
• >> :将原本由屏幕输出的正确数据输出到 >> 右边,与 > 不同的是,该档案将不会被覆盖,而新的数据将以『增加的方式』增加到该档案的最后面;
• 2> :将原本应该由屏幕输出的错误数据输出到 2> 的右边去。
• /dev/null :可以说成是黑洞装置!
管道命令:
就是一些指令协同工作,跟连续指令不同。例如:
它会将last的结果做grep root处理,处理后的结果再作为wc -l的输入,最后得出结果。
一些基本的用于管道方式的指令:
cut、sort、wc、uniq、tee、tr、split