Linux实验 (6) Shell编程

1.分析下列脚本的功能。

cat example1 (注意:假如脚本文件名为example1)
count=$#
cmd=echo
while [ $count -gt 0]
do
	cmd=$cmd \$$count”
	count=`expr $count -1`
done
eval $cmd

把传给脚本的参数逆序显示出来

2.编写shell脚本,将第2个位置参数及其后的各个参数所指定的文件复制到第1个位置参数指定的目录中。

#!/bin/bash
dir=$1         # 保存文件复制后的路径,即第一个参数

# 参数前移,运行shift命令之后,$1的值就变成$2的值了,原来的$1就不存在了。
# 同理$2的值变成$3的值,如果原来有9个参数,通过shift之后就剩下8个
shift
# 当没有把全部参数前移完时
while [ $1 ]
do
	file = $1
    cp $2 $1
    shift         # 再次前移参数
done


3.利用for循环将当前目录下.c文件移到指定目录下,之后显示该指定目录下的内容。

#!/bin/bash
for file in `ls -l / | grep ".*.c"` 
{
        mv /a/$file /tmp/mydir/b
}
ls /tmp/mydir

4.根据用户输入的用户名,查看系统中该用户是否登录。

#!/bin/bash
#输入值为空
if [ -z $1 ]
then
		echo "Usage:`basename $0` + username"
exit
fi
for user in $*
do
        count=`who|awk '{print $1}'|grep "\<$user\>"|wc -l`
        if [ $count -ge 1 ]
        then
                echo "$user has looged on."
        else
                echo "$user has not looged on."
        fi
done

5.用户输入一个1-10之间的数字,若不在该范围则输出信息“error”,否则输出信息“accept”。

#!/bin/bash
while [ -gt 0 ]
do
		#判断是否为数字
        echo -e "please input the digital:"
        read num
		#判断变量num是否为整数
        expr $num + 0 1>/dev/null 2>&1        #会将标准输出,错误输出都重定向至/dev/null,也就是全部丢弃
        #$? 表示上一条命令返回值,如果上一条命令成功执行,返回0,否则返回1
        if [ $? -ne 0 ]
        then
                echo "${num} is not a number!"
                exit 0
        fi
		 #大于10时
        if [ $num -gt 10 ]
        then
                echo "error"
		 #小于0时
        elif [ $num -lt 0 ]
        then
                echo "error"
        else
                echo "accept"
        fi
done

6.使用for循环在系统中成批添加10个用户,用户名分别是stu1~stu10。

#!/bin/bash
# 输入用户名,输入信息存入name变量中,限制30s的输入时间
read -p "Please input user name:" -t 30 name
# 输入需要创建的用户数量,存入num中,限制30s输入时间
read -p "Please input the number of users:" -t 30 num
# 输入需要创建的默认密码,存入pass中,限制30s输入时间
read -p "Please input the password of users:" -t 30 pass

# 用户名、用户数量、默认密码都输入成功之后
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
        then
# 输入的num变量为数值类型
        y=$(echo $num | sed 's/[0-9]//g')
        if [ -z "$y"]
        then
# 创建用户
        for (( i=1;i<=$num;i=i+1))
                do
                # 用户名以输入用户名+序号组成 
                /usr/sbin/useradd $name$i &> /dev/null
                # 创建默认密码
                echo $pass | /usr/bin/passwd --stdin $name$i &> /dev/null
                done
        fi
fi

在这里插入图片描述

cat /etc/passwd # 查看当前用户

7.任意设计一个shell程序,要求用到函数定义和调用。

输入一个数字n,然后从0开始每隔1秒输入一个数字,直到输出n-1为止。

#! /bin/bash  
# Filename:LoopPrint.sh  
  
function LoopPrint()  
{  
    count=0;  
    while [ $count -lt $1 ];  
    do  
    echo $count;  
    let ++count;  
    sleep 1;  
    done  
    return 0;  
}  
  
read -p "Please input the times of print you want: " n;  
LoopPrint $n;  

8.分析杭电的上网认证系统(http://2.2.2.2/ac_portal/20170407143720/pc.html),通过wget发送post请求包完成网络的认证和注销。根据并分别完成两个shell脚本:

1)登录脚本,运行脚本后提示输入用户名和密码(密码不要显示出来),然后完成登录,并返回登录的结果。
login.sh
#! /bin/bash
echo "-----------Begin to connect the hdu.com----------"
echo "Username:" 
read username
echo "Password:"
read -s passwd 
echo " "
echo "------------Result-----------"
echo " "
wget -S --post-data="opr=pwdLogin&userName=$username&pwd=$passwd&rememberPwd=0" http://2.2.2.2/ac_portal/login.php
2)注销脚本,运行脚本后注销当前用户。
logout.sh
#! /bin/bash
echo "`wget -S --post-data="opr=logout" http://2.2.2.2/ac_portal/login.php`"

9.设定定时执行任务,每天上午9:30至下午15:00,每隔5分钟在/root/toplog/目录下以当前日期和时间组合为文件名(ex:20171122_1012.log),记录当前的系统性能日志(top命令的输出即可)。

touch mklog.sh

#!/bin/bash
time=$(date '+%Y%m%d%H%M')
touch /tmp/temp/$time.log
top -b -n 1 > /tmp/temp/$time.log

touch time.cron
*/5 9-15 * * * /tmp/temp/mklog.sh
Crontab /tmp/temp/time.cron

你可能感兴趣的:(Linux学习)