视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
实验二:shell及shell编程
2025-09-27 23:26:50 责编:小OO
文档
实验二: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' ofile

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

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

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

方法

#sed '

/^$/d

/^[]*$/d

' ofile

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

也可写为:

sed '/^$/d;/^[]*$/d' ofile        或写为

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

sed '/^$/d;/^[[:space:]]*$/d' 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\\\Thist is Function 2 Demontration!"

    echo -e    "\\\1111111111111111111111111111111!"

}

func2( ){ 

    echo -e "\\n\\n\\\Thist is Function 2 Demontration!"

    echo -e "\\\2222222222222222222222222222222!"

}

while true

do

        clear

        echo -en "

\+-----------------------------------------------------+\\n\

\|                                                                |\\n\

\|      1.func1    2.func2    q.quit                          |\\n\

\|                                                                |\\n\

\+-----------------------------------------------------+\\n\

\\\Please 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\\\Press 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、实验报告的内容与书写

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

显示全文
专题