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