#--------------------------------------------------------------#

# ====> 红色字体 -特指煮酒个人所见。加粗则为需要重点注意     #

# ====> 蓝色加粗 -特指与本文相关人员,包括参与修正的朋友。 #

# ====> 煮酒品茶 -Http://cwtea.blog.51cto.com              #
 
#--------------------------------------------------------------#
 

 
开篇序:
煮酒品茶:首先需要申明的,首先本人并不是一时心血来潮而写此“专题”,而是实时的记录学习Shell的一个过程,采自书《Shell脚本学习指南》,非常感谢原书作者能写出见解。并针对书上的文章进行一些个人的理解和看法,看客权当此是一本书的笔记即可,适才我也是如是想的。需注明的是本人也是边看边记笔记,这当中会夹杂个人的一些灵感和一个错误的观点,希望不要误导读者,当然也希望读者在查阅的时候最好连原著一起看。多增强自己的灵动性与感知性。文章有错误或者您有更好的建议,请留下留言,笔者会认真去接受建议以及对文章错误信息进行更新。
煮酒品茶:首先对笔记是如下规划的。记录必须要记录的概念,以及对脚本核心思想的理解。以及对文中概念的一些扩展甚至是设想。每篇文章都会写下总结,来权衡文章的质量以及增加笔者的水平。可能的话会在每篇笔记后找相关脚本来学习脚本编写者的思路以及过程。也希望在这个过程中能得到高手们的指点,不出意外一共会有笔记15-20篇根据书本的进程设定。
煮酒品茶:文章会不定期的进行更改以及优化更新。多关注文章变动即可。文章更新变动会以标题为【第几次编辑】为基准。
 
基本信息
书名: 《Shell脚本学习指南》
原书名: Classic Shell Scripting
原出版社: O'Reilly Media, Inc.
作者: Arnold Robbins    Nelson H.F.Beebe   
译者: O'Reilly Taiwan公司
 
一、背景知识介绍
 
Shell的工作是:执行命令、Shell支持Postix标准。
 
Shell的格式是:
1、以空格或者Tab键隔开命令行的每个组成部分。
2、命令名称是命令行的第一个项目,通常后面会跟选项以及参数。
3、选项的开关是破折号(——)或者减号(-),后跟字母,选项是可有可            无的,
4、分号(;)可用来分隔同一行里多余的命令。
注:使用“&”符号则Shell将后台执行前面的命令,意味着shell不用等到命令完成就可以执行下一条命令。
 
煮酒品茶:这个还是比较好理解的,最开始品茶竟然不知道破折号怎么打,这时候同事就派上用场了。破折号一般用于软件安装定义目录居多,也就是外部命令最常用的。
 
Shell识别的基本命令:
1、内建命令  - 由Shell本身所执行的命令。如cd、read、test、echo、printf等。
2、Shell函数 - 是功能健全的一系列程序代码,以Shell语言写成,可以像命令一样被引用。如if else 赋值操作一样。
3、外部命令  - 是由Shell的副本执行的命令,模式为父Shell启动子Shell然后由子Shell启动新程序,处理完之后交由父Shell执行。
 
变量:
定义:为某个信息片段所取的名字。
规则:每个变量只有一个值,变量可以为空(null)值,首字母必须是字母或下划线,内容可以是任意长度。
赋值方式:变量名称=字符(中间不要有空格),如果需赋值的内容中需要带空格那么需要带引号,需要取变量时可以用美刀($)加变量名称来取。 
 
煮酒品茶:我自己记这些定义记得我烦的很啊,但是真正理解后想想又非常简单。一定需要记住这些规则,记住了你以后要少翻很多资料。讲点好玩的吧。很多的脚本第一行是 #!/bin/bash,知道为什么第一行是这个吗?不知道吧,我来告诉你咯,如果没有这一句,当你赋于写运行权限时运行这个程序,程序会先交由内核来处理,而内核知道处理编译程序,但一看你不是编译程序,那么他就认为是个Shell,又丢给了shell来执行。我们再回头看下#!/bin/bash就非常明了了,又有人问了,在Shell里面#不都是用来注释的吗?对确实,但是在脚本里,第一行是预留的,如果有#!/bin/bash那么他就直接认定你为一个Shell就不交由内核来处理。我们来构造着玩玩吧。先是#! /bin/bash 加了一个空格,我们会发现其实没区别,但是从Linux流程上来讲他可是有区别的啦,当第一行遇到空格时Shell就停止了检索。这时还是先交内核然后再还给Shell,所以不能有空格啦。(测试发现#!后面加空格也没事,估计是现在标准升级过了吧。还有就是这一行redhat系列的是最多支持127个字符咯,现在有没有升就不知道了。以后如果搞多了提示出错至少知道这里也会出问题的。)再来构造一个别的可执行cat程序啦,来试试是什么感觉?

  1. [root@localhost test]# ./ts  
  2. #!/bin/cat  
  3. hello 51CTO  
看到没咯?第一行定义他找/bin/cat的麻烦,流程就变成这样了,执行ts,ts找/bin/cat来执行ts这个脚本。
 
  1. [root@localhost test]# cat ts 
  2. #!/bin/cat 
  3. hello 51CTO 
 
那么这两个显示的就是一样咯。是不是很好玩?再来玩,SH的权限要大于bash喔,哈哈,运行程序直接sh 程序名,bash 程序名也是可以的啦。
 
  1. [root@localhost test]# ll /bin/sh 
  2. lrwxrwxrwx 1 root root 4 Apr 25 22:42 /bin/sh -> bash 
  3. [root@localhost test]# ll /bin/bash 
  4. -rwxr-xr-x 1 root root 768664 Jul 22  2011 /bin/bash 
玩完了做点正事。介绍两个命令who与cat 其实也就是跟着书上的进程走的。但原书的命令参数好像有问题。不过我有Linux查询宝典啦。
 
who属性:系统相关-系统安全
who语法:who [参数] [记录文件]
  1. -a : 显示所有信息 
  2. -b : 显示系统最后一次重启的时间 
  3. -d : 显示已失效的保存 
  4. -H : 显示标题栏    
  5. -i : 显示系统闲置时间 
  6. -l : 只显示行数 
  7. -m : 只显示自己登陆的相关信息 
  8. -q : 只显示登录系统的用户名称与总人数 
  9. -r : 显示当前的执行等级 
  10. -t : 显示最后一次修改时钟的时间  
  11. -h : 不要显示标题列 
  12. -u : 显示用户已闲置的时间 
 
  1. wc作用: 字数计算 
  2. wc语法:wc [选项] [文件] 
  3. -c : 统计字节数。   
  4. -l : 统计行数。   
  5. -w : 统计字数。   
煮酒品茶,who百度无果谷哥无果,自己敲的,累死,至于原作者为什么要拿who和wc放一起讲,应该是觉着都是w吧,而且wc不能单独使用,所以就组合咯。作用在于啥呢,
 
比如说:我们要显示当前用户的行数,那么就构造 
#who -a | wc -l  
还有很多,基本上按表就可以一一写出。who这个命令着重于安全一点。而wc则是侧重于查询文件的一点信息。如字节数啊,行数啊,字数啊,等等,如何利用就看你的咯
 
总结:我们总了,SHell的格式,Shell识别的命令,变量以及变量的规则。还讲了两个命令who与wc,现在回想一下还记得多少?