shell脚本练习题 下载本文

内容发布更新时间 : 2024/12/24 0:29:17星期一 下面是文章的全部内容请认真阅读。

h) 显示root正在运行的所有进程。 i) 显示变量TERM、PATH和HOME的值。 j) 显示磁盘使用情况。 k) 用id命令打印出您的组ID。 m) 跟用户说“Good bye”

#!/bin/bash

# 09嵌入 5号 贾德进 myfirstshell.sh shell的简单编程 user=`whoami` case $user in root)

echo \teacher)

echo \*)

echo \esac

echo \日期和时间: `date`\echo \本月的日历: `cal`\

echo \本机的机器名:`uname -n`\

echo \当前这个操作系统的名称和版本:`uname -s;uname -r`\echo \父目录中的所有文件的列表:`ls ../`\echo \正在运行的所有进程:` ps -u root`\echo \变数TERM的值:$TERM\echo \变数PATH的值:$PATH\echo \变数HOME的值:$HOME\echo \磁盘的使用情况:`df`\

echo \用id命令打印出你的组ID:`id -g`\echo \

4、(基训十三) 设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限为 rwxr-xr—

#!/bin/bash cd /userdata

I=1

while [ $I -le 50 ] do

mkdir -p userdata/user$I chmod o-x user$I I=$((I+1)) done

5、(基训十四) 编写shell程序,实现自动删除50个用户账号的功能。账号名为stud1至stud50。

#!/bin/bash cd /userdata I=1

while [ $I -le 50 ] do

mkdir -p userdata/user$I chmod o-x user$I I=$((I+1)) done

6、(基训十四) 设计一个shell程序,备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd为日。

#!/bin/bash

DIRNAME=`ls |root|grep bak ` if [-z $DIRNAME ]; then mkdir /root/bak cd /root/bak fi

YY=`date + %y` MM=`date + %m`

DD=`date + %d`tar czvf ${YY}${MM}${DD}_etc.gz /etc echo \

7、(基训十四) 某系统管理员需每天做一定的重复工作,请按照下列要求,编制一个解决方案:

(1)在下午4 :50删除/abc目录下的全部子目录和全部文件;

(2)下午5:50将/data目录下的所有目录和文件归档并压缩为文件:backup.tar.gz;

(3)在下午5:55将IDE接口的第二个逻辑分区卸载。

// 采用: vi pram.cron

#(1) 在下午4:50删除/abc目录下的全部子目录和全部文件; 50 16 *** rm -rf /abc/*

#(2) 下午5:50将/data目录下的所有目录和文件归档并压缩为文件:backup.tar.gz;

50 17 *** tar czvf back.tar.gz /data

#(3) 在下午5:55将IDE接口的第二个逻辑分区卸载. 55 17 *** umount /dev/hda6

// 执行:crontab pram.cron

==========================================================

设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行。

程序实现及注释如下:

#! /bin/bash #adddir.sh i=1

#while循环 while [ $i -le 50 ] do

#利用 test命令 [ -d /userdata ]:判断/userdata是否存在,如果存在直接创建子目录,不#存在先创建/userdata再创建子目录。

if [ -d /userdata ] then

#mkdir -p的意思是:无论父目录/userdata存在与否,都会创建/userdata/user$i mkdir -p /userdata/user$i else

mkdir /userdata

mkdir -p /userdata/user$i fi

#根据题目的意思:/userdata/user$i应该是具有754权限,所以利用chmod赋权限。

chmod 754 /userdata/user$i i=$(($i+1)) done

函数in_path:判断传入文件是否可执行,若可执行(且存在)返回0, 否则返回1;

分析:为测试传入文件是否在PATH所有的目录中,需取得PATH中的每个路径,可用循环,但需要设定环境中的分隔符(借助环境变量IFS)为 PATH中的分隔符冒号”:”

注:$IFS 输入分隔符. 当shell读取输入数据的时候,会把一组字符看做是单词之间的分隔字符,它们通常

是空格,制表符,和换行符.

函数调用方式为 : in_path filename

in_path() {

cmd=$1 retval=1

# $1为函数的参数1,以此类推

#定义返回值变量

#设置新的IFS,并保存原来的以恢复使用

oldIFS=$IFS IFS=:

for directory in $PATH #for循环结构二: for – in do }

注:1.函数的结构, 没有形参

2.变量的引用需要符号$,而变量的定义或赋值则不需要。 3.赋值要无间隙, 条件要间隙

改进: 1.将路径、分隔符均作为函数的参数传入,应用得到扩展。

if [ -x directory/$cmd ] ; then #if条件语句之 同行表示 以分号隔开

retval=0 # -x 判断文件有是否有可执行权限

done

done

IFS=$oldIFS return retval

#恢复原来IFS,

补充,in_path函数不能对绝对路径的文件处理,需写个函数对这一情况单独处理 checkForCmdInPath() {

var=$1

#首先判断传入的非空串是否为绝对路径,即检测第一个字符是不是‖/‖,如果是,直接测 –x if [ $var != ―‖ ] ; then # 条件等价于 -n $var }

注:此函数让人一头雾水,详解如下:

fi

if [ ―${var%${var#?}}‖ = ?/‘ ] ; then #等价于 $(echo $var | cut -c1)

if [ ! -x $var ] ; then

return 1 #not found or not executable

fi

elif ! inpath $var ; then fi

return 2 #not found in PATH

1) 表达式${var%${var#?}}作匹配用,分解为 ${var%expr} ${var#expr} ,expr为正则表达

式(? 匹配单一字符)

后者(带#的)返回 expr与var匹配成功位置之后的所有内容,此处为var中第一字符之后的所有。

前者(带%的)返回 expr与var匹配成功位置之前的所有内容,此处应为 var的第一个字符。 等价于 $(echo $var | cut c1) 即取第一字符。

等价于 ${var:beginpos:size} 中beginpos=0,size=1时的结果。

var的符号放在外面了,假设$var为$1,则表达式表示为 ${1%${1#?}}

shell中的if条件可以是 表达式(需加方括号[]),另外还可以是命令或函数(不需方括号), 当命令执行成功时会后继执行具体操作,经测试,C语言中所说的true在shell中 用0表示,即if 0,才执行then,因为linux下的程序实现都是当返回0时表执行成功。 3) 若函数中没有返回值,则它默认返回0,表执行成功。

函数的编写若遵从以上的原则, 则对条件的理解 依旧像C语言中的TRUE,FALSE一样理解

============== 完善程序代码 ===================================== #!/bin/bash in_path()

... # 函数实现区域 处理不路径 返回0表找到、可执行, 否则返回1

###############################

checkForCmdInPath()

... # 函数实现区域 处理带路径和不带路径的 返回1表没找到或不可执行,返回2表没找到。默认0表找到

################################ ##### 代码执行起始位置 ############## if [ $# -nq 1 ] ; then fi

# 调用函数,并经第一个参数传给函数 checkForCmdInpath $1

# 对函数返回的结果进行判断 $? 为函数的返回值,

case $? in # case 控制结构的格式,注意红色部分。

0) echo ―found in PATH‖

;;

1) echo ―not found or not executable‖ ;; 2) echo ―not found‖

;; # *) ;; 类似于C语言中的

echo ―Usage: $0 command‖ #$0 表此执行文件 (具体内容 以 执行exit 0

2) 关于if的条件判断与C语言中的理解不一致,反映在上述的 elif语句中的条件。理解如下:

此文件时的输入串为准)