shell程序设计(1)

shell程序设计(1)

管道和重定向

重定向

重定向输出

chen123@ubuntu:~/C++$ ls -l >lsoutput.txt

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

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

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

chen123@ubuntu:~/C++$ ps >>lsoutput.txt

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

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

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

chen123@ubuntu:~/C++$ kill -HUP 1234>killout.txt 2>killerr.txt

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

chen123@ubuntu:~/C++$ kill -l 1234 > killouterr.txt2>&1

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

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

chen123@ubuntu:~/C++$ kill -l 1234>/dev/null 2>&1

重定向输入

chen123@ubuntu:~/C++$ more < killerr.txt

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

chen123@ubuntu:~/C++$ more killerr.txt

管道

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

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

chen123@ubuntu:~/C++$ ps > psout.txt

chen123@ubuntu:~/C++$ sort psout.txt >pssort.out

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

chen123@ubuntu:~/C++$ ps | sort >pssort1.out

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

chen123@ubuntu:~/C++$ ps | sort | more

如果有一系列的命令需要执行,相应的输出文件是在这一组命令被创建的同时立刻被创建或写入的,所以决不要在命令流中重复使用相应的文件名。如果尝试执行如下命令

chen123@ubuntu:~/C++$ cat mydata.txt | sort| uniq | > mydata.txt

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

作为程序设计语言的shell

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

交互式程序

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

chen123@ubuntu:~/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命令来检查文件是否是脚本程序。

chen123@ubuntu:~/C++$ file first

first: POSIX shell script text executable

执行脚本

运行脚本的方法有两种

方法1:

chen123@ubuntu:~/C++$ /bin/bash first

方法2:

chen123@ubuntu:~/C++$ ./first

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值