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

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. Linux程序设计(二)shell程序设计

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

  5. shell程序设计(转)

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

  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. Oracle导出表(即DMP文件)的两种方法

    转载:http://blog.csdn.net/lanpy88/article/details/7580691   方法一:利用PL/SQL Developer工具导出: 菜单栏---->Too ...

  2. 快速上手RaphaelJS--Instant RaphaelJS Starter翻译(三)

    (目前发现一些文章被盗用的情况,我们将在每篇文章前面添加原文地址,本文源地址:http://www.cnblogs.com/idealer3d/p/Instant_RaphaelJS_Starter3 ...

  3. ubuntu安装rpm包

    ubuntu下的rpm包的安装方法 一般是不能够直接安装的,我们需要一个工具叫alien,先install它吧.然后按照下面择所需. 1.直接安装: alien -i -c filename.rpm ...

  4. 文本深度表示模型Word2Vec

    简介 Word2vec 是 Google 在 2013 年年中开源的一款将词表征为实数值向量的高效工具, 其利用深度学习的思想,可以通过训练,把对文本内容的处理简化为 K 维向量空间中的向量运算,而向 ...

  5. 【Cocos2d-x 3.x】 动作类Action源码分析

    游戏设计中,动作是不可缺少的,Cocos2d-x中所有的动作都继承自Action类,而Action类继承自Ref和Clonable类,整个动作类继承体系如图: FiniteTimeAction是所有瞬 ...

  6. UNITY5以后怎么改GUI文字

    提要:以前是UNITY4,后来用了新的UI,于是GUIText这种东西就没有了,研究了很久.... ---------------------------- 这里我想拖个GUI文字框显示FPS,于是代 ...

  7. 《C专家编程》第三章——分析C语言的声明

    前面一章我们已经说过C语言存在的一些问题和它晦涩的地方,让我们对这门神奇的语言有了更深的了解.现在这一章则集中精力来讨论C语言的声明,分为三块,首先是说明C语言声明晦涩难懂的原因和声明是如何形成的,其 ...

  8. VMvare克隆复制多个操作系统

    目的:完成linux的双机和集群实验 2016-12-06 在网上查找了一些资料现整理如下,以供之后查看和帮助他人. 注意事项: 1.关闭源虚拟机的电源: 操作很简单 选择完整创建 输入源克隆机的用户 ...

  9. 手把手写一个html_json信息源

    html_json用于从网页里提取json数据. 这里用新浪读书的书讯举个例子,手把手写一个html_json信息源. 打开新浪读书的首页,可以看到页面下方有最新.书讯.童书.小说等几个Tab,这里我 ...

  10. [转]面向过程的分析(POA),和面向对象的分析(OOA)

    欢迎转载本文,转载地址: http://www.juliantec.info/articles/basic-concept/poa-and-ooa.html 软件开发方法论概述 在60年代的软件开发行 ...