你的位置:首页 > 操作系统

[操作系统]shell程序设计

1.shell脚本的基本概念:  

(1)Shell执行的是称为shell程序,这些程序通常被称为脚本。   

(2)Shell是一个用户和系统间接口的程序,它允许用户向操作系统输入需要执行的命令。   

(3)shell包含bash和csh以及其他程序围绕在linux内核的四周。(图1-1)   

(4)在linux大多数发行版中,默认的shell程序/bin/sh实际上是对程序/bin/bash的一个链接。         

图 1-1      

2.管道和重定向   

2.1重定向输入和输出   

Eg:ls -1 > 1.txt   

说明:   

使用<和>对输入和输出进行重定向。文件描述符0代表一个程序的标准输入,1代表标准输出,2代表错误输出。   

你可以使用>>操作符将输出的内容附加到原有内容之后。  

Eg: ps >> 1.txt   

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

Eg:kill -HUP 1234 >killout.txt 2>killerr.txt   

用>&操作符来结合两个输出。   

Eg:Kill -l 1234 >killouterr.txt 2>&1      

Tip:返回码一般保存在linux通用“回收站”/dev/null来丢弃所有的输出信息。

Eg: Kill -l 1234 >/dev/null 2>&1   

重定向标准输入。   

Eg:More <killout.txt   

More可以接受文件名作为参数。      

2.2管道   

用管道操作符|来链接进程。在linux下通过管道链接的进程可以同时运行,并且随着数据流在它们之间的传递可以自动地协调。

Eg: Ps > psout.txt Sort psout.txt > pssort.out

可以由一个命令解决: Ps | sort > pssort.out

3.作为程序设计语言

在命令行上直接输入shell脚本是一种测试短小代码段的简单而快捷的方式。

Eg:

$For file in *

>Do

>If grep -l POSIX $file

>Then

>More $file

>Fi

>done

当shell期待进一步的输入时,正常的$shell提示符将改变为>提示符。你可以一直输入下去,由shell

来判断何时输入完毕并立刻执行脚本程序。 Shell还提供了通配符扩展可以(globbing)。可以用通

配符*来匹配一个字符串,也可以用通配符?来匹配单个字符,而[set]允许匹配方括号中任何一个单

字符,[^set]对方括号中的内容取返,即匹配任何没有出现在给出的字符集中的字符。扩展的花括号

{}(只能用在部分shell中,其中包含shell)允许你将任意的字符串放在一个集合中,已供shell扩展。

Eg:

Ls my_{finger,toe}s

这个命令将列出my_fingers和my_toe,它使用shell来检查当前目录下的每个文件。

3.1创建脚本

Eg:

#!/bin/sh

#first

#This file look through all the files in the current

#directory for the string POSIX,and then pringts the names of

#those files to the standard output

For file in *

Do   

If grep -q POSIX $file   

Then   

Echo $file   

Fi

Done

Exit 0

程序中的注释以#符号开始,一直持续到该行结束。请注意第一行#/bin/sh,它是一种特殊形式的注释,

#!字符告诉系统同一行上紧跟在它后面的那个参数是用来执行本文件的程序。 因为脚本程序本质上被

看作是shell的标准输入,所以它可以包含任何能够通过你的PATH环境变量引用的linux命令。

3.2..把脚本设置为可执行 运行脚本有两种方法。

比较简单一点的方法是调用shell,并把脚本文件名当成一个参数,

eg: /bin/sh first

另一种:

Eg: Chmod +x first ./first

如果直接调用first可能会打印未找到命令。这种情况很可能发生,因为shell环境变量PATH并没有设置

为当前目录下查找要执行的命令。要解决这个问题,一种是输入PATH=$PATH:.或编辑你的.bash_profile

文件,将刚才这条命令添加到文件的末尾。./first的作用是把脚本程序的完整的相对路径告诉shell。

4shell的语法

4.1变量 在shell里,使用变量之前通常并不需要事先为它们作出声明。你只是通过使用 它们来创建它们。

在默认情况下,所有变量都被看做字符串并以字符串来存储,即使它们被赋值为数值时也是如此。Shell

和一些工具程序会在需要时把数值型字符串转化为对应的数值以对它们进行操作。 在shell中,你可以通

过在变量名前加一个$符号来访问它的内容。当你为变量赋值时,你只需要使用变量名,该变量会根据需

要自动创建。

4.1.1使用引号 一般情况下,脚本文件中的参数包含空白字符分隔(列如,一个空格、一个制表符或者一个换行符)。

如果你想在一个参数中包含一个或多个空白字符,你就必须给参数加上引号。 如果你把一个$变量表达式放在双引号中,

程序执行到这一行时就会把变量替换为它的值; 如果你把它放在单引号中,就不会发生替换现象。你还可以通过在$字符

前面加上一个\字符取消它的特殊含义。

Eg:

#!/bin/sh

Myvar=”Hi there”

Echo $myvar

Echo “$myvar”

Echo ‘$myvar’

Echo \$myvar

Echo enter some text Read myvar

Echo ‘$myvar’ now equals $myvar

Exit 0

4.1.2环境变量

当一个shell脚本程序开始执行时,一些变量会根据环境设置中的值进行初始化。这些变量通常用大写字母做名字。

具体创建的变量取决于你的个人配置。参见表4-1。 

 

 4.1.3参数变量

如果脚本程序在调用时带有参数,一些额外的变量就会被创建。即使没有传递任何参数,环境变量$#也依

然存在,只不过它的值是0罢了。参见表4-2。

 

  4.2 条件

Test或[命令

在实际工作中,大多数脚本程序都会广泛使用shell的布尔判断命令或[或test。为了增强可读性,当使用[命令时,

我们还使用符号]来结尾。

Eg:

If test -f fred.c

Then

...

Fi

也可以写成:

If [ -f fred.c ]

Then

...

Fi

Tip:必须在[符号和被检查的条件之间留出空格。

Test命令可以使用的条件类型分3类:

(1)字符串比较

(2)算术比较

(3)文件有关的条件测试

4.2.1 控制结构 if语句

Eg:

If condition

Then

Statements

Else

Statements

Fi

elif语句:

Eg:

If condition

Then

Statements

Elif

Statements

Else

Statements

Fi

for语句

For variable in value

Do   

statements

Done

While语句

While condition

do   

Statements

Done

Until语句

Untilcondition

Do   

Statements

Done

case语句

Case variable in   

Pattern [ | pattern] ...) statements;;   

Pattern [ | pattern] ...) statements;;   

...

Esac

命令列表 AND列表

语法: Statements1 && Statements2 && Statements3 && ...

从左开始执行每条命令,如果前一条命令返回的是true,右边的下一条命令才能够执行。AND作为一个整体,只有在

列表中的所有命令都执行成功时,才算它执行成功,否则就算它失败。

OR列表 语法:

Statements1 || Statements2 || Statements3 || ...

从左开始顺序执行每条命令。如果前一条命令返回的是false,它右边的下一条命令才能够被执行。 语句块 某些地方

只允许使用单个语句的地方(比如在AND或OR列表中)使用多条语句,可以把它们括在{}中来构造一个语句块。

Eg:

Get_confirm && {   

Grep -v “$cdcatnum” $tracks_file > $temp_file   

Cat $temp_file > $tracks_file   

Echo  Add_record_tracks

}

函数 定义shell函数:

Function_name ()

{

 

statements

}

你可以通过return命令让函数返回数字值。

Foo ()

{

echo JAY;

}

...

Result=”$(foo)”

你也可以使用local关键字在shell函数中声明局部变量。

2、文件内容行之间的排序 Shell代码

#!/bin/bash

sort -t= +4

文件 

备注:“=”表示按=号进行切割(注意:只能是单个字符),“+4”表示按第五个项进行排序。

更多参数:

-r 表示降序排序

-n 表示按数字大小排序

-k 表示根据那个字段排序,4.1,表示第4列第一个字符开始 ,5表示到第5个字段为结束

-t 后面跟分隔符,缺省是空格

例如:sort -r -n -k4.1,5 功能说明:删除变量或函数。

语法:unset [-fv][变量或函数名称]

补充说明:unset为shell内建指令,可删除变量或函数。

参数:

-f  仅删除函数。

-v  仅删除变量