生物信息中的计算机基础
Download
1 / 147

生物信息中的计算机基础 - PowerPoint PPT Presentation


  • 109 Views
  • Uploaded on

生物信息中的计算机基础. 白明泽 [email protected] Why Unix?. 功能强大,应用广泛 主要应用于高性能计算机 良好的多用户管理 与网络服务联系紧密: apache , php , WWW 服务 丰富的命令和应用程序(打包、免费). Unix & Bioinformatics. 在 20 实际中期之前,只有 SGI 和 Sun 的 Unix 工作站能够实时地可视化蛋白质结果数据。 生物信息学的数据库、 WWW 服务基于网络。而 Unix 在网络服务上见长。. Unix 难学?. 只需要学习部分命令子集

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' 生物信息中的计算机基础' - ash


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

Why unix
Why Unix?

  • 功能强大,应用广泛

  • 主要应用于高性能计算机

  • 良好的多用户管理

  • 与网络服务联系紧密:apache,php,WWW服务

  • 丰富的命令和应用程序(打包、免费)


Unix bioinformatics
Unix & Bioinformatics

  • 在20实际中期之前,只有SGI和Sun的Unix工作站能够实时地可视化蛋白质结果数据。

  • 生物信息学的数据库、WWW服务基于网络。而Unix在网络服务上见长。


Unix难学?

  • 只需要学习部分命令子集

  • 不需要了解或使用Unix的每一个程序和特点

  • 上手后工作效率很高


常见Unix

  • BSD(伯克利软件发布版) 免费

  • 商业版 SCO Unix

  • 工作站生产商发布版:Solaris (Sun), IRIX(SGI), Digital Unix (Compaq), HP-UX,AIX(IBM)

  • 自由发布的、最初面向PC的 Linux!


Linux why linux
Linux & Why Linux

  • 天才大学生Linus Torvalds开发

  • 用于 PC 的免费Unix

  • 开放源代码,业余爱好者共同开发

  • 它的出现,使得Unix成为一个低廉或免费的OS

  • 系统资源消耗<<Windows or Mac

  • 开发软件的接触平台,有用于计算机生物学和一般性研究的丰富工具库


Unix图形界面

  • 基于命令行

  • X窗口系统:让程序在屏幕上画图

  • GNOME KDE: 桌面环境,类似于Windows


Linux
建立Linux工作站

  • 一台电脑

  • 安装打包的Linux(Red Hat、Debian、SuSE)

    还有窗口界面强大的ubuntu


打包的内容

  • X Window系统

  • 桌面选择

  • 邮件、Web、新闻组工具

  • 图形操作工具

  • 多媒体支持

  • 工具软件和网络化的工作站支持

  • 开发包:gcc系列(c、c++、fotran、java)

    ifort 英特尔fortran编译器

  • ftp、mysql、php


Bioinformatic
Bioinformatic相关的包

  • R:用于统计学计算和图形的强大工具

  • OpenGL/Mesa:用于创建图形用户界面的开发工具包,可提高一些分子可视化软件性能

  • MySQL 小型数据库

  • Octave 类似于Matlab的数值计算高级语言

  • Xemac:功能强大的基于X Window的编辑器

  • JDK/JRE

  • Openoffice(来自Sun,原名StarOffice)


Linux1
Linux基础

  • 如何使用Linux

  • Linux的用户界面

  • Linux基础命令

  • Linux文件系统

  • Linux文件属性

  • Linux文件备份和压缩

  • 进程管理


Linux2
使用Linux

  • 开机 选择启动

  • 注册

  • 进入图形界面--startx

  • 远程登陆Linux--telnet、ssh

  • 注销--logout、exit

  • 关机--shutdown、halt、reboot、poweroff


Linux shell

alias

设置bash别名

bg

使一个被挂起的进程在后台继续执行

cd

改变当前工作目录

exit

退出当前shell

export

使变量的值对当前shell的所有子进程都可见

fc

用来编辑历史命令列表里的命令

fg

使一个被挂起的进程在前台继续执行

help

显示bash内部命令的帮助信息

kill

终止某个进程

pwd

显示当前工作目录

unalias

删除已定义的别名

Linux用户界面-几个常用的shell命令


Linux shell1

EDITOR, FCEDIT

bsah fc 命令的缺省编辑器

HISTFILE

用于贮存历史命令的文件

HISTSIZE

历史命令列表的大小

HOME

当前用户的用户目录

OLDPWD

前一个工作目录

PATH

bash寻找可执行文件的搜索路径

PS1

命令行的一级提示符

PS2

命令行的二级提示符

PWD

当前工作目录

SECONDS

当前shell开始后所流逝的秒数

Linux用户界面-几个常用的shell命令


Linux bash
Linux用户界面-bash的特点

  • 命令补全

  • 通配符

  • 命令历史

  • 别名

  • 重定向

  • 管道

  • 提示符

  • 作用控制

  • bash配置文件


命令的格式

$ command options arguments

For Example :

$ mail -f newmail


命令格式举例

RIGHT WRONG

1 Spearation

$ mail -f newmail $ mail - f newmail

2 Order

$ mail -f newmail $ mail newmail -f

3 multiple

$ who -m -u $ who -m-u

$ who -mu $ who -m u


键入命令

  • 在shell提示符下,输入命令,然后按下Enter键。

  • shell识别大小写

  • 如果找不到你输入的命令,会显示反馈信息:“Command not Found”

  • 如果命令太长,要在第一行行尾键入“\”字符和按下Enter键,在下一行的“>”后接着输入


  • 键盘的快捷方式

  • <ctrl-c> 停止命令

  • <ctrl-d> 结束传输或者文件

  • <ctrl-s> 临时停止输出

  • <ctrl-q> 恢复输出

  • <ctrl-u> 擦除整行

  • <backspace> 纠正错误


基础命令

  • 命令的输入与编辑

    • 输入teln + <TAB> + bbs.zsu.edu.cn。这样的效果和输入telnet bbs.zsu.edu.cn相同

  • 修改口令

    • Passwd <用户名>

  • 查询及修改日期时间

    • date MMDDhhmm[[CC]YY][.ss],date后面的部分是日期字符串,表示要修改的日期时间,MM代表月份,DD代表日期,hh代表时,mm代表分,CC代表年份的头两位,YY代表年份的后两位,[ ]表示括号括住的内容是可以省略的(以下同),如果年份被省略,则表示为当年,ss代表秒。

  • 观看日历

    • cal [月] [年]


基础命令

  • 清屏

    • clear

  • 获取用户信息

    • logname

    • Whoami

    • who

  • 与其他用户进行简单通讯

    • write用户账号[@主机名] [终端号]

  • 观看主机信息

    • uname-a

  • 寻找命令使用方法

    • man <命令>


Linux3
Linux文件系统

  • linux文件

    • 命名格式

  • 目录结构

    • 树型结构

    • 支持的文件系统

  • 路径

    • 相对路径

    • 绝对路径


Linux4
Linux文件名称

  • 包含 大写键、小写键、数字、#、@、_

  • 不包含空格

  • 不包含以下字符 * ? > < / ; $ \ ‘“

  • 不能以 “+”或者“-”开头

  • 区分大小写

  • 最长文件名 255


文件的类型

  • 普通文件

  • 目录文件

  • 设备文件: /dev/tty1

  • 连接文件:存放文件系统中通向文件的路径

  • file 文件名


文件的类型

  • 普通文件

  • 目录文件

  • 设备文件: /dev/tty1

  • 连接文件:存放文件系统中通向文件的路径

  • file 文件名


普通文件

  • 也称常规文件,包含各种长度的字符串。例如:信件、报告和脚本。

  • 文本文件:由ASCII字符构成。

  • 数据文件:由来自应用程序的数字型和文本型数据构成。例如:电子表格、数据库等。

  • 可执行的二进制程序:由机器指令和数据构成。


Linux5
Linux文件系统

  • 相关操作命令

    • 文件及子目录名称列表--ls

    • 显示一个文本文件的内容– cat <文件名>

    • 改变文件、目录名称,搬移整棵目录树--mv <原文件或子目录名称> <新名称>

    • 删除文件– rm <文件名>

    • 复制文件 -- cp <带路径指引的源文件名称> <带路径指引的目标文件名称>

    • 创建新的子目录– mkdir [<路径>/]<新目录名称>

    • 删除目录--rmdir <带路径指引的目录名称>

  • 通配符与多文件操作

  • 硬链接

  • 符号链接


  • -1 每列仅显示一个文件或目录名称

  • -a 显示所有文件或目录,包括以“.”为名称开头字符的文件、现行目录“.”与上层目录“..”

  • -l 使用详细格式列表。将权限标示、硬件接数目、拥有者与群组名称、文件或目录大小及更改时间一并列出

  • -R 递归处理,将指定目录下的所有文件及子目录一并处理


Linux6

通配表达式

含义

A*

以a开头的所有文件

[a-zA-Z]???

以英文字母(大小写)开头,文件名称长度为4个字符的文件

*.html

以.html作后缀的文件

F[012]

文件名称开头字母为f,名称长为2个字符,第二个字符为0或1或2

F[1-9]

文件名称长为2个字符,以f开头,第二个字符是1~9九个数字中的一个

*

全体文件

?disk*

文件名称的第二到第五个字符分别为disk

Linux文件系统--通配符与多文件操作


  • 建立目录team02,并让全部人都有rwx的权限

    #ls

    team01

    #mkdir –m 777 team02

    #ls

    team01 team02


  • 目录team03下只有dir1目录,在删除dir1的同时也删除team03

  • #rmdir –p team03/dir1

  • #ls

  • team01 team02


文件属性

  • 文件操作相关命令

    • 观看文件名称列表,命令是ls

    • 显示一个文本文件的内容,命令是cat

    • 删除一个文件,命令是rm

    • 改变一个文件的名称,命令是mv

    • 复制文件,命令是cp


文件操作命令

  • cp 复制文件或目录

  • mv 移动文件和文件换名

  • rm 删除文件或目录

  • ln 在文件间建立连接

  • find 查找特定的文件

  • touch 改变文件的时间参数


复制文件或目录命令cp

  • cp命令用来复制文件。在缺省的情况下,这个命令工作的时候不做任何显示;只有在出现一个错误情况的时候才显示状态信息。

  • cp [源文件名] …… [目标文件名]

  • cp –r [源目录名] [目标目录名]


  • file1,file2复制到team01目录里,再将team01目录复制到team02目录里。

    #cp file1 file2 team01 或

    #cp file* team01

    #cp –r team01 team02


移动/重命名文件命令mv

  • mv命令用来把文件从一个位置移动到另外一个位置,也可以从一个分区移动到另外一个分区。

  • mv [源文件列表] [目标文件]


  • 将文件file1改名为file

    #mv file1 file

  • 将目录team01下的两个文件file1、file2移到team02下。

    #ls

    team01 team02

    #mv team01/file1 file2 /team02


删除文件或目录rm

  • 从文件系统中删除文件及整个目录

  • rm [选项][文件列表]

  • -r 删除文件列表中的目录

  • -i 指定交互模式。在执行删除前提示确认。

  • 文件列表:希望删除的用空格分隔的文

    件列表,可以包括目录名



在文件间建立连接ln

  • ln命令用来建立硬连接和符号连接。硬连接是一个文件的额外的名字,没有源文件,硬连接便不能存在。而对于符号连接,当原文件被删除后,符号连接仍然存在。

  • ln [选项] 源文件 目标文件

  • ln [选项] 源文件列表 目标目录


  • -s 建立一个符号连接而不是硬连接

  • -d 建立目录的硬连接

  • 现有文件file1,file2与目录team01,欲在team02 中建立起符号连接

    #ln –s /home/file1 /home/file2 /home/team01 team02

  • 设dir3是一个目录的符号连接,现在建立其硬连

    接dir4

    #ln –d dir3 dir4


查找文件命令find

  • find命令可以根据各种检索条件查找文件

  • find [路径…] [表达式]

  • 路径…:准备寻找文件所在的路径以及它

    的子路径,也可以是多个路径。

  • 表达式:包含要搜索文件的条件,可以包

    含文件名、拥有者、最后修改时间等。


  • -atime n 至少n*24小时内没有访问过的文件

  • -ctime n 至少n*24小时内没有修改过的文件

  • -amin n n分钟之前访问过的文件

  • -cmin n n分钟之前修改过的文件

  • -empty 文件为空

  • -name name 指定要寻找的文件或目录的名称

  • -type x:以文件的类型作为寻找的条件。若x为“d”,则表示寻找目录;x为“f”,表示寻找普通文件;x为“c”,表示寻找字符特殊设备; x为“b”,表示寻找特殊块设备; x为“p”,表示寻找命名管道; x为“l”,表示寻找符号连接; x为“s”,表示寻找套接字。


  • 如果想查找/home子目录中至少7天没有被访问过的文件,请使用下面的命令:

    #find /home -atime 7 -print

  • 如果想找出/ usr/src子目录中名字为core的文件并删除它们,请使用下面的命令:

    # find /usr/src -name core -exec rm { } \ ;

  • 如果想找出/home中以.jpg结尾并且长度超过100K的文件,请使用下面的命令:

    # find /home -name " *.jpg " -size 100k


Touch
改变文件的时间参数touch

  • 改变文件访问和修改时间,或用指定时间建立新文件。

  • touch [选项] MMDDhhmmYY 文件列表

  • -a 只更改访问时间

  • -c 若目标文件不存在,不建立空的目标文件


  • 使用不带参数的touch命令将文件的时间修改为当前时间

    #ls

    -rw-r--r-- 1 root root 37350 Jan 27 2003 file1

    #touch file1

    -rw-r--r-- 1 root root 37350 Jan 1 16:15 file1

  • 使用选项-t直接修改时间

    #touch –t 01201500 file1

    -rw-r--r-- 1 root root 37350 Jan 20 15:00 file1


文件显示命令

  • cat 显示和合并文件

  • more 分屏显示文件

  • head 显示文件的前几行

  • tail 显示文件的最后几行


显示和合并文件命令cat

  • 可以结合多个文件,并将它们的内容输出到标准输出设备。

  • cat [选项] [文件列表]

  • -b 列出文件内容时,在所有非空白列之开头标上编号,从1开始累加

  • -E 在每一列的最后标上“$”符号

  • -n 列出文件内容时,在每一列之开头标上编号,从1开始累加


  • cat指令从标准输入设备(如键盘)读取数据,转而输出至标准输出设备(如显示器)

    $ cat 执行指令,不加任何参数

    123 键入任何文字后,按下回车键

    123 系统回应一模一样的文字

  • 利用特殊字符“〉”将名称为file1与 file2 的文件合并成一个文件file3:

    $ cat file1 file2 > file3

    若文件file3已经存在,则其内容会被覆盖过去;欲避免这种状况发生,可用“〉〉”代替“〉”,新的内容就会附加在原有内容之后,而不会覆盖它。


分屏显示文件命令more

  • more可将文件内容显示于屏幕上,每次只显示一页。可以往下浏览,但无法向上浏览 , less指令可以上下浏览 。

  • more [选项] [文件名]


  • -<行数> 指定每次要显示的行数

  • +/<字符串> 在文件中查找选项中指定的字符串,然后显示字符串所在该页的内容

  • +<行数> 从指定的行数开始显示

  • -n 每次只显示n行

  • -c 不滚屏,在显示下一屏之前先清屏


  • 在文件file1中查找“123”字符串,然后从

    改页开始显示文件的内容:

    #more +/123 file1

  • 显示文件file1的内容,每10行显示一次,

    而且在显示之前先清屏。

    #more –c –10 file1


显示文件的前几行命令head

  • 在屏幕上显示指定文件的开头若干行。默认值是10行。

  • head [选项] 文件名

  • -c N:显示前N个字节

  • -n N:显示前N行

  • #head –5 file


显示文件的最后几行命令tail

  • 在屏幕上显示指定文件的末尾若干行。默认值是10行。

  • tail [选项] 文件名

  • -c N:显示前N个字节

  • -n N:显示前N行

  • +N :从文件开头的第N行开始显示


比较文件内容命令

  • comm 比较两个已排过序的文件

  • diff 比较文件的差异


comm命令

  • 用来对两个已排过序的文件进行逐行比较

  • comm [-123] file1 file2

  • -1 不显示只在第一个文件里出现过的行

  • -2 不显示只在第二个文件里出现过的行

  • -3 不显示在第一、第二个文件里都出现

    过的行


  • file1的内容如下: file2的内容如下:

    main () main ()

    { {

    printf(“Hello!\n”); printf(“Good!\n”);

    } }

  • 用comm命令对这两个文件进行比较只显示它们共有的行。

    #comm –12 file1 file2

    main ()

    {

    }


diff命令

  • 比较两个文本文件,并显示它们的不同

  • diff [选项] file1 file2

  • -c 输出格式是带上下文的三行格式

  • -C n 输出格式是带上下文的n行格式

  • -r 两个文件都是目录时,递归比较找

    到的各子目录


  • 输出的一般形式如下:

    n1 a n3,n4

    n1,n2 d n3

    n1,n2 c n3,n4

  • a-附加 d-删除 c-修改

  • file1的内容如下: file2的内容如下:

    1main () 1 main ()

    2{ 2 {

    3 printf(“Hello!\n”); 3 int n,m;

    4} 4 n=10;

    5 5 printf(“%d\n”,m=n*10);

    6}


  • 输入命令

  • #diff file1 file2

    3,5c 3,6

    <3 printf(“Hello!\n”) ;

    <4 }

    <5

    ---

    >3 int n,m;

    >4 n=10;

    >5 printf(“%d\n”,m=n*10);

    >6}


文件权限操作

  • chmod 改变文件或目录的许可权限

  • chown 改变文件的所有权

  • chgrp 改变用户分组


文件的保护和权限

rwx rwx rwx

user group others

一个普通文件

r = 可以查看文件内容

w = 可以修改文件内容

x = 可以执行文件


一个路径

r : 可以查看文件夹下的文件

w : 可以在文件夹下创建和删除文件

x : 可以进入文件夹或者访问文件夹下的文件


user groupothers

符号 rwx rw- r--

二进制 111 110 100

4+2+1 4+2+0 4+0+0

八进制 7 6 4

缺省的文件权限:

file -rw-r--r-- 644

directory drwxr-xr-x 755


Chmod
改变文件属性命令chmod

  • 用来改变文件或目录的权限

  • chmod[选项] 模式 文件列表


改变文件的权限

u = owner of the file

g = owner’s group

o = other users on the system

+ = add permissions

- = remove permissions

= = clears permissions and sets to mode

specified


  • 使文件file在各个级别拥有所有权限

    #chmod 777 file

  • 允许所有人读file,但只有拥有者能改变它

    #chmod 644 file

  • 给所有人增加写权

    #chmod a+w file

  • 对组级和其他用户除去写权和读权

    #chmod o-wr,g-wr file

  • 建立其他用户的只读权

    #chmod o=r file


Chown
改变文件的所有权命令chown

  • chown命令可以把一个文件的所有权修改为别人的。只有根用户能够进行这样的操作。

  • chmod[选项] 用户 文件列表

  • -v 详细说明所有权的变化

  • -r 递归改变目录及其内容的所有权


Chgrp
改变用户分组命令chgrp

  • chgrp命令可以改变一个文件的用户分组设置情况

  • chgrp[选项] 用户 文件列表

  • -v 详细说明文件所属的用户组的变化

  • -r 改变本目录及其所有子目录中的文件所属的用户组


文件备份和压缩-tar

  • -c:建立新的备份档文件。

  • -d:将备份档文件与文件系统中的原始文件进行比较。

  • -r:向备份档文件追加文件。

  • -t:列出备份档文件中所含的文件。

  • -x:从备份档文件中解出文件。

  • -f:以文件方式,或使用某设备文件所对应的设备备份文件。

  • -M:使用分卷(例如多张软盘)的备份文件。

  • -v:在处理过程中显示相关信息。

  • -w:进行每一步操作时用户需首先进行确认。

  • -W:备份后校验。

  • -z:带压缩的备份(gzip压缩)。


进程管理-进程组件

  • 重要的进程信息

    • 进程的地址空间映射。

    • 进程的状态。如睡眠状态、停止状态、可运行状态等。

    • 进程执行的优先级。

    • 进程已经使用的资源信息。

    • 进程的信号掩码。

    • 进程的属主。


进程管理-进程组件

  • PID 进程的ID号

  • PPID 父PID

  • UID和EUID 实际用户ID和有效的用户ID


进程管理

  • 查询进程信息 -ps

  • 启动进程

  • 中止进程 - kill <PID>

  • nohup和后台执行

    • nohup <命令>

    • <命令> &

    • nice <优先级> <命令>


定时执行

  • at <时间>

    设定在当天12:30将/root/abc文件以电子邮件方式向用户h1、h2发送。可以输入:

    at 12:30↙

    此时光标停在下一行,可以开始输入要定时执行的命令:

    cat /root/abc|mail –s “file abc”h1 h2↙

    如果还有其他命令,还可继续输入,最后以<ctrl>+d结束。系统回应:

    Job 35 will be excuted using /bin/sh

    “35”是对应作业号,此处表示用户所提交的定时执行作业已被接纳,系统会在指定时间以/bin/sh为Shell执行该命令。


定时执行

  • 查看at状态

    • at -l

  • 要删除正待执行的一项作业

    • at –r <作业号>

  • 定时执行shell

    • at <时间> -f <shell过程文件名称>


Crontab
定时执行-crontab

每行包括一个<时间域>和<命令>,表示<命令>在指定的时间将被执行,而<时间域>则被空格或制表符分为5栏,分别为:

分钟小时日月星期。

例如:

0,20,40 * * * 1-5 ls –l

表示从周一到周五,每隔20分钟(实际上是每小时的正点、20分、40分)执行一次ls–l命令,“*”表示“任何有效值”,同一栏中如果要指定多个值,则用“,”分隔。


Linux程序设计基础

  •          GNU

  •          Linux下IDE的使用

  • Linux下使用GNU cc开发应用程序

  • Linux程序的调试

  • Linux下使用RCS/CVS来管理源程序


Linux7
Linux 的官方定义

  • “Linux 是一种 UNIX 操作系统的克隆,它(的内核)由 Linus Torvalds 以及网络上组织松散的黑客队伍一起从零开始编写而成。 Linux 的目标是保持和 POSIX 的兼容。

  • “Linux 具备现代一切功能完整的 UNIX 系统所具备的全部特征,其中包括真正的多任务、虚拟内存、共享库、需求装载、共享的写时复制程序执行、优秀的内存管理以及 TCP/IP 网络支持等。

  • “Linux 的发行遵守 GNU 的通用公共许可证。

  • “Linux 起初为基于 386/486 的 PC 机开发,但现在,Linux 也可以运行在 DEC Alpha、SUN Sparc、M68000,以及MIPS 和 PowerPC 等计算机上。”


GNU

  • GNU 是 GNU Is Not UNIX 的递归缩写

  • 是自由软件基金会的一个项目,该项目的目标是开发一个自由的 UNIX 版本,这一 UNIX 版本称为 HURD。尽管 HURD 尚未完成,

  • GNU 项目开发了许多高质量的编程工具: emacs 、(gcc 和 g++),这些编译器可以在任何计算机系统上运行。

  • 所有的 GNU 软件和派生工作均适用 GNU 通用公共许可证,即 GPL。GPL 允许软件作者拥有软件版权,但授予其他任何人以合法复制、发行和修改软件的权利。


Gnu linux
GNU与Linux的关系

  • Linux 的开发使用了许多 GNU 工具。

  • Linux 系统上用于实现 POSIX.2 标准的工具几乎都是 GNU 项目开发的。

  • Linux 内核、GNU 工具以及其他一些自由软件组成了人们常说的 Linux:

    • 符合 POSIX 标准的操作系统 Shell 和外围工具。

    • C 语言编译器和其他开发工具及函数库。

    • X Window 窗口系统。

    • 各种应用软件,包括字处理软件、图象处理软件等。

    • 其他各种 Internet 软件,如FTP 服务器、WWW 服务器等。

    • 关系数据库管理系统等。


Gpl general public license
GPL (General Public License)

  • GPL 和软件是否免费无关,它主要目标是保证软件对所有的用户来说是自由的。 GPL 通过如下途径实现这一目标:

    • 它要求软件以源代码的形式发布,并规定任何用户能够以源代码的形式将软件复制或发布给别的用户。

    • 它提醒每个用户,对于该软件不提供任何形式的担保。

    • 如果用户的软件使用了受 GPL 保护的任何软件的一部分,那么该软件就继承了 GPL 软件,并因此而成为 GPL 软件,也就是说必须随应用程序一起发布源代码。

    • GPL 并不排斥对自由软件进行商业性质的包装和发行,也不限制在自由软件的基础上打包发行其他非自由软件。


GPL

  • 遵照 GPL 的软件并不是可以任意传播的,这些软件通常都有正式的版权,

    • GPL在发布软件或者复制软件时声明限制条件。但是,从用户的角度考虑,这些根本不能算是限制条件,相反用户只会从中受益,因为用户可以确保获得源代码。

  • 假如准备以二进制的形式发布应用程序(像大多数商业软件那样),则必须确保自己的程序未使用 GPL 保护的任何软件。如果软件通过库函数调用而使用了别的软件,则不必受到这一限制。大多数函数库,受另一种 GNU 公共许可证,即 LGPL 的保护。


Linux8
Linux 的主要发行版

除表中列出的发行版之外,还有大量的发行版存在,比如 Slackware、OpenLinux、

Mandrake 等等。建议新手使用 Red Hat Linux 或自己喜欢的某种本地化发行版。


Unix gnu linux
UNIX, GNU, Linux 的关键人物及贡献

  • Ken Thompson, Dennis Ritchie:UNIX;60 年代末

  • Brian Kernighan, Dennis Ritchie:The C Programming Language;70 年代末

  • Richard Stallman:FSF,GNU,GPL,emacs,gcc;80 年代中

  • Andrew S. Tanenbaum:MINIX,Operating Systems: Design and Implementation; 80 年代末,90年代初

  • Linus Torvalds:Linux;90 年代

  • Eric Raymond:《黑客文化简史》,《如何成为一名黑客》,《大教堂和市集》,《开拓智域》,《魔法大锅炉》


Linux9
Linux 发展的重要里程碑

  • 1990, Linus Torvalds 首次接触 MINIX

  • 1991 中, Linus Torvalds 开始在 MINIX 上编写各种驱动程序等操作系统内核组件

  • 1991 底, Linus Torvalds 公开了 Linux 内核

  • 1993, Linux 1.0 版发行,Linux 转向 GPL 版权协议

  • 1994, Linux 的第一个商业发行版 Slackware 问世

  • 1996, 美国国家标准技术局的计算机系统实验室确认 Linux 版本 1.2.13(由 Open Linux 公司打包)符合 POSIX 标准

  • 1999, Linux 的简体中文发行版相继问世

  • 2000 中, LinuxWorld China 2000 展览会召开,涌现大量基于 Linux 的嵌入式系统。


C 语言编程风格

  • 良好的编程风格可以增加代码的可读性,并帮助你理清头绪

  • Windows 所推崇的匈牙利命名法比较复杂

  • C 语言最初来自 UNIX 操作系统,与 UNIX 的设计原则一样, C 语言被广泛认可和使用的一个重要原因是它的灵活性以及简洁性。

  • 因此,在利用 C 语言编写程序时,始终应当符合其简洁的设计原则,而不应当使用非常复杂的变量命名方法。


缩进

  • 缩进时,使用长度为 8 个字符宽的 Tab 键。如果程序的缩进超过 3 级,则应考虑重新设计程序。

  • 不应过分强调注释的作用,应尽量采用好的编码风格而不是添加过多的注释。


大括号位置

int function(int x, int y){        if (x == y) {                ...        } else if (x > y) {                ...        } else {                ...        }        return 0;}

  • 除函数的定义体外,应当将左大括号放在行尾,而将右大括号放在行首。函数的定义体应将左右大括号放在行首。


命名

  • 与Modula-2和Pascal程序员不同,C程序员不使用ThisVariableIsATemporaryCounter这样可爱的名字。

  • 简洁!

  • 对变量名,不赞成使用大小写混写的形式,但鼓励使用描述性的名称;

  • 不采用匈牙利命名法表示变量的类型;

  • 采用短小精悍的名称表示局部变量; 尽可能不用全局变量;

  • 保持函数短小,从而避免使用过多的局部变量。


Linux c c
Linux 上的 C/C++ 编译器和调试器

  • 运行 gcc/egcs

  • gcc/egcs 的主要选项

  • gdb

  • gdb 的常用命令

  • gdb 使用范例


Gcc egcs
运行 gcc/egcs

  • Linux 中最重要的软件开发工具是 GCC

  • GCC 是 GNU 的 C 和 C++ 编译器

  • 现在的GCC支持:c、c++、java、Fortran

  • 例子

    gcc hello.c –o hello

    ./hello


多个文件

  • $ gcc -o factorial main.c factorial.c $ ./factorial 5

  • Factorial of 5 is 120.


Gcc egcs1
gcc/egcs 的主要选项


gdb

  • GNU 的调试器称为 gdb,该程序是一个交互式工具,工作在字符模式。

  • 在 X Window 系统中, 有一个 gdb 的前端图形工具,称为 xxgdb。

  • gdb 是功能强大的调试程序,可完成如下的调试任务:

    • * 设置断点;

    • * 监视程序变量的值;

    • * 程序的单步执行;

    • * 修改变量的值。


gdb

  • 在可以使用 gdb 调试程序之前,必须使用 -g 选项编译源文件。

  • 运行 gdb 调试程序时通常使用如下的命令: gdb progname


gdb 的常用命令


gdb 使用范例

上面这个程序非常简单,其目的是接受用户的输入,然后将用户的输入打印出来。

该程序使用了 一个未经过初始化的字符串地址 string,因此,编译并运行之后,

将出现 Segment Fault 错误:


gdb查找错误


VIM编辑器

  • VI是Linux世界里最常用的全屏编辑器,VIM是其加强版。原意: visual interface

  • 用户键入的内容会立即被显示出来

  • VI不是一个排版程序,不象Word或WPS那样可以对字体、格式、段落等其他属性进行编排,它只是一个文本编辑程序。


两种操作模式

  • 命令模式:从键盘上输入的任何字符都被作为编辑命令来解释。

  • 输入模式:从键盘上输入的所有字符都被插入到正在编辑的缓冲区中,被当作正文。只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式


进入vi

  • #vi vifile

~

~

~

~

“file”[New file]


退 出 vi

  • :q 退出未被编辑过的文件

  • :q! 强行退出vi

  • :x 存盘退出vi

  • :wq 存盘退出vi


文本输入

  • 按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件;

  • 按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;

  • 按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。


移动光标

<up_arrow>

Ctrl+P

-

k

<right-arrow>

Space

<left-arrow>

Backspace

h

l

+

j

Ctrl+N

<down-arrow>


  • 移至行首:^ 、0

  • 移至行尾:$

  • 移至指定行:[行号] G或

  • 下移多少行 [行号] [Enter]

  • 移至指定列:[列号] |


文本删除

1. 删除字符

  • x或nx:从光标所在的位置删除一个或n个字符

  • X或nX:删除光标前的一个或n个字符


2. 删除文本对象

  • dd:删除光标所在的行

  • D: 删除从光标位置开始至行尾

  • dw:删除从光标位置至该词末尾的所有字符

  • d0:删除从光标位置开始至行首

  • d5G:将光标所在行至第5行删除


复原命令

  • u:如果插入后用此命令,就删除刚插入的正文;如果删除后用它,则插入刚删除的正文。

  • U:把当前行恢复成它被编辑之前的状态


重复命令

  • . :重复实现刚才的插入命令或删除命令


屏幕命令

  • 滚屏命令:Ctrl+U和Ctrl+D。分别向上和向下滚动半个窗口。

  • 翻页命令: Ctrl+F和Ctrl+B。分别向前和向后翻页


要遵守的步骤提要:

  • 进入vi 键入vi并按回车

  • 到输入模式 按<a>

  • 输入文本 将文本键入缓冲区

  • 到命令模式 按<Esc>

  • 保存缓冲区到文件 键入:w file ,并按回车

  • 退出vi 键入:q ,并按回车


Linux shell2
Linux shell简介

  • 什么是Shell

  • Shell的主要版本

  • Shell中的命令规则,路径和文件

  • Shell中的命令补齐、别名功能和保留字

  • Shell中的重定向和管道

  • Shell Script简介


Shell
什么是Shell

  • shell是linux的一个外壳,它包在linux内核的外面,为用户和内核之间的交互提供了一个接口。当用户下达指令给操作系统的时候,实际上是把指令告诉shell,经过shell解释,处理后让内核作出相应的动作。而系统的回应和输出的信息也由shell处理,然后显示在用户的屏幕上.


Shell1
Shell中的二种命令

  • 1.内建命令:

  • 包含在shell自身当中的,在编写shell的时候就已经包含在内了。比如cd,exit。查看内建命令的方法可以使用help命令。

  • 2.外部命令:

  • 是存放于文件系统某个目录下的具体的可执行程序,比如cp就是在/bin目录下的一个可执行文件,外部命令也可以是某些商业或自由软件,如netscape.


用户工作环境

  • 环境变量:

  • 对环境的设置可以通过给各种环境变量赋值来实现.每一种环境变量控制了一项工作环境的设置.

  • 不加任何参数直接使用set命令可以显示出用户当前所有环境变量的设置.

  • 路径PATH是shell的一个环境变量。

  • 每种shell都有自己的配置文件,用户可以在配置文件里设置各种环境变量。环境变量的配置文件有系统环境配置文件和个人环境配置文件两种。


Shell2
常用shell环境变量说明


环境设置文件有两种

  • 1.系统环境配置文件:

  • /etc/profile和/etc/bashrc

  • profile文件在每个用户登陆系统时都会被执行,把其中的设置加入到用户的环境中.

  • bashrc文件用于对subshell的环境进行设置。比如新启动了一个shell,此时启动的shell就是subshell,新的shell会从/etc/bashrc文件中读取环境配置.


环境设置文件有两种

  • 2.个人环境配置文件:

  • 系统环境配置文件对所有用户对会起作用,只有root用户才有权对其进行修改。普通用户如果想定制自己的工作环境。可以编辑自己的个人环境设置文件。个人环境设置文件主要有二个:

  • $HOME/.bash_profile

  • $HOME/.bashrc


22 2 2 shell
22.2.2 Shell的主要版本

  • sh:

  • sh就是Bourne Shell的缩写,是UNIX系统最早的shell。

  • bash:

  • bash就是Bourne Again Shell的简称,是Bourne Shell的扩展,完全兼容Bourne Shell。

  • csh:

  • C Shell是一种比Bourne shell更适于编程的shell,是美国加州大学Berkeley分校开发出来的,具有和C语言相似的语法,但和sh不兼容。

  • tcsh:

  • tcsh是Enhanced C Shell,是C Shell的一个增强版。

  • ksh:

  • ksh是Korn Shell的缩写,集合了C shell和Bourne shell的优点并且和Bourne shell完全兼容。

  • 其它:ash,zsh


Shell3
如何去查看shell的版本

  • Shell搭起了用户与操作系统间的沟通的桥梁,它提供了基本的操作界面,让用户可以下达各种命令、在系统中进行操作、产生彼此间的交互关系,因此可以将Shell看成是一种用户环境。

  • 1.命令提示符

  • [[email protected] lrj]$ 这就是命令提示符

  • (提示符主要告诉用户现在可以下达命令,同时也表示先前达的命令已经完成)

  • 2.查看默认的Shell的种类

  • [[email protected] lrj]$ echo $SHELL 查看当前使用的shell

  • 回车后显示为:/bin/bash


Shell4
Shell中的命令规则,路径和文件

  • 1.命令的一般格式是:命令+选项+参数

  • 2.命令一般是小写字符串,注意区分大小写。

  • 3.选项通常是以减号“-”加上一个或数个字符表示,当在一个命令中使用

  • 多个选项时,可以在减号后面把代表不同选项的字母合并起来。

  • 4.参数就是命令执行时处理的对象,可能是文件,目录或是设备。

  • 5.在同一行中可以有数个命令,不同命令间以分号“;”隔开。执行时首先执行前面的命令,执行完后顺序执行后面的命令。

  • 6.shell中的命令参数可以由另一个命令执行的结果来替代。


Shell5
shell中的命令补齐、别名功能和保留字

  • 所谓命令补齐(Command-Line Completion)是指当键入的字符足以确定目录下一个唯一的文件时只须按Tab键就可以自动补齐该文件名的剩余部分 。

  • Bash还提供了别名功能(alias)。用户可以为一些比较长的命令设置别名,这样以后用户便可以输入相对简单的别名来代替该命令了。


Shell6
shell常用保留字的含义


Shell7
Shell中的重定向和管道

  • 命令<文件:

    • 输入重定向。以文件中的内容作为命令的输入,以取代标准输入。

  • 命令>文件:

    • 输出重定向。表示把命令的输出输出到文件里,以取代标准输出。

  • 命令>>文件:

    • 输出重定向。(用“>”进行输出重定向会把原来的文件覆盖掉,而“>>”是把输出添加到原文件的末尾。)

  • 命令A|命令B:

    • “|”是管道符号,表示把命令A运行的结果,也就是命令A的标准输出作为命令B的标准输入。


(重定向)>、>>命令

  • 重定向(redirect)可将某命令的结果输出到文件中,它有两种命令:>和>>。>可将结果输出到文件中,该文件原有的内容会被删除。>>则将结果附加到文件中,原文件内容不会被清除。

  • [[email protected] lrj]$ ls -al > dir.txt 将ls –al命令执行结果输出到

  • dir.txt文件中

  • [[email protected] lrj]$ cat data1.txt >> dir.txt

  • 将data1.txt内容附加到dir.txt文件之后


管道“|”命令

  • 管道(pipe)命令的符号是“|”,可将某命令A的结果输出给另一命令B去执行。

  • 格式:A | B

  • [[email protected] etc]# ls | grep hosts 搜索并显示ls命

  • 结果中包含有“

  • hosts”字符串的

  • hosts

  • hosts.allow 显示结果

  • hosts.deny


Shell8
shell 脚本介绍

一个shell 脚本可以包含一个或多个shell命令,可用来自动完成通常在命令行上执行的重复循环或者复杂的工作,节省大量时间,且功能强大

shell脚本主要内容

  • 脚本按行解释执行,每一行可以是命令、注解、或是流程控制指令等

  • 脚本第一行以 #!开始,后面加所使用的shell(需指明整个路径名称) (如:以 #!/bin/sh指定使用Bourne Shell)

  • 在脚本中执行一个命令的方法和在命令行中相同,可以前台或后台执行,也可设定一些环境变量

  • 注释,#后面的同一行文字为注释,解释器对此不予解释

  • 脚本的流程控制近似于一般高级语言,这使得脚本的功能比DOS的批处理文件功能更加强大


Shell9
常用shell命令

  • 文件及文件属性操作

    • ls、cp、mv、rm

    • ln、ln –s、chmod、chown、chgrp

  • 输入输出操作

    • echo 、cat

    • >>、>、<<、|

    • 标准输入 0 、标准输出 1 、 标准错误输出 2

  • 目录操作

    • cd、 pwd、 ls dir

    • mkdir、 cp、 mv 、 rmdir、 rm -r

  • 文本过滤

    • Head、 tail、 grep、sort、 uniq

    • sed、 awk

  • 其他

    • find、expr

  • 获取信息: man


Sed awk
正则表达式——sed与awk的基础

  • 正则表达式是一些特殊或不很特殊的字符串模式的集合。

  • 字符集包括:普通字符集和元字符集(通配符)

    • 普通字符集:大小写字母、数字、空格、下划线

    • ^ 行首

    • $ 行尾

    • * 一个单字符后紧跟*,匹配0个或多个此单字符

    • [ ] 匹配[ ]内字符,可以是一个单字符,也可以是字符序列。 可以使用”-“来表示[ ]内范围,如[1-5]等价于[1,2,3,4,5]。

    • \ 屏蔽一个元字符的特殊含义,如\$表示字符$,而不表示匹配行尾。

    • . 匹配任意单字符

  • 几个常见的例子:

    • 显示可执行的文件:ls –l | grep …x...x..x 不包括文件夹:ls -l|grep "\-..x..x..x"

    • 只显示文件夹:ls –l | grep ^d

    • 匹配所有的空行:^$

    • 匹配所有的单词:[A-Z a-z]*

    • 匹配任一非字母型字符:[^A-Z a-z]

    • 包含八个字符的行:^……..$(8个.)


Sed命令

  • 命令格式

    • sed ‘/pattern/ action’ files

    • pattern: 正则表达式

    • action: 操作,包括p、d、s

  • 示例:

    • 打印行:sed –n ‘/ 0\.[0-9][0-9]$/p’ fruit_prices.txt

    • 删除行:sed ‘/^[Mm]ango/d’ fruit_prices.txt

    • 执行替换/pattern1/s/pattern2/pattern3/g:

      sed ‘s/paech/peach/g fruit_prices.txt’

    • 使用多重sed sed –e ‘cmd1’……-e ’cmdN’ files:

      sed –e ‘s/paech/peach/’ –e ‘s/ *[0-9][0-9]\.[0-9][0-9]$/\$/’ fruit_prices.txt

    • 在管道中使用sed


awk命令

  • 命令格式

    • awk ‘/pattern/ {actions}’ files

  • 示例:

    • 字段编辑:awk –F: ‘{ print $1,$3}’ inputfiles

      或:awk –F: ‘{ printf “%s is %s\n”,$1,$3}’ inputfiles

    • 执行指定模式的操作:

      awk ‘/ *\$[1-9][0-9]*\.[0-9][0-9] */ {print $0; next} /*\$0\.[0-9][0-9] */ {print $0}’ fruit_prices.txt

    • 比较操作符:<、>、<=、>=、==、!=、value ~ /pattern/、value !~ /pattern/ (相关:&&、||)

      awk ‘($2 ~ /^\$[1-9][0-9]*\.[0-9][0-9]$/) && ($3 < 75)’ { printf “……”}’ input_f

    • 利用管道符将标准输入作为输入


Shell10
shell变量

为使shell编程更加容易而且有效,系统提供了一系列shell变量,可以保存诸如文件名、路径名等有用信息,使系统获知用户相关设置

  • 本地变量:在用户现在的shell生命期的脚本中使用,若shell启动另一个进程或退出,该变量值无效

  • 环境变量:用于所有用户进程(子进程),环境变量可以在命令行中设置,但用户注销时变量值丢失。可将此变量放入.profile文件中使每次登录使这些值都被初始化

  • 特定变量参数

  • 位置变量参数


本地变量

  • 命名:可以任何不包含空白字元的字串来当做变量名称

  • 设置:v-name=value或 {v-name=value}其中,

    =:设置实际值到v-name; +:若已设置v-name,重设其值

    ?:若未设置v-name,报错;:-:若未设置v-name,设置新

  • 显示:echo可以显示单个变量取值(变量使用时名字前加$)

  • 清除:可用unset命令清除变量,即:unset v-name

  • 查看所有本地变量:可用set命令显示所有本地定义的变量

  • 只读变量:在设值变量后加命令:readonly v-name, 即

    将变量设为只读方式,任何人试图改变它均返回错误信息,

    用readonly命令可察看所有只读变量


环境变量

环境变量的设置和使用基本与本地变量相同,除了

  • 环境变量设置时必须用export导出,其格式为

    V-NAME=value; export V-NAME (或舍去分号,分写成两行)

  • 查看所有环境变量使用env命令

    常用预留环境变量

  • EDITOR设置编辑器,如: EDITOR=vi; export EDITOR

  • PWD 当前路径名

  • MANPATH保存系统上man文本目录,目录间用冒号分隔,如

    MANPATH=/usr/apps/man:/usr/local/man;export MANPATH


特定变量参数&位置变量参数

有些变量用以表示脚本运行时的一些相关信息,这些变量一开始执行脚本时就会设定,并且不能被修改,被称作特定变量参数。如:

  • $0当前脚本的文件名

  • $#当前脚本的参数个数

  • $*以一个单字符串显示所有向脚本传递的参数

  • $$脚本运行的当前进程PID

  • $!后台运行的最后一个进程的PID

  • $?显示最后命令的退出状态。0表示没有错误,其他任何值均表

    明有错误

  • 位置变量参数可以完成向一个shell脚本传递信息的功能,位置参数可任意多,但只有前9个被访问,以$n表示当前脚本的第n个参数值,其中n=1..9


变量引用

在脚本中执行变量替换时最容易犯的错误就是由于引用错误。为防止引用时产生误解,shell有一下引用类型

双引号“”:可引用除$、`、\外任意字符或字符串,最好在反馈文本字符串时全使用双引号

单引号‘’:可引用引号里所有字符(包括引号)

$ A=‘a’

$ echo $A输出结果为 a $ echo “$A”输出结果为 a

$ echo ‘$A’输出结果为 $A

反引号``:设置系统命令输出到变量,shell将反引号内作为一个系统命令并执行

$ echo `date`输出系统时间 $ echo date输出结果为date

反斜线\:屏蔽其下一字符的特殊含义(& * + ^ $ ` “ | ? )

$echo *打印当前整个目录列表$ echo \*输出结果为 *


流程控制

shell提供了用来控制程序执行流程的命令,用户可以用这些命令建立非常复杂的程序。

与传统语言不同的是,shell用于指定条件值的不是布尔表达式而是命令和字符串

控制流程包括:

  • 条件测试

  • 循环结构


条件测试(1)

test命令: test condition或[ condition ]

用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试,其测试符和相应的功能分别如下:

  • 数值测试:– eq:相等 – ge:数1大于等于数2 – gt:数1大于数2– ne:不相等 – le:数1小于等于数2 – lt:数1小于数2

  • 字符串测试:=:相等 !=:不相等 – z 字符串:空串 – n 字符串:非空串

  • 文件状态测试:-e 文件名:文件存在 -r 文件名:文件存在且可读-w 文件名:文件存在且可写 -x 文件名:文件存在且可执行-s 文件名:文件存在且非空 -d 文件名:文件存在且为目录-f 文件名:文件存在且为普通文件

  • 逻辑操作符

    shell提供了与(“-a”)、或(“-o”)、非(“!”)三个逻辑操作符用于将测试条件连接起来,其优先级为:“!”最高,“-a”次之,“-o”最低


条件测试(2)

shell脚本中的条件分支是通过if条件语句来实现,其格式为

if 条件命令串1

then  条件1为真时的命令串

elif 条件命令串2

then 条件1为假、条件2为真时的命令串

else  条件1、2均为假时的命令

fi 

例:文件拷贝输出检查ifcp

#!/bin/sh

# ifcp

if cp myfile myfile.bak

then echo “Good copy”

else echo “`basename $0`:error”

fi

其中if语句必须以 fi 终止

elif 和 else 部分可省略

也可有多个 elif部分

if语句各部分不能为空

但可使用永远为真的空命令 “:”解决此问题

  • 运行结果:

  • 从myfile到myfile.bak到文件拷贝正常

  • $ sh ifcp

  • Good copy

  • cp命令没有完成拷贝

  • $ sh ifcp

  • ifcp :error


条件测试(3)

  • if条件语句用于在两个选项中选定一项,而case条件选择为用户提供了根据字符串或变量的值从多个选项中选择一项的方法, 其格式为:case 值in 模式1) 若干命令行1;;模式2) 若干命令行2;;……*) 其他命令行esac 

  • 模式部分可能包括元字符

    *任意字符? 任意单字符 [..]类或范围中任意字符

取值后面的单词必须为in; 每个模式必须以“)”结束; 取值可为变量或常数; 取值将检查匹配的每个模式,一旦匹配,将执行期间所有命令直至“;;”,之后不再继续其他模式,若无一匹配,使用 * 捕获该值


条件测试(3续)

执行结果:

$ sh yorn

Do you wish to proceed:ab

yorn:Unkown

$ sh yorn

Do you wish to proceed:y

yes is selected

注:

echo –n:输出结束时不换行

read ANS:从标准输入设备读入并赋

值给本地变量ANS

exit 0:退出shell程序,其后数字为

返回状态,0为成功,1为错误

例:提示y或n

#!/bin/sh

#yorn

echo –n “Do you wish to proceed:”

read ANS

case $ANS in

y|Y|yes|Yes) echo “yes is selected”

;;

n|N) echo “no is selected”

exit 0

;;

*) echo “`basename $0` :Unkown”

exit 1

;;

esac


循环结构(1)

for循环对一个变量所有可能的值都执行一个命令序列。一般格式为:

for 变量名[in 数值列表]do 若干命令行done

例1:循环备份

#!/bin/sh

#forcp

BAK=“.bak”

for loop in `ls`

do echo “copy $loop to $loop$BAK”

cp $loop $loop$BAK

done

执行结果

$ sh forcp

copy a to a.bak

copy b to b.bak

假设变量名是var,则数值列表给出的数值将顺序替换循环命令列表中的$var。若省略in,则变量var的取值为位置参数。对变量的每一个可能的赋值都将执行do和done之间的命令列表

例2:使用参数

#!/bin/sh

#forparam

for param

do

echo “$param”

done

执行结果

$ sh forparam Hello Kitty

Hello

Kitty


循环结构(2)

while 和 until均用命令的返回状态值来控制循环,格式分别为:

while

若干命令行1

do

若干命令行2

done

例:循环输出

#!/bin/sh

# whileread

NUM=0

echo –n “enter: ”

while [ $NUM –lt 5 ]

do

NUM=`expr $NUM + 1`

echo –n “$NUM ”

done

until

若干命令行1

do

若干命令行2

done

until和while的区别在于:while循环在条件为真时继续执行,而until在条件为假时继续执行

只要命令行1最后一个命令的返回状态为真,就继续执行do...done之间的“命令行2”

执行结果

$ sh whileread

1 2 3 4 5

注:

expr:整数(字符串)的计算

expr argument operator argument

其中乘号必须用“/”屏蔽其特定含义


循环结构(3)

  • break :立即终止当前循环的执行,跳出循环。若在嵌入循环中,可指定跳出的循环个数

  • contiune:不跳出循环,仅是不执行本次循环后面的语句而立即开始下一次循环的执行

  • 这两个语句只有放在do和done之间才有效

例:跳出case死循环

脚本一直循环直到输入大于3

#!/bin/sh

# breakout

# : 即空命令

while :

do echo –n “Enter the number”

read ANS

case $ANS in

1|2|3) echo –n “$ANS ”

;;

*) echo “wrong”

break

;;

esac

done


Shell11
shell函数

  • 在shell中还可以将一组命令集或语句组成一个可用块,即shell函数。它与shell程序形式上是相似的,不同的是它不是一个单独的进程,而是shell程序的一部分

  • 函数定义的基本格式为:[function] 函数名(){若干命令行}

  • 调用函数的格式为: functionname param1 param2 ……

  • shell函数可以完成某些例行的工作;可以有自己的退出状态(用return可带返回值地返回脚本中函数调用下一条语句);可以作为if、while等控制结构的条件。

  • 在函数定义时不用带参数说明,但在调用函数时可以带有参数,此时shell将把这些参数分别赋予相应的位置参数$1、$2、...及$*


Shell12
shell函数(续)

例:函数返回值测试

#!/bin/sh

#func

check()

{

if [ $1 = $2 ]

then return 0

else return 1

fi

}

echo “Input two numbers”

read a b

if check $a $b

then echo "equal"

else echo "unequal"

fi

执行结果:

$ sh func

Input two numbers

2 3

unequal

$ sh func

Input two numbers

2 2

equal


ad