内容发布更新时间 : 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语句中的条件。理解如下:
此文件时的输入串为准)