第二章 shell编程基础
脚本传递参数
为什么要向shell脚本传递参数?参数传递可以将外部的值传递到脚本的内部函数中,提高脚本的灵活性;参数传递可以添加脚本的适用选项,增加脚本的可定制性,以应付不同的情况。
$#代表参数的个数
$@代表参数的内容
如果你拥有的参数多于9个,则不能使用$l0来引用第l0个参数。首先,必须处理或保存第一个参数($1),然后使用shift命令删除参数$1,并将所有剩余的参数下移一位,因此$10就变成了$9,以此类推。$#的值将被更新以反映参数的剩余数量。在实践中,最常见的情况是将参教迭代到函数或shell脚本,或者迭代到命令,替换使用for语句创建的列表,因此这个约束基本不成问题。
实例脚本
[hcr@slave2 temp]$ cat ~/bin/ps.sh #!/bin/sh ps -ef |grep $@
[hcr@slave2temp]$ ps.sh firefox hcr 2417 1784 0 17:00 pts/0 00:00:00 /bin/sh /home/hcr/bin/ps.shfirefox hcr 2419 2417 0 17:00 pts/0 00:00:00 grep firefox [hcr@slave2 temp]$
IO重定向
标准输入、标准输出与标准错误
程序读取输入(数据的来源)、运算后输出(数据的目的端),以及报告异常和错误,这三者就是标准输入(standard input )、标准输出( standard output)和标准错误( standard error )。
许多unix的程序都遵循这个原则—从标准输入读入,经过处理,从标准输出输出。遵循这个原则的程序往往被称为过滤器(filter)。过滤器加管道,这是unix的世界:并且,宽进严出的程序是受人称赞的。
管道和重定向
从标准输入读入,从标准输出输出,将异常及错误报告到标准错误。这是遵循UNIX哲学的软件正确行为。但是,我们总不能将所有的输入和输出都集中在黑乎乎的字符界而,我们还要读写文件、看视频、听音乐、还要打游戏,这些人机交互的输入和输出都来自不同的设备或文件。
因此,shell提供了数种语法和标记,用以改变默认输入端和输出端。
1. > 改变标准输出、(会删除文件b.txt内容)
[hcr@slave2 temp]$ echo ‘abc‘ > b.txt
2. < 改变标准输入
[hcr@slave2 temp]$ cat < b.txt > c.txt
3. >>追加文件内容(不会删除文件内容)
[hcr@slave2 temp]$ cat < b.txt >> c.txt
4. | 建立管道
[hcr@slave2 temp]$ head -n10 /etc/passwd | grep bash
5. 小实例
[hcr@slave2 temp]$ cat /etc/passwd | while read line ; doecho $line >> c.txt; done;
管道的数据共享在Linux内核中是通过内存拷贝实现的。相较于CPU的运算,数据的移动往拄更消耗时间。因此,在设计管道时,要尽量把能够减少数据量的操作五于管道的前端。这样一来数据拷贝快速。二来程序运算量减少. 例如,在sort之前,使用grep找出相关数据,可以减少许多sort的运算量
文件描述符
内核(kernel)利用文件描述符(filedescriptor)来访问文件。文件描述符是非负整数。打开
现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。
特殊文件的妙用
1./dev/null
/dev/nul就是一个黑洞。当一些文件不想输出或者标准输出或者错误输出的时候可以把输出指定到黑洞。
实例:
cat /etc/passwd | while read line ; do cat$line 2>/dev/null; done;
如果不加2>/dev/null;肯定会报一些
cat: root:x:0:0:root:/root:/bin/bash: 没有那个文件或目录
…..
之类的东西,如果不想看到这些信息就可以把这些错误信息放入到黑洞中。
1> 重定向标准输出
2> 代表错误标准输出
&> 代表标准输出和错误标准输出
2./dev/zero
/dev/zero的主要用途就是用来创建一个指定长度、并且初始化为空的文件,这种文件一般都用作临时交换文件。
3./dev/tty
/dev/tty是一个很实用的文件。当程序打开这个文件时,UNIX/LINUX前所处的终端。输出到此的信息只会显示在当前工作的显示器。在某些时候〔例如设定了脚本输出到/dev/null)时,而你又想在当前终端显示一些很重要的信息,就可以调用这个设备,写入重要信息。这样做可以强制信息显示到终端。
#!/bin/sh printf "Enter new PWD" stty -echo read pass < /dev/tty printf "Enter new PWD agin" read pass2 < /dev/tty stty echo if [ "$pass" -eq "$pass2" ] ; then echo "right" else echo "wrong" exit 1 fi exit 0
基本文本检索
grep命令检索文本
详细参考:
http://www.cnblogs.com/end/archive/2012/02/21/2360965.html
unix、linux 系统的设计和编程
一切皆文件
文件类型
http://www.cnblogs.com/acpp/archive/2009/12/05/1617547.html
unix编程基本原则
KISS 原则