shell程序设计教程(1)

发布时间:2020-03-18编辑:脚本学堂
本文介绍了shell程序设计的基础知识,包括 管道和重定向、重定向、重定向输出等内容,有需要的朋友参考学习下。

linux操作系统中,有关管道与重定向的内容,一直是要研究的重点。

例子:
 

复制代码 代码示例:
jb200.com:~/C++$ ls -l >lsoutput.txt

这条命令把ls命令的输出保存到文件lsoutput.txt中。

文件描述符0代表一个程序的标准输入,文件描述符1代表标准输出,文件描述符2代表标准错误输出。在上面的例子中,通过>操作符把标准输出重定向到一个文件。默认情况下,如果该文件已经存在,它的内容将被覆盖。使用set –C命令设置noclobber选项,从而阻止重定向操作对一个已有文件的覆盖。也可以使用set +o noclobber或set -o noclobber开启或关闭noclobber选项。

使用>>操作符将输出内容附加到一个文件中,例如:
 

复制代码 代码示例:
jb200.com:~/C++$ ps >>lsoutput.txt

这条命令将ps的输出附加到指定文件的尾端。

如果需要对标准错误输出重定向,可以使用2>操作符。因为标准错误输出文件描述符是2,所以在>前面加上2。

下面这条命令是把标准输出和标准错误输出分别重定向到不同的文件中:
 

复制代码 代码示例:
jb200.com:~/C++$ kill -HUP 1234>killout.txt 2>killerr.txt

如果想把两组输出都重定向到一个文件中,可以用>&操作符来结合两个输出。
 

复制代码 代码示例:
jb200.com:~/C++$ kill -l 1234 > killouterr.txt2>&1

这条命令将标准输出重定向到killouterr.txt,然后将标准错误输出重定向到与标准输出相同的地方。

可以直接使用UNIX的同样回收站/dev/null来有效地丢弃所以输出信息
 

复制代码 代码示例:
jb200.com:~/C++$ kill -l 1234>/dev/null 2>&1

一,重定向输入
 

复制代码 代码示例:
jb200.com:~/C++$ more < killerr.txt

很明显,这样做一样不大,因为more可以直接接受文件名作为参数。
 

复制代码 代码示例:
jb200.com:~/C++$ more killerr.txt

二,管道
在linux下通过管道连接的进程可以同时运行,并且随着数据流在他们之间的传递可以自动的进行协调。举一个例子我们可以使用sort命令对ps命令的输出进行排序。

如果我们不使用管道,这就需要分几个步骤实现
 

复制代码 代码示例:
jb200.com:~/C++$ ps > psout.txt
jb200.com:~/C++$ sort psout.txt >pssort.out

但如果使用管道更为精巧。
 

复制代码 代码示例:
jb200.com:~/C++$ ps | sort >pssort1.out

如果想在屏幕上分页显示输出结果,我们可以在联结第三个进程more,将他们都放在同一个命令行上。
 

复制代码 代码示例:
jb200.com:~/C++$ ps | sort | more

如果有一系列的命令需要执行,相应的输出文件是在这一组命令被创建的同时立刻被创建或写入的,所以决不要在命令流中重复使用相应的文件名。、
如果尝试执行如下命令
jb200.com:~/C++$ cat mydata.txt | sort| uniq | > mydata.txt

你最终将得到一个空文件,因为你在读取文件mydata.txt之前就已经覆盖了这个文件的内容。

作为程序设计语言的shell
编写shell脚本程序有两种方式。可以输入一系列命令让shell交互的执行它们,也可以把这些命令保存到一个文件中,然后将该文件作为一个程序来调用。

三,交互式程序
假设我们查找包含字符串hello的文件,可使用下面的交互式脚本来执行整个操作:
 

复制代码 代码示例:
jb200.com:~/C++$ for file in *
> do
> if grep -l hello $file
> then
> more $file
> fi
> done

请注意,在输入shell命令的时候,shell提示符$会变成>符号。
可以一直输入下去,由shell来判断何时输入完毕并立刻执行脚本程序。

创建脚本
首先用文本编辑器创建一个名为first的文件,其内容如下:
 

复制代码 代码示例:
#!/bin/sh
#first
#This file looks through all the files inthe current
#directory for the string hello, and thenprints the names of
#those files to the standard output.
for file in *
do
 ifgrep -q hello $file
  then
     echo $file
  fi
  done
exit0

其中#!字符告诉系统同一行紧跟在它后面的那个参数是用来执行文本的程序。

exit命令的作用是确保程序能够返回一个有意义的退出码。

可以用file命令来检查文件是否是脚本程序。
 

复制代码 代码示例:
jb200.com:~/C++$ file first
first: POSIX shell script text executable

执行脚本
运行脚本的方法有两种
方法1:
 

复制代码 代码示例:
jb200.com:~/C++$ /bin/bash first

方法2:
 

复制代码 代码示例:
jb200.com:~/C++$ ./first