实验9:shell及shell编程

实验9:shell及shell编程

1、实验目的

1)sed的使用;

2)awk的应用;

3)shell及shell编程;

4) 与用户启动相关的文件及使用。

2、实现设备

一台装有Windows操作系统和Linux机系统的微机或服务器。

3、实验方法与注意事项

1)由于是以root用户工作的,权力很大,请不要在系统内做对系统或对其他用户不安全的事情。

2)要求每个同学登录后系统后,要在自己的家目录内容以自己(汉语拼音)名字,使用mkdir命令创建一个子目录。以后所有工作都要在自己的目录内进行。

3)认真编写实验报告

4、实验过程

1) sed命令的使用:

(1) 将ifile文件中的所有sysman替换成System Manager并输出到ofile sed -e 's/sysman/System Manager/g' <ifile >ofile

(2) 显示ifile文件中的所有注释行

#sed -e '/^#/!d' < ifile #参见不执行某命令!function

(3) 删除文件ifile中的空行,并将其它的内容输出到ofile:

方法①

#sed '

/^$/d

/^[<tab><Space>]*$/d

' <ifile >ofile

#注:tab为tab键,<tab>可用\t表示,<space>为空格键。

②也可写为:

sed '/^$/d;/^[<tab><Space>]*$/d' <ifile >ofile 或写为

sed '/^$/d;/^[[:blank:]]*$/d' <ifile >ofile 或写为

sed '/^$/d;/^[[:space:]]*$/d' <ifile >ofile

③如果脚本命令较多,也可将整个脚本内容写入文件(比如e_script)中,此时命令的执行可如下进行:

sed –f e_script < ifile > ofile

2) awk命令的使用

(1) 显示系统内root的进程,它们是什么,进程号是多少

ps -ef | awk '/root/{ print $1, $2, $8 }'

(2) 显示系统所非root用户在干什么,他们是谁?

ps -ef | awk '!/root/{ print $1, $8 }'

(3) 使用awk计算文件infile内数字的和。

awk '{ sum += $1 }; END { print sum }' ifile

注:假设infile内容为数字串,且每个数字串占一行。

(4) 显示系统内已经注册(创建)的所有用户(显示/etc/passwd内的所有用户) awk -F: '{ print $1 }' /etc/passwd #-F:指定域分隔符为“:”

3)shell编程

(1) 设计一个程序,带一个(目录)参数。实现功能:(1)首先判断是否带有参数,若无则显示用法信息后,报错返回;(2)带首先判断该参数是不是目录。若是则列目录的内容,否则,提示用户不是目录,则显示警告信息后报错返回。

#!/bin/sh

if [ $# -ne 1 ] #check if have 1 parameter

then

echo "Usage: $0 dir" #Diaplay Usage

exit 1 #return 1

fi

if [ -d "$1" ] #if is a dir;then

ls $1/*; exit 0 #list the dir,and return 0

fi

echo "Warn: $1 is not a directory" #Warning message

exit 2 #return 2

注:输入时可不输入注释部分。设此程序名为myls,为其增加执行权后,运行方法为: ./myls #返回码为1

./myls dir #如果dir是个目录,则列其内容

./myls file #若file是文件或不存在则给出警告后返回2

(2) 用嵌套式if-fi语句实现(1):

#!/bin/sh

if [ $# -ne 1 ] #check if have 1 parameter

then

echo "Usage: $0 dir" #Diaplay Usage

exit 1 #return 1

elif [ -d "$1" ] #if is a dir

then

ls $1/*; exit 0 #list the dir,and return 0

else

echo "Warn: $1 is not a directory" #Warning message

exit 2 #return 2

fi

(3) 设计一个程序,从命令行接收数值参数,并计算这些参数的和。

x=0

for y in $*

do

x=`expr $x + $y`

done

echo "The Sum is: $x"

注:设程序名为myadd,增加执行权后,运行方法为:myadd 20 35 100 60 但是,本程序是有问题的,原因是它没有判断输入数据的合法性。下面是一个增加输入数据合法性检查的程序。

x=0

for y in $*

do

z=`echo $y | awk '/^[[:digit:]]*$/ { print $0 }'`

if [ -z $z ]; then

echo -e "Invalid command line parameter: $y\a"; exit 1 fi

x=`expr $x + $y`

done

echo "The Sum is: $x"

(4) 设计一个程序,计算前n个正整数的和:

x=0; y=1

while true

do

x=`expr $x + $y`

y=`expr $y + 1`

if [ $y -gt $1 ]; then break; fi

done

echo "1+2+..+$1=$x"

注:此程序要带有1个参数作为整数n,以计算前n个正整数的和。设程序名为myadd1,则运行方法是:myadd1 10或myadd1 100等。

(5)here文档

#!/bin/sh

cmd="uname -s"; name=`whoami`

cat << !

My name is $name, I am a student.

I study computer, and now I have an exam of `$cmd` OS.

!

4) 与用户登录相关文件

.bash_history #历史文件

.bash_logout #用户注销时要执行的文件

.bash_profile #用户登录时要执行的文件

.bashrc #用户登录时要执行的文件,由.bash_profile调用 /etc/bashrc #用户登录时要执行的文件,由.bashrc调用

/etc/profile #用户登录时要执行的文件,由/etc/bashrc调用 /etc/profile.d/* #用户登录时要执行的文件,由/etc/profile调用 用户可以根据需要修改,它们的内容。

以下为一个菜单程序(可取名为sh_add),可将它加在用户.bash_profile的最后,当用户登录时,若成功则直接执行此程序而进入菜单控制,当用户退出菜单时直接注销自己,回到login登录界面。

trap '' 1 2 3 15 #trap the signal 1,2,3,15

func1( ){

echo -e "\n\n\t\t\tThist is Function 2 Demontration!"

echo -e "\t\t\t11xxxxxxxxxxxx11xxxxxxxxxxxx1!"

}

func2( ){

echo -e "\n\n\t\t\tThist is Function 2 Demontration!"

echo -e "\t\t\t2222222222222222222222222222222!"

}

while true

do

clear

echo -en "

\t+-----------------------------------------------------+\n\ \t| |\n\ \t| 1.func1 2.func2 q.quit |\n\ \t| |\n\ \t+-----------------------------------------------------+\n\ \t\t\tPlease get Select 1,2 or q:"

read x

case $x in

1)

func1;;

2)

func2;;

s|S)

trap 1 2 3 15

break;;

Q|q)

exit 0;;

*)

echo -e "\a";;

esac

echo -en "\n\t\t\tPress Enter Key to Contiune:"

read x; clear

done

注意:应$HOME/.bash_profile的最后加入一行:

. sh_add

让该程序在当前shell内运行。

当此文件放在$HOME/.bash_profile内后,X-Windows将无法正常启动。注释掉此命令所在行后可恢复X-Windows正常启动。也可以通过在以上代码中的while true加入根据终端号进行判断办法来实现:具体做是当用户在/dev/tty1~/dev/tty12是使用本程序时执行while true语句段,否则跳过while true;do … done语句段,什么都不做。(由用户自己完成)

当然,用户也可以修改$HMOE/.bash_profile干别的事情,比如设置环境变量等。此方法在用户登录控制设置时是非常有用的。

请实验者关注程序中两个trap语句的作用。S|s的功能是什么?

4、实验报告的内容与书写

以书面形式记录下你的每一步过程,包括输入、输出信息,遇到的问题和解决的办法。

 

第二篇:shell编程

实验X shell编程(1)

一、实验目的

1、了解shell的概念、shell程序的作用

2、了解shell变量的种类及其使用

3、理解和掌握条件测试的原理和方法

4、掌握用vi、gedit等编辑器创建shell脚本的方法

5、掌握shell脚本的执行方法

二、预备知识

1、Linux系统的Shell

从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用。深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修功课之一。使用Linux系统时,用户多数时间是通过Shell与系统进行对话的,它是用户与Linux系统之间的界面之一。

Linux系统中可以使用的Shell包括:

1) bash:Bourne Again Shell。这是Linux系统上最常用的Shell,它合乎POSIX标准

且相容于Bourne Shell,提供了编辑命令行的功能。

2) csh:C Shell。由Berkeley (伯克利大学) 开发,与Bourne Shell在交互式使用上很

多是相兼容的,但在程序设计界面上却有很大的不同。它不提供编辑命令行的功能,但它有类似的功能叫命令历史记录

3) ksh:Korn Shell。在UNIX系统下得到普遍使用,并最早将现代Shell技术 (包括

取自C Shell的部分) 引入Bourne Shell,提供了编辑命令行功能

4) sh:Bourne Shell。是原始的Shell,不提供编辑命令行功能

5) tcsh:C Shell的加强版,提供了编辑命令行的功能

6) zsh:Z Shell。最新的Shell,与Bourne Shell兼容,提供编辑命令行的功能。 一般默认的shell是bash Shell。

三、实验内容

1.Shell变量的定义及其使用。

2.位置参数和环境变量。

3.Shell中的特殊字符。

四、实验步骤

(一)Shell变量

Shell有三种变量:内部变量、环境变量和临时变量。在Shell脚本中临时变量又分为两类:用户定义的变量和位置参数。

1、常用的内部变量。返回值为0代表为真,非0值均为假。

1) # :传给shell程序位置参数的个数

2) ?:存储上一个执行命令的返回值

3) 0: 存储shell程序的名称

4) *: 存储shell程序的所有参数

例如:

1) echo "Number of parameters is:"$#

2) echo "Program name is:"$0

3) echo "Parameters as a single string is:"$*

2、常用的环境变量:

1) HOME: 用户的主目录

2) PATH: 执行命令时所搜索的路径

3) PS1: shell命令行的一级提示符

4) PS2: shell命令行的二级提示符

用 printenv 命令查看当前起作用的环境变量列表,如:

$printenv

列出的环境变量中最重要的是$PATH,它指定了查找可执行程序的路径顺序。例如,如果运行ifconfig检查某个连接状态,而提示命令没找到,其原因是shell的环境变量里没有设置这条路径名。解决办法是:

$whereis ifconfig

$/sbin/ifconfig

在命令行中使用export命令把/sbin目录加到$PATH变量中:

$PATH=$PATH:/sbin;export PATH

$ifconfig

但这是暂时的,仅维持本次登陆执行了export有效。要长期有效必须修改/etc/profile或

主目录下.bash_profile文件中的环境变量。

3、用户定义的变量

用户定义的变量是最普遍的Shell变量,变量名是以字母或下化线打头的字母、数字和下线字符序列,并且大小写字母意义不同。变量名的长度不受限制。定义变量并赋值的一般形式是: 变量名=字符串

例如, myfile=/usr/meng/ff/m1.c

在程序中使用变量的值时,要在变量名前面加上一个符号“$”。这个符号告诉Shell要读取该变量的值。

4、位置参数

执行Shell脚本时可以使用参数。由出现命令行上的位置确定的参数称做位置参数。在sh中总共有十个位置参数,其对应的名称依次是$0,$1,$2,...$9。其中$0始终表示命令名或Shell脚本名,对于一个命令行,必然有命令名,也就必定有$0;而其它位置参数依据实际需求,可有可无。

(二) SHELL中的特殊字符

1、通配符

通常的通配符有三种:

1) * 星号,它匹配任意字符的.)和

路径名中的斜线(/)必须显示匹配。

2) ?问号,它匹配任意一个字符。

3) [] 一对方括号,其中有一个字符组。其作用是匹配该字符组所限定的任意一个字

符。

4) 应该注意:字符 * 和 ?在一对方括号外面是通配符,若出现在其内部,它们就失

去通配符的能力了。

5) !叹号,若它紧跟在一对方括号的左方括号[之后,则表示不在一对方括号中所列

出的字符。

2、引号

在SHELL中引号分为三种:单引号、双引号、和倒引号。

1) 双引号

由双引号括起来的字符,除$、倒引号和反斜线(\)仍保留其功能外,其余字符通常作为普通字符对待。

2) 单引号

由单引号括起来的字符都作为普通字符出现。

3) 倒引号

例如:

$ today=`date`

$echo Today is $ today

Today is Thu May 04 10 :56 :20 CST 2014

4) 反斜线

转义字符,若想在字符串中使用反斜线本身,则必须采用(\\)的形式,其中第一个反斜线作为转义字符,而把第二个反斜线变为普通字符。

(三)条件测试

1、字符串比较

1) = 比较两个字符串是否相等

2) != 比较两个字符串是否不相等

3) -n 判断字符长度是否大于零

4) -z 判断字符长度是否等于零

2、数字比较

1) -eq 比较两个数是否相等

2) -ge 比较一个数是否大于或是等于另一个数

3) -le 比较一个数是否大于或是等于另一个数

4) -ne 比较两个数是否不等

5) -gt 比较一个数是否大于另一个数

6) -lt 比较一个数是否小于另一个数

3、文件操作符

1) -d 确定文件是否为目录

2) -f 确定文件是否为普通文件

3) -r 确定是否对文件设置了读许可

4) -s 确定文件名是否具有大于零的长度

5) -w 确定文件是否设置了写许可

6) -x 确定文件是否设置了执行许可

测试语句:

有两种常用形式:一种是用test命令,如上所示。另一种是用一对方括号将测试条件括起来。两种形式完全等价。例如,测试位置参数$1是否是已存在的普通文件,可写成:test -f " $1",也完全可写成:[ -f $ l ]

在格式上应注意,如果在test语句中使用shell变量,为表示完整、避免造成歧异起见最好用双引号将变量括起来。利用一对方括号表示条件测试时,在左方括号[之后、右方括号]之前各应有空格。

(四)创建简单shell程序

1、进入vi或gedit编辑器

2、编写程序

例:

#!/bin/bash

hello()

{

echo "hello there today's date is:`date`"

}

echo "now going to the function hello"

hello

echo "back from the function"

#end

(五)执行shell程序的方法

方法一 : 加执行权后,程序完整路径引导。 ($chmod u+x filename)

方法二 : shell解释器名称引导。

方法三: 点空格引导。

方法四 : 使用命令替换。

五、实验报告要求

1、整理实验结果,使其分别与相应的命令对应

2、记录程序设计的流程

3、根据实验步骤,写出实验报告

实验x shell编程(2)

一、实验目的

1、掌握if、case等条件语句的使用

2、掌握for、while、until等循环语句的使用方法

3、理解和掌握shift及其它语句的使用方法

二、实验准备

1、硬件:笔记本电脑或台式机电脑;

2、软件:Linux 红帽、ubuntu、麒麟等操作系统。

三、相关知识

1. if 语句

if语句通过判断逻辑表达式来作出选择,在bash中的条件语句有如下的格式: if [ expression ]; then

statements

elif [ expression ]; then

statements

else

statements

fi

if条件语句是可以嵌套的。

2. case语句

case语句是用来执行依赖于离散值或是匹配指定变量值的范围的语句。格式如下: case str in

str1)

statements

……

statements;;

str2)

statements

……

statements;;

str3)

statements

……

statements;;

str4)

statements

……

statements;;

*)

Statements

……

statements;;

esac

3.for语句

for var in {list}

do

statements

done

对list中的每个值需要执行一次statements时应利用这种格式。对每次循环,把list中的当前值赋给变量var。List可以使含有几个项的变量,或是用空格分隔的值表。

4. while语句

在pdksh和bash 中,利用的如下的格式:

while expression

do

statements

done

5.简单程序

1)if语句例子程序

#!/bin/bash

# 提示用户输入份数(0~100)

echo “please input a integer”

read score

# 判断学生的分数类别

if [“$score” –lt 0 –o –gt 100]

then

echo “the score what you input is not integer or the score is not ”

elif [“$score” -ge 90]

then

echo “the grade is A!”

elif [“$score” –ge 80]

then

echo “the grade is B!”

elif [“$score” –ge 70]

then

echo “the grade is C!”

elif [“$score” –ge 60]

then

echo “the grade is D!”

else

echo “the grade is E!”

fi

四、实验内容及步骤

1. 求前五个偶数的和

参考程序:

#!/bin/bash

loopcount=0

result=0

while [ $loopcount –lt 5 ]

do

loopcount=?expr $loopcount +1?

increment=?expr $loopcount \*2?

result= ?$result + $increment?

done

echo "result is $result“

2.设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30。

参考程序:

#!/bin/sh

i=1

groupadd class1

while [ $i -le 30 ]

do

if [ $i -le 9 ] ;then

username=stu0${i}

else

username=stu${i}

fi

useradd $username

mkdir /home/$username

chown -r $username /home/$username

chgrp -r class1 /home/$username

i=$(($i+1))

done

3.编写shell程序,实现自动删除50个账号的功能。账号名为stud1至stud50。 参考程序:

#!/bin/sh

i=1

while [ $i -le 50 ]

do

userdel -r stud${i}

i=$(($i+1 ))

done

五、实验报告要求

1.记录实验中遇到的问题

2.提出程序的改进方法

3.根据实验步骤,写出实验报告

相关推荐