③Shell循环控制——实训项目任务

项目三 项目实训(Shell循环控制)

【实训任务】

本实训的主要任务是使用for、while等语句编写循环控制脚本,从而提高Shell脚本的逻辑处理能力。

【实训目的】

(1)理解循环控制的基本概念。

(2)掌握for语句的基本语法,能够编写for循环控制脚本。

(3)掌握while语句的基本语法,能够编写while循环控制脚本。

【实训内容】

(1)编写shell脚本,使用for语句循环遍历备份目录列表,依次对每个目录进行备份,并将备份文件传输到远程服务器。

(2)编写shell脚本,使用for语句监控系统的CPU和内存使用情况,定期输出监控数据。

(3)编写shell脚本,使用while语句创建用户并设置其密码。

(4)编写shell脚本,使用while语句监控当前系统的网络连接信息。

【实训环境】

在进行本项目的实训操作前,提前准备好Linux操作系统环境,RHEL、CentOS Stream、Debian、Ubuntu、华为openEuler、麒麟openKylin等常见Linux发行版都可以进行项目实训。


项目实施

任务一 编写for语句脚本

1.任务描述

(1)在Linux操作系统中创建shell脚本for-multiplication.sh,使用for语句输出九九乘法表。

(2)在Linux操作系统中创建shell脚本for-backup.sh,通过for语句遍历备份目录列表,依次对每个目录进行备份,并将备份文件传输到远程服务器。

(3)在Linux操作系统中创建shell脚本for-monitor.sh,使用for语句监控系统的CPU和内存使用情况,定期输出监控数据。

2.任务实施

(1)在huawei用户家目录中,创建脚本文件for-multiplication.sh。

[root@redhat01 ~]# vim for-multiplication.sh
[root@redhat01 ~]# cat for-multiplication.sh 
#!/bin/bash
for ((i=1; i<=9; i++))
do
    for ((j=1; j<=i; j++))
    do
        product=$((i * j))
        echo -n "$i*$j=$product "
    done
    echo
done
[root@redhat01 ~]# bash for-multiplication.sh 
1*1=1 
2*1=2 2*2=4 
3*1=3 3*2=6 3*3=9 
4*1=4 4*2=8 4*3=12 4*4=16 
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81

(2)在huawei用户家目录中,创建脚本文件for-backup.sh。

[root@redhat01 ~]# vim for-backup.sh
[root@redhat01 ~]# cat for-backup.sh 		//此脚本不用执行
#!/bin/bash
backup_dirs=("/etc" "/mnt" "/tmp")
dest_dir="/backup"
dest_server="node1"
backup_date=$(date +%b-%d-%y)
echo "Starting backup of: ${backup_dirs[@]}"
for i in "${backup_dirs[@]}"; do
sudo tar -Pczf /tmp/$i-$backup_date.tar.gz $i
if [ $? -eq 0 ]; then
echo "$i backup succeeded."
else
echo "$i backup failed."
fi
scp /tmp/$i-$backup_date.tar.gz $dest_server:$dest_dir
if [ $? -eq 0 ]; then
echo "$i transfer succeeded."
else
echo "$i transfer failed."
fi
done
sudo rm /tmp/*.gz 
echo "Backup is done."

(3)在huawei用户家目录中,创建脚本文件for-monitor.sh。

[root@redhat01 ~]# vim for-monitor.sh
[root@redhat01 ~]# cat for-monitor.sh 
#!/bin/bash
# 监控时间间隔(单位为s)
interval=3
# 循环次数
max_loops=10
# 监控CPU和内存使用情况
for ((i=1; i<=$max_loops; i++))
do
    timestamp=$(date +%H:%M:%S)
    # 获取CPU使用率
    cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
    # 获取内存使用率
    mem_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
    echo "[$timestamp] CPU使用率:$cpu_usage%   内存使用率:$mem_usage%"
    sleep $interval
done

[root@redhat01 ~]# bash for-monitor.sh 
[10:55:32] CPU使用率:3%   内存使用率:47.6417%
[10:55:35] CPU使用率:0%   内存使用率:47.663%
[10:55:39] CPU使用率:0%   内存使用率:48.4943%
[10:55:42] CPU使用率:5.8%   内存使用率:48.4943%
[10:55:45] CPU使用率:3.1%   内存使用率:48.4943%
[10:55:48] CPU使用率:0%   内存使用率:47.2879%
[10:55:51] CPU使用率:3.2%   内存使用率:47.3096%
[10:55:55] CPU使用率:6%   内存使用率:47.3096%
[10:55:58] CPU使用率:0%   内存使用率:47.5432%
^C
//执行完会实时输出,使用ctrl+c终止即可

任务二 编写while语句脚本

1.任务描述

(1)在Linux操作系统中创建shell脚本while-useradd.sh,使用while语句和计数器变量迭代创建用户并设置其密码,同时,将每个用户的用户名和密码写入文件,以便后续参考和使用。

(2)在Linux操作系统中创建shell脚本while-userdel.sh,使用while语句和计数器变量迭代删除用户,在循环内部,通过id命令检查用户是否存在,如果存在则使用userdel命令删除用户,否则输出用户不存在的信息。

(3)在Linux操作系统中创建shell脚本while-netstat.sh,用于监控当前系统的网络连接信息。

2.任务实施

(1)在huawei用户家目录中,创建脚本文件while-useradd.sh。

[root@redhat01 ~]# vim while-useradd.sh
[root@redhat01 ~]# cat while-useradd.sh
#!/bin/bash
# 创建一个文件来存储用户名和密码
password_file="passwords.txt"
> "$password_file"  # 清空文件内容
count=1
# 循环创建10个用户
while [ $count -le 10 ]
do
    # 生成随机密码
    password=$(openssl rand -base64 12 | tr -dc 'a-zA-Z0-9' | head -c 10)
    # 创建用户
    username="user$count"
    useradd "$username"
    # 设置密码
    echo "$username:$password" | chpasswd
    # 将用户名和密码写入文件
    echo "Username: $username" >> "$password_file"
    echo "Password: $password" >> "$password_file"
    echo "---------------------" >> "$password_file"
    count=$((count + 1))
done
echo "用户创建和密码设置完成!密码已保存到 $password_file 文件中。"
[root@redhat01 ~]# bash while-useradd.sh 
用户创建和密码设置完成!密码已保存到 passwords.txt 文件中。

(2)在huawei用户家目录中,创建脚本文件while-userdel.sh。

[root@redhat01 ~]# vim while-userdel.sh
[root@redhat01 ~]# cat while-userdel.sh
#!/bin/bash
count=1
# 循环删除10个用户
while [ $count -le 10 ]
do
    username="user$count"
    # 检查用户是否存在
    if id "$username" >/dev/null 2>&1; then
        # 删除用户
        userdel -r "$username"
        echo "用户 $username 删除成功。"
    else
        echo "用户 $username 不存在。"
    fi
    count=$((count + 1))
done
[root@redhat01 ~]# bash while-userdel.sh 
用户 user1 删除成功。
用户 user2 删除成功。
用户 user3 删除成功。
用户 user4 删除成功。
用户 user5 删除成功。
用户 user6 删除成功。
用户 user7 删除成功。
用户 user8 删除成功。
用户 user9 删除成功。
用户 user10 删除成功。

(3)在huawei用户家目录中,创建脚本文件while-netstat.sh。

[root@redhat01 ~]# vim while-netstat.sh
[root@redhat01 ~]# cat while-netstat.sh
#!/bin/bash
# 循环执行netstat和grep命令
while true; do
  # 获取HTTP服务连接信息
  HTTP_CONNECTIONS=$(netstat -an | grep :80)
  # 统计HTTP服务监听状态的连接数量
  LISTEN_CONNECTIONS=$(echo "$HTTP_CONNECTIONS" | grep "LISTEN" | wc -l)
  # 统计HTTP服务建立连接的数量
  ESTABLISHED_CONNECTIONS=$(echo "$HTTP_CONNECTIONS" | grep "ESTABLISHED" | wc -l)
  # 统计HTTP服务连接的总数
  TOTAL_CONNECTIONS=$(echo "$HTTP_CONNECTIONS" | wc -l)
  # 输出统计信息
  echo "HTTP connections in LISTEN state: $LISTEN_CONNECTIONS"
  echo "HTTP connections in ESTABLISHED state: $ESTABLISHED_CONNECTIONS"
  echo "Total HTTP connections: $TOTAL_CONNECTIONS"
  # 等待2s
  sleep 2
done
[root@redhat01 ~]# bash while-netstat.sh 
HTTP connections in LISTEN state: 0
HTTP connections in ESTABLISHED state: 0
Total HTTP connections: 1
HTTP connections in LISTEN state: 0
HTTP connections in ESTABLISHED state: 0
Total HTTP connections: 1
HTTP connections in LISTEN state: 0
HTTP connections in ESTABLISHED state: 0
Total HTTP connections: 1
^C
//CTRL+c终止
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值