linux学习之shell脚本数组、循环和计划任务

1.编写脚本实现登陆远程主机。(使用expect和shell脚本两种形式)
#!/bin/bash
#########################################################################
# File Name: expect_shell.sh
# Author: Ammon
# Created Time: Thu 23 Dec 2021 05:31:50 PM CST
# DesC: expect_shell!
#########################################################################
ip=10.0.0.150
user=root
password=123456
expect <<EOF
set timeout 10
spawn ssh $user@$ip
expect {
    "yes/no" { send "yes\r\n";exp_continue }
    "password" { send "$password\r\n" }
}
expect "]#" { send "hostname -I\r\n" }
expect eof
#interact #交互式
EOF

#!/usr/bin/expect
#########################################################################
# File Name: expect_demo.sh
# Author: Ammon
# Created Time: Thu 23 Dec 2021 05:04:01 PM CST
# DesC: expect_demo!
#########################################################################
#expect中相关命令
#1.spawn:启动新进程
#2.expect:从进程中接收字符串
#3.sned:用于向进程发送字符串
#4.interact:允许用户交互
#exp_continue:匹配多个字符串在执行动作后加此命令
#单分支模式语法和多分支模式语法
#多分支语法模式:自动登录
spawn ssh 10.0.0.150
expect {
    "yes/no" { send "yes\n";exp_continue }
    "password" { send "123456\n" }
}
expect eof  #非交互式        interact:交互式

#expect变量
#set ip 10.0.0.150
#set user root
#set password 123456
#set timeout 10
#spawn ssh $user@ip
#expect {
#   "yes/no" { send "yes\n";exp_continue }
#   "password" { send "$password\n"  }
#}
#interact #交互式
2.生成10个随机数保存于数组中,并找出其最大值和最小值
#!/bin/bash
#########################################################################
# File Name: array_demo.sh
# Author: Ammon
# Created Time: Sat 25 Dec 2021 10:12:18 AM CST
# DesC: This is a demo!
#########################################################################
#普通数组可以不先声明,直接使用
declare -a ARRAY_NUM
#关联数组必须先声明,再使用
#declare -A ARRAY_NAME
#定义整型变量
declare -i min max
for((i=0; i<10;i++));do
        ARRAY_NUM[$i]=$RANDOM
        #echo ${ARRAY_NUM[$i]}
        if [ $i -eq 0 ];then
                min=${ARRAY_NUM[0]}
                max=${ARRAY_NUM[0]}
        elif [ ${ARRAY_NUM[$i]} -lt $min ];then
                min=${ARRAY_NUM[$i]}
        elif [ ${ARRAY_NUM[$i]} -gt $max ];then
                max=${ARRAY_NUM[$i]}
        fi
        echo "ARRAY_NUM[$i]=${ARRAY_NUM[$i]}"
done
echo "All num are ${ARRAY_NUM[*]}"
echo "min=$min,max=$max"

运行截图


image.png
3.输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序
#!/bin/bash
#########################################################################
# File Name: babo_demo.sh
# Author: Ammon
# Created Time: Sat 25 Dec 2021 11:14:31 AM CST
# DesC: This is a demo!
#########################################################################
#declare -a num
#read -p  "请输入数组:" ${num[$@]}
echo "请在下列输入数组(仅支持输入数字):"
#read -a 输入数组
read -a  num
len=${#num[*]}
echo "原始数组:num=${num[*]},len=$len"

#for((i=0;i < $len;i++));do
#       echo "num[$i]=${num[$i]}"
#       if[ ${num[$i] =~^[0-9]} ];then
#               echo "num[$i]非数字"
#       fi
#done
#冒泡排序,一个元素肯定是有序的

for((i=o;i < $len-1;i++));do
        for((j=0;j < $len-1-i;j++));do
                if [ ${num[$j]} -gt ${num[$j+1]} ];then
                        tmp=${num[$j]}
                        num[$j]=${num[$j+1]}
                        num[$j+1]=$tmp
                fi
        done
done
echo "排序后数组:num=${num[*]},len=$len"

运行截图


image.png
4.总结查看系统负载的几种命令,总结top命令的指标大概什么含义

进程管理和性能管理工具
pstree、ps、pidof、pgrep、top、htop、glance、pmap、vmstat、dstat、kill、pkill、job、bg、fg、nohup
4.1 进程树 pstree:以用来显示进程的父子关系,以树形结构显示
4.2 进程信息 ps:显示当前终端中的进程
4.3 查看进程信息 prtstat
4.5 按条件搜索进程 pgrep
4.6 负载查询 uptime
4.7 显示CPU相关统计 mpstat
4.8 查看进程实时状态 top 和 htop
4.8.1.top提供动态的实时进程状态

1.1.排序:
P:以占据的CPU百分比,%CPU
M:占据内存百分比,%MEM
T:累积占据CPU时长,TIME+
首部信息显示:
uptime信息:l命令
tasks及cpu信息:t命令
cpu分别显示:1 (数字)
memory信息:m命令
退出命令:q
修改刷新时间间隔:s
终止指定进程:k
保存文件:W

1.2.top命令栏位信息简介
us:用户空间
sy:内核空间
ni:调整nice时间
id:空闲
wa:等待IO时间
hi:硬中断
si:软中断(模式切换)
st:虚拟机偷走的时间

1.3.top选项:
-d # 指定刷新时间间隔,默认为3秒
-b 全部显示所有进程
-n # 刷新多少次后退出
-H  线程模式

4.8.2 htop 增强版的TOP命令

1.1选项:
-d #: 指定延迟时间;
-u UserName: 仅显示指定用户的进程
-s COLUME: 以指定字段进行排序

1.2子命令:
s:跟踪选定进程的系统调用
l:显示选定进程打开的文件列表
a:将选定的进程绑定至某指定CPU核心
t:显示进程树
5.编写脚本,使用for和while分别实现192.168.0.0/24网段内,地址是否能够ping通,若ping通则输出"success!",若ping不通则输出"fail!"
#!/bin/bash
#########################################################################
# File Name: online_demo.sh
# Author: Ammon
# Created Time: Sat 25 Dec 2021 09:19:43 PM CST
# DesC: This is a demo!
#########################################################################
NET=192.168.O
for((i=0;i<25;i++));do
        echo "ping $NET.$i ......"
        ping -c1 -w1 $NET.$i # &> /dev/null
        if [ $? -eq 0 ]; then
                echo "$NET.$i is success!"
        else
                echo "$NET.$i is fail!"
        fi
done

i=0
while ((i<25));do
        echo "ping $NET.$i ......"
        ping -c1 -w1 $NET.$i # &> /dev/null
        if [ $? -eq 0 ]; then
                echo "$NET.$i is success!"
        else
                echo "$NET.$i is fail!"
        fi
        let i++
done

运行截图


image.png
6.每周的工作日1:30,将/etc备份至/backup目录中,保存的文件名称格式 为“etcbak-yyyy-mm-dd-HH.tar.xz”,其中日期是前一天的时间
#!/bin/bash
#########################################################################
# File Name: backup_demo.sh
# Author: Ammon
# Created Time: Sat 25 Dec 2021 10:12:06 PM CST
# DesC: This is a demo!
#########################################################################
path=/backup
[ -d $path ] || mkdir $path
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
#每周工作日 1:30
30 1 * * 1-5 /usr/bin/tar -zcf etcbak-date -d "-1 day" +%Y-%m-%H.tar.xz /etc &> /dev/null
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容