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  仅删除变量

http://www.cnblogs.com/myhello-world/p/hi_laotou.html

shell程序设计(转)的更多相关文章

  1. Linux 的使用基础---Shell程序设计

    Shell是Linux系统中的一个重要的层次,它是用户与系统交互作用的界面.Shell除了作为命令解释程序以外,还是一种高级程序设计语言.利用Shell程序设计语言可以编写出功能很强.但代码简单的程序 ...

  2. Linux程序设计之shell程序设计

    看了<linux程序设计(第4版)>(作者:Neil Matthew ,Richard Stones ,陈建 ,宋健建译).做个笔记,以备后面查看. 首先,清楚几个概念. shell编程属 ...

  3. Linux shell 程序设计

    shell 程序设计 主要的学习内容包含基本思路,语法:变量.条件判断和程序控制,命令列表,函数,命令及执行,调试,grep命令和正则表达式,find命令 什么是shell 适用编写执行相对简单任务的 ...

  4. shell程序设计

    1.shell脚本的基本概念: (1)Shell执行的是称为shell程序,这些程序通常被称为脚本. (2)Shell是一个用户和系统间接口的程序,它允许用户向操作系统输入需要执行的命令. (3)sh ...

  5. Linux程序设计(二)shell程序设计

    1. 管道和重定向 文件描述符0:一个程序的标准输入 文件描述符1:标准输出 文件描述符2:标准错误输出 >操作符:把标准输出重定向到一个文件. >>操作符:将输出内容附加到一个文件 ...

  6. 【Shell编程】Shell程序设计

    1.Shell简介   作为Linux灵感来源的Unix系统最初是没有图形化界面的,所有的任务都是通过命令行来实现的.因此,Unix的命令行系统得到了很大的发展,逐步成为一个功能强大的系统.   Sh ...

  7. Linux命令(十)——Shell程序设计一(变量与操作符)

    Shell是linux系统中用户和系统交互的接口,它除了作为命令解释器以外,还是一种高级程序设计语言.在前面介绍的linux命令中,Shell都作为命令解释器出现.下面分两节简单介绍脚本程序设计中的语 ...

  8. Linux操作系统之Shell程序设计

    Shell是种命令解释程序,也可以看作是一种命令语言的解释器. 用户在与Shell交互时所输入的命令行必须符合Shell命令的语法和语义规范,才能够被Shell理解并执行.Shell所使用的这种命令语 ...

  9. Unix Shell 程序设计 —— 正则表达式

    参考:http://www.cnblogs.com/erichhuang/archive/2012/03/13/2394119.html 简介: 简单的说,正则表达式是一种可以用于模式匹配和替换的强有 ...

随机推荐

  1. if语句之有房么?有钱么?有能力么?

    思路:1.如果有房,可以谈谈 2.如果没有房,问第二个条件有钱么,如果有,可以谈谈 3.如果没有房没有钱,则问第三个条件有能力么,如果有,可以谈谈 4.如果以上三个条件都没有,则拜拜 Console. ...

  2. 【Web】java异常处理

    J2EE中一般对异常状况的处理都可以用两种情况对其进行相应处理. 1. 通常情况下,一般异常处理可以选择用throw.throws从底层一直往上面抛,直到抛到Action,让其将异常显示在页面上面进行 ...

  3. c++,模板函数的定义和使用【初探】

    // demo.cpp : // 模版函数的定义和使用: // 1.模板支持返回参数类型为模板参数. // template <typename RET_T , typename IN1_T , ...

  4. C#注册表

    C#注册表情缘   记得当时刚接触C#的时候,喜欢编写各种小软件,而注册表系列和网络系列被当时的我认为大牛的必备技能.直到我研究注册表前一天我都感觉他是那么的高深. 今天正好有空,于是就研究了下注册表 ...

  5. 引用 模块编译Makefile模板

    本文转载自geyingzhen<模块编译Makefile模板>   引用 geyingzhen 的 模块编译Makefile模板 ifneq ($(KERNELRELEASE), ) // ...

  6. JavaScript自调用匿名函数

    Self-Invoking Anonymous Function,即自调用匿名函数.顾名思义,该函数没有名称,不同的是,该函数定义后立即被调用.该函数的作用是在应用中初始化或做一次性工作. 普通匿名函 ...

  7. CMake入门指南

    原文地址:http://www.cnblogs.com/sinojelly/archive/2010/05/22/1741337.html CMake是一个比make更高级的编译配置工具,它可以根据不 ...

  8. Permutations【python】

    class Solution: # @param num, a list of integer # @return a list of lists of integers def permute(se ...

  9. python 3.4 装matplotlib numpy

    为了装个matplotlib包,搞了好久:   python3.4,官方没有对应版本的包,只能去下面这个地方下对应的版本: http://www.lfd.uci.edu/~gohlke/pythonl ...

  10. C中的链接属性及作用域

    如果相同的标识符出现在几个不同的源文件中时,它们是表示相同的实体,还是不同的实体.标识符的链接属性决定如何处理在不同文件中出现的标识符.标识符的作用域与它的链接属性有关. 链接属性一般有三种:exte ...