实验二 shell编程

实验2:Shell编程

一、实验目的

(1)了解Linux各shell环境,熟悉shell下可用资源。

(2) 掌握shell中的变量的使用方法

(3)掌握基本的shell编程语法,主要包括shell中的test、条件执行、循环控制语句。

二、实验要求

(1)按照实验内容独立编写shell程序,并在Linux环境下调试运行。

(2)提交实验报告。

三、实验原理和实验内容

(1)理解位于shell中的第一行 #!/bin/bash

当shell执行一个程序时,会要求UNIX内核启动一个新的进程,以便在该进程里执行指定的程序。内核知道如何为编译性程序(即课上所讲到的elf格式文件)做这样的事情,但是shell脚本并非编译型程序,当shell要求内核执行它时,内核将无法做这件事情,只能回应”not executable file”这样的错误信息,shell收到此错误信息时,就会知道这不是一个编译型程序,而是一个脚本,就会启动/bin/bash副本来解释并执行该脚本程序,这也就是为什么每个脚本程序第一行必须加#!/bin/bash的原因

(2)脚本程序的执行方式

当用vi编辑器或者cat等方式编辑好一个shell脚本后,用ls –l 命令查看该脚本文件的类型,可以发现其执行位为-,unix系统出于安全性的考虑,需要对编辑后的脚本程序授予执行权限后,方能执行,授予执行权限的方式是: chmod +x filename

(3) shell中变量的使用

在shell中,引用变量时,必须将$符号置于变量名之前,例如: echo $PATH

当向变量写入值时,则不需要$符号。

也就是说,我们可以引用变量的名称,也可以在需要变量的值的时候通过$符号引用变量的值,但是名称只会当做普通字符串,除非是在赋值语句中,例如

YOUR_NAME=steve

echo “the var YOUR_NAME is $YOUR_NAME”

(4)变量的赋值

Shell变量的赋值主要有三种方式,主要有

1. 显式定义 VAR=value

2. 读取: read VAR

3. 命令替换: VAR=`date`、VAR=$(date)

(4)条件执行

条件执行是指如果满足某些条件才执行代码,如果没有条件执行,则只能逐 条执行命令

复习课本中的test,以及测试的不同方式,如测试文件是否存在的标志用-e,以及测试文件是否可以读、写、执行的标志。

(5)使用循环进行流控制

重点复习shell中的for循环、while循环的语法,通过实际脚本理解它们在shell编程中的使用方法

循环的使用时机

在已知要对一个元素集合执行相同操作时,而不是重复执行某个操作直到满足某个条件时,使用for循环最合适.在没有需要遍历的列表但在具有决定循环何时结束的可测试条件时,使用while循环最合适

四、实验环境

人手一台装有ubuntu Linux操作系统的计算机。

五、实验步骤和方法

1、在Linux下使用vi编辑器将已经设计好的程序输入并保存在自己的目录下。

实验1 Shell环境下的交互式输入输出

1.在命令行中输入以下shell程序:

cat < first.sh

#!/bin/bash

echo –n “enter your name:”

read var

echo “hello , $var”

2、调试、运行程序,输出实验结果。

实验二 从文件读取

刚才的实验1是从终端上读取输入后赋值给变量(实际上,终端也是从文件读取,因为unix下一切皆为文件),编写下面的代码可以清晰的看到这一点:

1.在命令行中输入以下shell程序:

read message < /etc/motd

echo $message

2、输出实验结果。

实验三 条件执行

1.通过条件测试语句,测试unix中不同文件的类型

运行rwx.sh程序,分别测试/etc, /etc/hosts, /home的类型

2、输出实验结果。

实验四 数值测试

1.复习课本中的数值测试,有6种数值比较测试可供使用,numbergues.sh脚本是猜数字的游戏,阅读该脚本程序,理解后并执行,验证shell脚本中数值比较的条件测试。

2、输出实验结果。

实验五 向for提供数据

通过三个不同的例子(fruit-var.sh,fruit-read.sh, fruit-cmdline.sh)学习在shell中如何向for提供数据

实验六 while循环的使用方法

通过readfile.sh 学习在shell中如何读取文件

While循环一个常用的方法是逐行读取文本文件中的内容,整个whlie read/do/done命令被shell当成单条命令,与实验二中从文件读取文件的例子进行比较,理解$filename的重定向方式 与 read < $filename

六、实验预习要求

充分预习shell编程相关内容:

常用shell命令,shell编程语法。

七、实验报告要求

除按实验报告纸的内容进行填写外,主体部分包括以下内容:

(1)程序中用到哪些shell编程知识

(2)源代码

(3)程序运行结果及结果分析

(4)实验总结及体会

 

第二篇:4实验四_shell程序设计 2

实验四shell程序设计

一、 实验目的

1. 理解shell操作环境

2. 掌握shell程序编写方法

二、 实验内容

1. 练习、理解下面命令

alias

alias ld=’ls -ld .’

history 20

!!

var1=”abcd1234”

echo ${var1:3:4}

echo $HOME

var2=$HOME

echo ”我的主目录是$var2”

set -x

ls *sh

arr1=(long live chair mao)

echo ${arr1[1]}

arr2=(`date`)

echo ${arr2[3]}

test $? -eq 0 || echo ”上面命令执行失败。”

{ date;pwd;tty;stty; }

2. 编写shell程序

1) 文件名webs.sh,在120.95.134.104主机建立个人主页空间;(提示:

按照命令行操作命令和顺序编辑程序文件)

#! /bin/bash

# webs.sh

cd $HOME

mkdir public html

chmod o=rx

exit 0

2) 文件名adds.sh,实现多个数值相加;(提示:多个数值通过参数提供) #! /bin/bash

# adds.sh

s=0

for I in $*

do

((s=s+i))

done

echo $s

exit 0

3) 文件名cleardirs.sh,删除指定目录下的文件和子目录;

#! /bin/bash

# cleardirs.sh

cd $1

x=’ls’

for y in $x

if [-d $y]

then rm –fR $y

else rm –f $y

fi

done

exit 0

4) 文件名clearfile.sh,删除指定目录下的文件及其子目录下的文件;(提

示: 使用find命令查找目录下文件)

#! /bin/bash

# clearfile.sh

x=’find $1’

for y in $x

do

[-d $y]||{

rm –f $y

}

done

exit 0

5) 文件名feb.sh,显示费波纳奇数列 1 1 2 3 5 8 13 21 ... #! /bin/bash

# feb.sh

a=1

b=1

echo –n $a $b

for((n=20;n>0;n--))

do

echo –n “$((a+b))”

c=0

c=$((a+b))

done

exit 0

阅读理解程序

120.95.134.104主机,/var/xg11x/adduser.sh

#! /bin/bash

cat xg11.text|while read x

do

u=($x)

adduser ${u[0]}

echo ${u[0]} | passwd ${u[0]}

--stdin > /dev/null

done 3.

exit 0

三、 撰写实验报告

这次的实验内容比较多,在做实验的时候有很多不懂的地方。

对于第一个部分,首先比较不理解的就是echo ${var1:3:4}命令,仔细查阅书上,但是也没有发现这个解释,问过老师以后才知道原来的显示var1数组中从第三个字符开始截取四个字符。

然后就是set -x命令,才明白原来是设置解释的开关。

然后就是关于花括号{}的使用,由于当时没有及时复习,所以对各种括号的使用不是很理解,在做练习的时候没有在“{”后面打上空格,做了好几遍都显示不正确,最后试了试了加了空格才做出来,但是当时还是不是很理解,后来看书的时候才真正明白了花括号和圆括号的区别和具体用法了。

在做的命令的时候,我会试着把命令以不同的形式输进去,然后再看输出有什么不同,就比如说echo ${arr1[1]}命令,当时我觉得花括号的使用时没有必要的,所以当时我就把花括号给去掉了,但是发现输出结果不一样,去掉花括号后输出的结果是long[1],即它只是把arr1给当成命令解释了,也就是吧arr1和[1]分成了两个部分来执行了,这时才知道花括号的重要性。

在编写shell程序的时候,觉得非常的迷茫,完全不知道从哪里下手,尤其是第一个程序编写,也就是建立个人主页空间,当时知道老师有讲过这个问题,在课堂上也给我们演示过,但是由于当时没有认真听,而且也没有做笔记,所以下课后就又给忘记了,没有办法,只好请教老师再给讲解一下,幸好老师的的精心讲解,对这个问题比较清楚了。

对于后面的几个程序编写,由于当时没有时间写,所以打算下课后写,但是由于懒惰,在我还没自己写了时候老师就对这些题进行了讲解,所以在做后面这几道题的时候我就是先阅读理解了一些老师的代码,然后敲进电脑里面进行试验,但是当时不知道为什么,也不知道把什么给删了,我再登陆的时候就跟以前的登陆画面不一样了,幸好课堂上老师有专门讲解这个问题,我就讲老师目录下的文件复制到我的目录下面,然后就成功了。

整体上来看,我对于Linux命令的掌握还是很不熟悉,尤其是命令的编写,感觉很迷茫,这跟我没有及时深入的复习有很多的关系,这次给了我一个很大的教训,以后一定要及时看书。

相关推荐