文档库 最新最全的文档下载
当前位置:文档库 › linux shell脚本编程练习作业及答案(全)

linux shell脚本编程练习作业及答案(全)

本人乃一介草民,刚学shell编程不久,一日见有人发题求助,所以自己也当作练习来练练手,写的不好请勿吐槽,可与本人交流,一起学习!!


(1)创建用户
批量创建1000个用户
用户名为:班级+学号+昵称;每个班为一个组群
能够自动删除所创建的用户
每成功创建或删除一个用户,在屏幕上显示用户名

(题目中这用户,也太tm多了点,没有达到题目的全部要求,还是水平有限啊!!)
#!/bin/bash
#this is programe to build users batch

echo "how many users you want to add"
read -p "input the numbers of users: " num
count=1

while [ $count -le $num ]
do
useradd -G class1 std$count
echo "user std$count del successfully"
count=$(($count + 1))
done


read -p "what do you want to do: " do
let count=count-1
case $do in
d)
for(( count; count >= 1;count-- ))
do
userdel -r std$count
echo "user std$count del successfully"
done
;;
*) exit;;
esac


##################################################
(2)创建目录和文件,
目录名为:dir1, dir2, …, dir10
每个目录下分别新建10个文本文件,文件名为:目录名+file1~10
并设置每个文件的权限:
文件所有者:读+写+执行
同组用户:读+执行
其他用户:读+执行
等待键盘输入一个数字,范围为1~10
重命名该级目录(假设输入数字为“5”,则为“dir5”目录)下所有文件的扩展名为bak,并将该目录下所有文件名保存到一个文本文件
删除包含该数字的所有目录和文件

#!/bin/bash
#test 2


for((i=1;i<=10;i++))
do
mkdir /root/tmp/dir$i
cd /root/tmp/dir$i
chmod 755 -R . #这有个(.)代表当前文件夹
a=1
while [ $a -le 10 ]
do
touch dir${i}file$a
let a=a+1
done
done

read -p "which directory you want chage:" num
cd /root/tmp/dir$num
for s in `ls /root/tmp/dir$num`
do
mv $s $s.bak
done
ls /root/tmp/dir$num >../out
rm -rf /root/tmp/*${num}*

##################################################
(3)备份文件
l 每天18:00归档/etc目录下的所有文件,归档文件名为如下形式:etc-YYYY-MM-DD;保存在/home/user/backup目录下,其中user为当前登录用户名

需要编写一个脚本,放到/etc/cron.d/script :
vi script
#!/bin/bash

DATE=`date +%F`
tar -cvf /etc-$DATE /etc
mkdir /home/$USER/backup
mv /etc-$DATE /home/$USER/backup
#结束,保存

chmod +x script
crontab -e
00 18 * * * /etc/cron.d/script

##################################################
同上差不多

l 每天8:00压缩/etc目录下的所有内容,压缩文件名为如下形式:etc-YYYY-MM-DD;存放在/home/user/tar目录下,其中user为当前登录用户名
l 每周日17:00归档/home下每个目录,归档文件名为如下形式:dir-YYYY-MM-DD;保存在/tm

p/YYYYMMDD目录下
##################################################
(4)查找统计
l 查看/etc/passwd中所有包含字符串“aa”的用户,并将结果保存在文本文件中
grep "aa.*" /etc/passwd|cut -d: -f1 >file
l 查看/bin中包含字符串“ls”的文件名,并将结果保存在文本文件中
ls /bin|grep "ls.*" >file
l 把/bin和/sbin下的文件名保存到文件commandview中
ls /bin /sbin >commandview
l 统计/bin和/sbin下的文件数量
ls /bin |wc -l
ls /sbin|wc -l

##################################################
真心不会 只知道ps top

(5)进程管理
l 显示系统正在运行的所有进程
l 显示当前终端正在运行的所有进程
应该是: ps -H
l 显示root正在运行的所有进程
l 以优先级-16后台启动一个进程“find / -name ls* > tmp &”
l 显示该进程信息
ps -ef |grep find
l 修改该进程的优先级
renice
l 杀掉该进程
kill id
##################################################
(6)系统信息
显示当前登录的用户名
whoami
显示系统中所有用户名
cut -d ":" -f1 /etc/passwd
显示本机名
hostname
显示本机操作系统的名称、版本
cat /etc/issue
显示文件系统信息
df -h
显示当前系统状态信息

##################################################
(7)加减乘除运算,其中
l 两个操作数和一个运算符由位置参数给出
l 在屏幕上分别显示操作数、运算符和运算结果


#!/bin/bash
#test 7

read -p "input first num: " var1
read -p "input +-*/ : " var
read -p "input second num: " var2

v=`echo "scale=2; $var1 $var $var2 "|bc`
echo "$var1 $var $var2 = $v"

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

(8)按照运行结果编写Shell程序:
0
101
21012
3210123
432101234
54321012345
6543210123456
765432101234567
87654321012345678
9876543210123456789



#!/bin/bash
#test 8
i=0
for(( i; i <= 9; i++ ))
do
j=$i
for(( i; i >= 0; i-- ))
do
echo -n "$i"
done
a=1
while [ $a -le $j ]
do
echo -n "$a"
let a=a+1
done
echo " "
i=$j
done

##################################################
(9)逆序输出一个字符串

#!/bin/bash
#test 9

read -p "input chars : " char

rev $char


##################################################
(10)冒泡法对10个数按升序排序


#!/bin/bash
#test 10 冒泡法输出
i=0
for m in "$@"
do
a[i]=$m
let i=i+1
done

# $#随意多个位置参数都可以进行排序,具体到n个参数,则改为n
for (( i = 0; i <= $# ; i++ ))
do
for(( j=1+i; j <= $# ; j++ ))
do
if [[ ${a[i]} -gt ${a[j]} ]]
then
t=${a[i]}
a[$i]=${a[j]}
a[$j]=$t
fi
done
done
echo "${a[@]}" #不换行输出

#如果要换行输出用下面语句:
f

or k in "${a[@]}"
do
echo $k
done
~
##################################################
(11)编写1个menu的Shell程序,执行后的界面为:
NumberNameFor Linux Menu
1exitleave
2viedit a file
3datedate
4calcalendar
5wholist the users
6lslist the files in this directory
7catdisplay a file on the screen
Please input a number or a name for the action you wish:


(有点差异,绞尽脑汁也不知道怎么改的跟上面一样:)
echo "NumberNameFor Linux Menu"
select var in "exitleave" "viedit a file" "datedate" "calcalendar" "wholist the user" "
lslist the files in this directory" "catdisplay a file on the screen"

do
break
done
echo "please input a number or a name for the action you wish:"
echo "your choose is $var"

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


(12)求n的阶乘,n=100
方法1:
#!/bin/bash
a=1
for(( i=1; i <= 100; i++ ))
do
a=$[ $i * $a ]
done
echo "100!=$a"

#我的电脑100!输不出来,可能是出题目的有点脑残,考算法直接用10就可以嘛!!

方法2(递归)(可以求任意数的阶乘,但是。。100!还是输不出啊):
function func
{
if [ $1 -eq 1 ];then
echo " 1"
else
local i=$[ $1 - 1 ]
local j=`func $i`
a=`echo "scale=3; $1 * $j"|bc`
echo $a
fi
}

read -p "input a num: " m
n=`func $m`
echo "$m! = $n"



相关文档
相关文档 最新文档