文档库 最新最全的文档下载
当前位置:文档库 › linux下shell 程序设计_毕业课程设计

linux下shell 程序设计_毕业课程设计

linux下shell 程序设计_毕业课程设计
linux下shell 程序设计_毕业课程设计

linux下shell 程序设计

shell编程

教学要点

1.深入理解shell概念。

2.掌握linux下shell程序设计流程。

3.理解shell程序与C程序设计的区别。

4.掌握shell程序设计中用户变量和表达式的使用方法。一.Shell编程概述

问题1:请各位同学在home目录下创建5个目录,目录名称分别为student0,student1,student2,student3,student4.且修改它们的权限为所有用户都具有完全的操作权限。

问题2:请各位同学在home目录下创建100目录,目录名称为class1—class100.

解决办法:通过一个shell脚本程序来实现,程序如下,用vi编辑器建立一个firstshell文件,内容如下:

#!/bin/bash //指明该程序被那个shell来执行!

cd /home/shelldir //进入home/shelldir目录

mkdir newdir //在shelldir目录下新建newdir目录

i=0 //给变量i赋初值

while [ $i –lt 50 ]; do //循环,判断i是否小于50,成立继续循环

let i=i+1 //让i变量值增加1

mkdir /home/shelldir/newdir/student$i //在newdir目录下创建student1到student50

chmod 754 /home/shelldir/newdir/student$i

done

保存文件,退出vi,通过执行#chmod a+x firstshell修改文件权限,赋予文件可执行权限,通过#./firstshell或者#/bin/bash firstshell来执行程序,查看程序运行结果。

程序说明:

1.程序必须以下面的行开始(必须方在文件的第一行):

#!/bin/bash

符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/bash来执行程序。

2.当编辑好脚本时,如果要执行该脚本,还必须使其可执行。要使脚本可执行,必须为脚本添加可执行权限。

#chmod a+x filename

3.输入:# ./filename 来执行脚本程序。

如同其他语言一样,通过我们使用任意一种文字编辑器,比如nedit、kedit、emacs、vi等来编写我们的shell程序。Linux中有好多中不同的shell,通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且很容易使用。这些脚本同样可以在其他bash中使用。

注:1.可以通过#echo $SHELL查看当前系统所运行的shell类型;

2.可以通过#cat /etc/shells查看系统上所有的shell。

3.可以直接通过输入shell名来运行新的shell。比如#ash,启动ash。

二.为什么要进行shell编程

在Linux系统中,虽然有各种各样的图形化接口工具,但是shell 仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。可以通过使用shell使大量的任务自动化,

shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。

三.shell程序组成

Shell程序有注释,shell命令,变量,表达式,流程控制等组成。

1.shell程序注释

在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。初学者要养成在程序中使用注释的习惯。如果使用了注释,那么即使相当长的时间内没有使用该脚本,也能在很短的时间内明白该脚本的作用及工作原理。这种习惯对一个优秀的技术人员来说非常重要2.命令

a.linux下常用的各类命令,比如ls,cd,mkdir,pwd,rm,rmdir 等等。

b.shell中的算术运算。如 let i=i+1

3.变量

在其他编程语言中可以使用变量。在shell编程中,也有各种变量,特别是在C语言中,变量使用之前一定要先定义,然后再使用;shell程序中也可以使用各种变量,shell编程中所有的变量都由字

符串组成,并且shell程序中的变量不需要提前进行声明定义,可以直接使用。如程序中所示:

i=0 //变量名=值

取出变量值可以加一个美元符号($)在变量前面:$i

Shell脚本中除了用户自己定义的变量仅在程序内有效,还有系统定义的变量,比如环境变量。由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,环境变量至关重要,在后面章节中会详细介绍。

4..shell脚本程序中的表达式

表达式是shell脚本中必不可少,如实例程序中的数学表达式

let i=i+1

shell程序中的数学表达式需要一些程序来完成,如let,expr等。Shell中还有其他的表达式比如关系表达式等如两数比较的

$i –lt 50

5.shell中的流程控制语句

课堂训练1:请大家自己编写一个shell脚本程序,来清除在前面实例中新建的所有student目录。

复习总结:

1.shell程序功能。

2.shell程序设计执行方法。

问题:如何修改配置,使得系统部出现乱码?

四.Shell程序中的变量

在Shell中有三种变量:系统变量,环境变量,用户变量。其中用户变量在编程过程中使用最多,系统变量在对参数判断和命令返回值判断会使用,环境变量主要是在程序运行的时候需要设置。如实例1中的i变量为用户变量。

1. Shell用户变量

用户变量是最常用到的变量,使用也十分简单。用户定义的变量必须由字母数字及下划线组成,并且变量名的第一个字符不能为数字, 与其它UNIX名字一样,变量名是大小写敏感的.对于用户变量,用户变量使用时不需要提前定义,可以直接赋值使用,在引用变量时,需在前面加$符号,用户也可以在变量间进行相互赋值。例如程序实例1中的i=0。需要注意一点:变量和'='之间不要有空格,'='和赋值也不要有空格,否则shell不会认为变量被定义。对于未赋值的变量, Shell以空值对待。

2. shell 环境变量

Linux是一个多用户的操作系统。每个用户登录系统后,都会有一个专用的运行环境。通常每个用户默认的环境都是相同的,这个默认环境实际上就是一组环境变量的定义。用户可以对自己的运行环境进行定制,其方法就是修改相应的系统环境变量。用set命令可以查看当前环境下所有的环境变量的值。常见环境变量的含义如下:PATH 命令搜索路径,以冒号为分隔符

HOME 用户home目录的路径名

COLUMNS 定义了命令编辑模式下可使用命令行的长度

HISTFILE 命令历史文件

HISTSIZE 命令历史文件中最多可包含的命令条

HISTFILESIZE 命令历史文件中包含的最大行数

SHELL SHELL的路径名

TERM 终端类型

PS1 主命令提示符

LD_LIBRARY_PATH 寻找库的路径,以冒号分隔

a.环境变量的临时查看和修改方法

通过#set查看所有环境变量,通过#echo $PATH可以查看某个环境变量的值,通过#export LC_ALL=POSIX来修改环境变量的值。

实例:

#export PS1=[tjqding@https://www.wendangku.net/doc/4d8170317.html,]#

//将shell操作提示符修改为[tjqding@https://www.wendangku.net/doc/4d8170317.html,]#

#export PATH=$PATH:/home/shellscrip

//将/home/shellscrip目录添加到搜索路径环境变量中去,这样可以在任何地方都不需要输入/home/shellscrip目录名,直接给出可执行文件名,就可以执行程序。

通过export修改环境变量,只是暂时有效,当系统重启或关闭终端,那么修改就会失去效用,如果想永久修改有效,必须修改环境变量文件。

b.环境变量的永久修改方法

通过修改环境变量文件来实现,环境变量文件一般在用户目录下,通过#ls –a可以显示,通过vi编辑器修改,保存。如解决linux 下乱码的问题,实际上就是在修改环境变量。

3.系统变量

Shell常用的系统变量并不多,但却十分有用,特别是在做一些参数检测的时候。下面是Shell常用的系统变量表示方法$1…$n $1 表示第一个参数,$2 表示第二个参数 ...

$# 命令行参数的个数

$0 当前程序的名称

$? 前一个命令或函数的返回码

$* 以"参数1 参数2 ... " 形式保存所有参数

$@ 以"参数1" "参数2" ... 形式保存所有参数

$$ 本程序的(进程ID号)PID

$! 上一个命令的PID

程序实例

#!/bin/bash

#This file is used to explain the shell system variable. echo "the number of parameter is $# "

echo "the script name is $0 "

echo "the parameters are $* "

echo "the parameters are $@ "

echo “the return code of last command is $?”

echo “the script shelleverment PID is $$”

echo $1

echo $2

echo $3

echo $4

echo "the return code of last command is $?"

总结:本节课的重点是环境变量的理解,环境变量是嵌入式系统开发中的重要概念,在嵌入式Linux 系统开发移植过程中,都要依赖环境变量。本节课主要任务如下:

1.掌握Linux系统中常见环境变量的功能以及修改方法。

2.掌握shell程序设计中系统变量的含义。

2.熟悉shell程序设计中算术运算实现的方法。四.Shell程序中算术运算实现

Shell程序中同样可以进行多种算术运算,加减乘除,取余等,Shell程序中完成算数运算有多种方法。常见的有三种方法,使用let 命令,expr工具,以及使用$符号。

1.使用let进行算术运算

let可以进行算术运算,主要有如下:

+ 两个整数相加

- 第一个数减去第二个数

* 两整数相乘

/ 第一个整数除以第二个整数

% 两整数相除,取余数

问题1:i=9,b=i+1,c=i+b d=c*5,编写shell程序计算i,b,c,d的值,并且显示。

a.第一种方法,直接在命令下依次输入如下命令:

#let i=9

#let b=i+1 c=i+b

#let d=c*5

#echo $i $b $c $d

#echo $i $b $c $d

缺点:因为变量都保存在缓存中,重启系统或者终端,就会丢失。

b.编写shell程序,程序如下:

#!/bin/bash

let i=9

let b=i+1 c=i+b

let d=c*5

echo $i $b $c $d

说明:保存退出,添加可执行权限,执行程序。

2.用$[ ]和$()来进行算术运算

#!/bin/bash

i=9

b=$[$i+1]或者b=$(($i+1))

c=$[$i+$b]或者c=$(($i+$b))

d=$[$c*$b]或者d=$(($b*$c))

echo $i $b $c $d

说明:在使用方括号和圆括号完成算术运算时,切记使用格式,在括号前面一定要使用$符号,才能完成运算。

3.expr

expr可以完成类似let的功能,进行算术运算,但是expr也可以对字符串进行操作,比如测试字符串的长度,查找字符串里特定的内容,取出字符串中满足要求的字串等。

问题:i=10,b=i+1,c=i+b d=c*5,编程计算i,b,c,d的值。

a.直接在命名行下输入如下命令:

#i=10

#a=`expr $i`+ 1`

#b=`expr $i + $a`

#c=`expr $a * $b`(该操作是错误的,无法完成运算)#c=`expr $a \* $b`

#echo $i $b $c $d

注意:(1)在以命令行方式进行运算时,为变量赋值时,有两个部分容易出错,=右方要用反引号引起来,反引号是键盘左上角esc键下方的按键。

(2)在用expr完成算数运算时,运算符前后必须有空格,否则不能完成运算。

(3)在用expr完成算数运算的时,乘法运算符号*必须

用反斜杠进行转义,否则*代表通配符,表示文件名,无法完成算术运算。

b.编写shell脚本程序

#!/bin/bash

i=10

a=`expr $i`+ 1`

b=`expr $i + $a`

c=`expr $a \* $b`

echo $i $a $b $c

c.expr的字符串操作功能(补充知识点自学)

expr除了完成算术运算功能外,更多的用在字符串操作上,比如求字符串长度,提取字符串字串,比较字符串是否匹配,抽取字符串中的某个字串,测试字符串是否匹配等。

操作实例:

# string="hello,everyone my name is xiaoming"

//给字符串变量赋值。

# expr length "string" (返回值是多少?)

#expr length “$string”(返回值是多少?)

//计算string字符串的长度

# expr index "$string" m

//计算字符m在字符串中开始的位置,返回值为数字。

# expr substr "$string" 10 5

//抽取字串,表示抽取从第10个开始的5个字符的字串。六.Shell中的比较运算的实现

Shell中实现条件判断,有各种比较运算符,比如数字比较运算符,字符串比较,文件比较判断运算符等。

1.数字比较运算

可以将实例1的程序修改为如下:

#!/bin/bash //指明该程序被那个shell来执行!

cd /home/shelldir //进入home/shelldir目录

mkdir newdir //在shelldir目录下新建newdir目录

i=0 //给变量i赋初值

while test $i –lt 50 ; do

//循环,判断i是否小于50,成立继续循环

let i=i+1 //让i变量值增加1

mkdir /home/shelldir/newdir/student$i //在newdir目录下创建student1到student50

chmod 754 /home/shelldir/newdir/student$i

done

总结:shell中其他数据比较符号及其含义如下:

-eq 等于,如:if [ "$a" -eq "$b" ]

-ne 不等于,如:if [ "$a" -ne "$b" ]

-gt 大于,如:if [ "$a" -gt "$b" ]

-ge 大于等于,如:if [ "$a" -ge "$b" ]

-lt 小于,如:if [ "$a" -lt "$b" ]

-le 小于等于,如:if [ "$a" -le "$b" ]

< 小于(需要双括号),如:(("$a" < "$b"))

<= 小于等于(需要双括号),如:(("$a" <= "$b"))

> 大于(需要双括号),如:(("$a" > "$b"))

>= 大于等于(需要双括号),如:(("$a" >= "$b"))

2.字符串判断运算

Shell中有专门的用来测试字符串的运算符。可以用来测试字符串是否相等,字符串长度是否大于0,字符串的长度是否等于0的运算符。

常用的字符串操作符有:

= 比较两个字符串是否相同,同则为“是”

!= 比较两个字符串是否相同,不同则为“是”

-n 比较字符串长度是否大于零,如果大于零则为“是”

-z 比较字符串的穿度是否等于零,如果等于则为“是”

[“$name” = “wanglei”]

[-z “$name”]

3. 文件判断运算符

文件测试表达式通常是为了测试文件的信息,一般由脚本来决定文件是否应该备份、复制或删除。

-w file 用户可写为真

-x file 用户可执行为真

-f file 文件为正规文件为真

-d file 文件为目录为真

-c file 文件为字符特殊文件为真

-b file 文件为块特殊文件为真

-s file 文件大小非0时为真

-t file 当文件描述符(默认为1)指定的设备为终端时为真

使用实例:

[ -f "somefile" ] :判断somefile是否是一个文件

[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限。

五.shell脚本中流程控制语句

1.shell流程控制

shell常见的循环语句有for循环、while循环、until循环

(1)While循环

语法:while 表达式; do

循环体

done

只要while表达式成立,do和done之间的操作就一直会进行。(2)for 循环

语法:for 变量 in 列表

do

操作

done

注:变量是要在循环内部用来指代当前所指代的列表中的那个对象的。列表是在for 循环的内部要操作的对象,可以是字符串也可以是文件,如果是文件则为文件名。

(3)until循环

语法:until 表达式

do

操作

done

重复do和done之间的操作直到表达式成立为止。

程序实例

2.条件语句

Shell程序中的条件语句主要有if语句、case语句;

(1)if语句

语法:if表达式1 then

操作1

相关文档