Day04-SHELL自动化编程-循环与颜色函数库

Day04-SHELL自动化编程-循环与颜色函数库

  • 11. 必知必会核心命令
    • 11.1 命令概述
    • 11.7 案例
    • 11.8 小结
  • 12 Shell编程-循环
    • 12.1 循环概述
    • 12.2 for循环
      • 1)最常用的for循环格式
      • 2)c语言格式for循环
      • 3)for循环格式及应用场景
      • 4)案例
    • 12.3 while循环
      • 1)概述
      • 2)while循环通用格式
      • 3)while循环-死循环
      • 4)while循环-读取文件内容
    • 12.4 do-until循环
    • 12.5 循环小结
    • 12.6 循环控制语句
      • 1)概述
      • 2)实战
      • 3)案例31 修改猜测数字的脚本
      • 4)了解
      • 5)小结
  • 13 Shell编程-辅助
    • 13.1 颜色
    • 13.2 gui(了解)
    • 13.3 小结

#!/usr/bin/env bash
# 
# 服务器线程数达到 2500 以上时 dump 线程数最多的 java 进程的线程及内存
#
# 1.加载系统的环境变量
source ~/.bashrc# 2.取出当前系统所有的进程+线程数
cur_thread_num=`ps -efL | wc -l`# 3.判断如果小于等于2500则退出脚本,表示当前系统正常的
if [ $cur_thread_num -le 2500 ]; thenexit 0
fi# 4.当前日期+时间
cur_date=`date +"%Y-%m-%d_%H-%M-%S"`# 5.进入到临时目录(bug需要检查与创建) 
mkdir -p /tmp/dumpfile && cd /tmp/dumpfile/   # 指定个目录# 6.只显示多线程的服务并排序  服务器当前线程 dump 到文件:按照线程数由大到小排序显示
ps -efL --sort -nlwp > server_thread_dump_$cur_date
# 7.取出Java线程数最多的进程的pid  
most_thread_num_pid=`cat server_thread_dump_$cur_date | sed -n '2p' | awk '{print $2}'`
# 8.jstack导出线程信息 jstack -l pid
nohup jstack -l $most_thread_num_pid > java_app_thread_dump_${cur_date}_pid_${most_thread_num_pid} &
# 9.jmap导出jvm内存文件  jmap -dump:format=b,file=jvm文件  pid
nohup jmap -dump:format=b,file=java_app_mem_dump_${cur_date}_pid_${most_thread_num_pid} $most_thread_num_pid &exit 0

11. 必知必会核心命令

11.1 命令概述

脚本常用监控命令
端口一般用于检查端口是否存在,是否能连接是否存在: ss -lntup|grep 端口号 netstat -lntup |grep lsof -i:80
是否能访问: telnet, nc ,nmap
进程检查进程状态,指标ps /top/iotop
网络检查连通性ping,iftop(流量),dig(DNS)ՎՎʢ
webhttp请求curl/wget
系统全能atop(all)

11.7 案例

案例23:检查指定的地址的端口是否可以访问
地址:域名、ip
端口:端口

sh   check_access.sh   10.0.0.61   22
屏幕输出
可以访问或不能访问
  • 分析:使用什么命令,如何实现(步骤)
    • 命令:nc/nmap/telnet
    • 步骤:
      • 输入地址 端口
      • 使用命令访问地址的端口
      • 判断结果(返回值判断,过滤+wc)
        • 成功
        • 失败
      • 脚本结束
[root@m01 devops-shell]# cat 23-check_port.sh 
#!/bin/bash
##############################################################
# File Name:23-check_port.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc:
###############################################################1.vars
url=$1
port=$2. /etc/init.d/functions#2.检查
#检查参数个数2
[ $# -ne 2 ] && {action "请输入 url  端口" /bin/falseexit 1
}#检查端口
[[ $port =~ ^[0-9]+$ ]] || {action "请输入有效的端口:" /bin/falseexit 2
}
#3.正式检查
port_count=`nmap -p $port $url |grep -wc open`
if [ $port_count -eq 1 ];thenaction "$url $port 是通畅的" /bin/true
elseaction "$url $port 是不通畅的" /bin/false
fi[root@m01 devops-shell]# sh 23-check_port.sh baidu.com lidao996
请输入有效的端口:                                         [失败]
[root@m01 devops-shell]# sh 23-check_port.sh baidu.com  80
baidu.com 80 是通畅的                                      [  确定  ]
[root@m01 devops-shell]# sh 23-check_port.sh baidu.com  81
baidu.com 81 是不通畅的                                    [失败]
[root@m01 devops-shell]# sh 23-check_port.sh baidu.com  443
baidu.com 443 是通畅的                                     [  确定  ]
  • telnet
echo q | telnet -e q  10.0.0.61  23
echo $?
  • 补充 if nc 也可直接用命令
#-w 超时时间
#-z非交互模式
if nc -w 1 -z $dst $port ;thenaction "地址:$dst 端口:$port is ok" /bin/true
elseaction "地址:$dst 端口:$port is failed" /bin/false
fi

案例24:检查指定url是否可以访问

sh   check_url.sh   url 
屏幕输出:
可以访问地址或不能访问地址
  • 命令:wget/curl
  • 流程
    • 用户输入url/ip
    • wget执行
    • 判断返回值
[root@m01 devops-shell]# cat 24-check_url.sh 
#!/bin/bash
##############################################################
# File Name:23-check_url.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc:
###############################################################1.vars
url=$1#2.检查输入是否为url地址
check_url() {
[[ $url =~ ^[0-9a-zA-Z./:]+$ ]] || {echo "请输入有效的url地址"exit 1}
}
#3.检查
url_status() {
status_code=`curl -s -I $url | awk 'NR==1{print $2}'`
[ -z "$status_code" ] && {echo "$url is failed"exit 2
}
if [ $status_code -lt 400 ];thenecho "$url is ok"
elseecho "$url is failed"
fi
}main() {check_urlurl_status
}
main[root@m01 devops-shell]# sh 23-check_url.sh 
请输入有效的url地址
[root@m01 devops-shell]# sh 23-check_url.sh www.baidu.com
www.baidu.com is ok
[root@m01 devops-shell]# sh 24-check_url.sh erferffds.fpofkwepo.dwelpdwep
erferffds.fpofkwepo.dwelpdwep is failed
  • wget方法
wget -q --spider   www.baiduavavavavavaavvvvvvv.com
-q不输出额外内容
--spider不下载文件,仅仅访问测试.
echo $?

11.8 小结

  • 根据脚本需要,去使用与选择命令,然后书写对应的语句(变量,判断,循环)。
  • 目标:简单,易用。(能用,然后逐渐优化),多种方法书写脚本。
  • 不断练习,每个脚本步骤与思路

12 Shell编程-循环

12.1 循环概述

循环类型说明
for循环最常用的循环,2种格式
while循环 当型循环while可以加入条件,死循环, 读取文件
do until 循环 直到循环极少用

12.2 for循环

1)最常用的for循环格式

  • 最常用形式
最常用的一种
for 变量  in 候补清单(列表)
do命令
done
for n  in  1 2 4 5 6 79 81
doecho $n
done
第1次循环 变量n的值就是 1
第2次循环 变量n的值就是 2
第3次循环 变量n的值就是 4
第4次循环 变量n的值就是 5
.。。。。。for循环一般搭配着{1..10}  `seq 10`  `ls /etc/`
for n in {1..10}
doecho $n
done
#for n in a b c d e file1 file2 file3 dir1 dir2   
1 2 3 4 5 
[root@m01 devops-shell]# for n in {a..e} `ls /etc/ | head -5` `seq 5`
> do
>    echo $n
> done
a
b
c
d
e
abrt
adjtime
aliases
aliases.db
alternatives
1
2
3
4
5

2)c语言格式for循环

  • 不是太常用的形式 c语言形式
[root@m01 devops-shell]# for((i=1;i<=10;i++))
> do
>   echo $i
> done
1
2
3
4
5
6
7
8
9
10i=1 变量i初始化是1.
i<=10 i的值小于等于10的时候运行循环语句。(条件)
每次循环后执行i++  i=i+11.执行循环
2.i初始值是1  
3.进行判断i<=10,满足条件,运行循环。
4.运行命令,运行完成后。
5.执行i++,然后进行下次循环。
6.循环3-5步骤

3)for循环格式及应用场景

  • for循环及应用场景
for循环格式格式应用场景
通用格式for n in {1…10}
do
echo $n
done
通用,大部分场景可用
c语言格式for((i=1;1<=10;i++))
do
echo $i
done
对数组循环使用

4)案例

案例25: 面试题: 使用for循环在/oldboy目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件,名称例如为:
[root@oldgirl C19]# ls /oldboy
apquvdpqbk_oldboy.html 
mpyogpsmwj_oldboy.html 
txynzwofgg_oldboy.html
bmqiwhfpgv_oldboy.html 
mtrzobsprf_oldboy.html 
vjxmlflawa_oldboy.html
jhjdcjnjxc_oldboy.html 
qeztkkmewn_oldboy.html
jpvirsnjld_oldboy.html 
ruscyxwxai_oldboy.html
  • 步骤:
    • 循环10次
      • 生成随机字符保存
      • 创建文件+随机字符
[root@m01 devops-shell]# cat 25-for_touch_files.sh 
#!/bin/bash
##############################################################
# File Name:25-for_touch_files.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc:
###############################################################1.vars
dir=/oldboy/#1.5 检查目录是否存在
#1.5 检查是否有mkpasswd命令否则安装expect#2.for
for n in {1..10}
dofilename_suiji=`mkpasswd -l 10 -s 0`filename_full=${filename_suiji}_oldboy.htmlcd $dirtouch $filename_fulldone[root@m01 devops-shell]# sh 25-for_touch_files.sh 
[root@m01 devops-shell]# ll /oldboy/
总用量 0
-rw-r--r-- 1 root root 0 2024-04-09 17:07 0ptNKogsj8_oldboy.html
-rw-r--r-- 1 root root 0 2024-04-09 17:07 2vtMi7Ufzo_oldboy.html
-rw-r--r-- 1 root root 0 2024-04-09 17:07 DzpkjtgT55_oldboy.html
-rw-r--r-- 1 root root 0 2024-04-09 17:07 IgqulN49pj_oldboy.html
-rw-r--r-- 1 root root 0 2024-04-09 17:07 jyNzqBaj29_oldboy.html
-rw-r--r-- 1 root root 0 2024-04-09 17:07 l4wu6isiCT_oldboy.html
-rw-r--r-- 1 root root 0 2024-04-09 17:07 n9wA1qVekk_oldboy.html
-rw-r--r-- 1 root root 0 2024-04-09 17:07 Nhx43ctSvu_oldboy.html
-rw-r--r-- 1 root root 0 2024-04-09 17:07 tr55xwZqxU_oldboy.html
-rw-r--r-- 1 root root 0 2024-04-09 17:07 wa82ijRgdK_oldboy.html
  • 生成随机字符
uuidgenmkpasswd  -l 10  -d 0 -s 0 -C 0
-l 密码长度
-d 数字数量
-s special 特殊字符
-C 大写字母
-c 小写字母tr 
tr -cd 'a-z' </dev/urandom |head -c10
-c取反,
-d删除
/dev/urandom 字符设备,生成随机字符。tr -cd  'a-zA-Z0-9' </dev/urandomdate +%N |md5sum 
%N纳秒echo $RANDOM   0-32767echo $((RANDOM+10000000))
echo $((RANDOM+10000000)) | md5sum

12.3 while循环

1)概述

  • while循环
    • 加入条件
    • 死循环
    • 读取文件

2)while循环通用格式

while 条件
do命令
done
温馨提示:
while循环只会在满足条件后运行

案例26: 使用while循环输出1…10

[root@m01 devops-shell]# cat 26-while_print.sh 
#!/bin/bash
##############################################################
# File Name:26-while_print.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc:
##############################################################i=1
while [ $i -le 10 ]
doecho $ilet i++
done[root@m01 devops-shell]# sh 26-while_print.sh 
1
2
3
4
5
6
7
8
9
10

后面可以改写为从任意数字开始,到任意数字结束,看看如何修改?

案例27:输出1+2+3+4+5+…+100的结果

[root@m01 devops-shell]# cat 27-while_sum.sh 
#!/bin/bash
##############################################################
# File Name:27-while_sum.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc:
###############################################################1.vars
i=1
sum=0
#2.while
while [ $i -le 100 ]
do let sum=sum+ilet i++
done
#3.结果
echo $sum[root@m01 devops-shell]# sh 27-while_sum.sh 
5050
  • 可以写更多的方法
    • for循环
    • awk写法

3)while循环-死循环

  • 含义:一直循环,直到用户手动中止或满足指定条件后退出。
  • 应用场景:
    • 一般与用户交互的时候或脚本在系统后台持续运行
while true
doecho oldboy lidao996 
done
while true中的true本质是一个命令,命令永远成功李导温馨提示:
while :
do echo : 
done
: 相对是一个命令,没啥用,仅仅用于返回值是0.

案例28: 生成随机数字,判断数字是什么(1-100)

  • 如果输入的数字比随机数大,提示大了,

  • 如果输入数字比随机数小,提示小了,

  • 如果等于提示恭喜

  • 额外要求:

    • 用了1-3次 超越了99.99%人
    • 用了4-6次 超越80%的人
    • 其他 超越了70%的人
  • 步骤:

    • 生成随机数字 0-99随机数
    • 提示用户输入:数字(read)
    • 判断数字
      • 大于
      • 小于
      • 等于-结束
    • 如果是大于、小于继续循环(死循环)
    • 额外,猜中数字后输出超过%多少的人.
  • 基本需求

[root@m01 devops-shell]# cat 28-guess_num.sh 
#!/bin/bash
##############################################################
# File Name:28-guess_num.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc:
###############################################################1.vars
guess_num=$((RANDOM%100+1))#2.while循环
while :
doread -p "请输入你猜测的数字:" num#检查输入是否为数字-待增加[[ "$num" =~ ^[0-9]+$ ]] || {echo "请输入数字"#exit 1continue #结束本次循环,进入下次循环}#判断输入的数字与目标if [ $num -eq $guess_num ];thenecho "恭喜您猜对了"exit 1fiif [ $num -gt $guess_num ];thenecho "数字过大,请换一个更小的数字"elseecho "数字过小,请换一个更大的数字"fi
done
  • 加上额外需求
[root@m01 devops-shell]# cat 28-guess_num.sh 
#!/bin/bash
##############################################################
# File Name:28-guess_num.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc:
###############################################################1.vars
guess_num=$((RANDOM%100+1))
i=0
#1.5 函数
check_percent() {if [ $i -le 3 ];thenecho "您超越了99.99%的人"elif [ $i -ge 4 -a $i -le 6 ];thenecho "您超越了80%的人"elseecho "您超越了70%的人"fi}
#2.while循环
while :
doread -p "请输入你猜测的数字:" numlet i++#检查输入是否为数字-待增加[[ "$num" =~ ^[0-9]+$ ]] || {echo "请输入数字"#exit 1continue #结束本次循环,进入下次循环}#判断输入的数字与目标if [ $num -eq $guess_num ];thenecho "恭喜您猜对了"echo "您一共猜测了:$i次"check_percentexit 0fiif [ $num -gt $guess_num ];thenecho "数字过大,请换一个更小的数字"elseecho "数字过小,请换一个更大的数字"fi
done[root@m01 devops-shell]# sh -x 28-guess_num.sh 
+ guess_num=37
+ i=0
+ :
+ read -p 请输入你猜测的数字: num
请输入你猜测的数字:37
+ let i++
+ [[ 37 =~ ^[0-9]+$ ]]
+ '[' 37 -eq 37 ']'
+ echo 恭喜您猜对了
恭喜您猜对了
+ echo 您一共猜测了:1次
您一共猜测了:1次
+ check_percent
+ '[' 1 -le 3 ']'
+ echo 您超越了99.99%的人
您超越了99.99%的人
+ exit 0

4)while循环-读取文件内容

  • 应用场景:
    • 需要在脚本中读取文件内容,多行。
    • 此时可以选择3剑客或while循环.

方式1:采用exec读取文件后,然后进入while循环

#方式1:采用exec读取文件后,然后进入while循环处理。
exec<FILE
while read line
docmdecho $line
done

方式2:使用cat读取文件内容,然后通过管道进入 不适用于有变量传递场景使用。

while循环处理。
cat FILE|while read line
docmdecho $line
done

方式3:在while循环结尾done通过输入重定向指定读取的文件。 推荐使用.

while read line
docmd
done<FILE
  • 使用建议
    • 如果前面是命令使用方式2即可管道形式.
    • 如果是文件一般使用方式3即可.

案例29:通过while read方式,统计ip.txt文件行数

[root@m01 devops-shell]# seq 20 >num.txt
[root@m01 devops-shell]# cat num.txt 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20[root@m01 devops-shell]# cat 29-while_read.sh 
#!/bin/bash
##############################################################
# File Name:29-while_read.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc:
##############################################################file=num.txtwhile read line
do#echo $linelet sum=sum+$linelet i++done <$fileecho "这个文件一共有$i行"
echo "这个文件每一行总和:$sum"[root@m01 devops-shell]# sh 29-while_read.sh 
这个文件一共有20行
这个文件每一行总和:210

了解: while读取文件的方法2 vs 方法3 区别

file=/server/files/ip.txt
i=0
j=0
#01
echo "方法2:while + cat"
cat $file |while read ip
doecho $iplet i++
done
echo "次数 $i"
#02
echo "方法3:while + 输入"
while read ipaddr
doecho $ipaddrlet j++
done<$file
echo "次数  $j"

测试结果

[root@oldboy-devops-shell /server/scripts/devops-shell]# sh eg.12.3-03-test-while.sh
方法2:while + cat
10.0.0.5
10.0.0.5
10.0.0.5
10.0.0.5
10.0.0.5
次数 0
方法3:while + 输入
10.0.0.5
10.0.0.5
10.0.0.5
10.0.0.5
10.0.0.5
次数 5
  • 温馨提示说明下(了解):
    • 方法2在运行的时候因为管道,创建1个子shell,变量都存放在子shell中,子shell运行完成,消失了,变量也没了。
    • 方法3运行的时候是与当前脚本在同一个shell中,所以变量都保持了,可以继续使用。

案例30:分析ngx访问日志找出访问量最高前5个ip及他们的访问次数,IP访问次数大于200,通过防火墙屏蔽ip

防DOS,拒绝式服务攻击

DDOS分布式拒绝式服务攻击

CC 基于http请求攻击

  • 步骤:
    • 三剑客:分析ngx访问日志,访问次数最高的5个ip及访问次数,保存到文件中(res.txt)。
    • 循环:读取res.txt文件,读取ip和次数。
    • 判断:如果次数大于200 并且 之前没有屏蔽过(防火墙规则中没有这个ip)。
      • 是:通过防火墙命令 iptables -t filter -I INPUT -s ip -j DROP
      • 否:读取下一行。
    • 一直到读取完成文件。

日志:access.zip即可。

[root@m01 devops-shell]# cat 30-dos.sh 
#!/bin/bash
##############################################################
# File Name:30-dos.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc:
###############################################################1.vars
access_log=/server/files/access.log
result_file=/server/files/result.txt#2.日志分析
awk '{print $1}' ${access_log} |sort|uniq -c|sort -rn|head -5 > ${result_file}#3.进行处理
while read line
doip_cnt=`echo $line | awk '{print $1}'`ip_addr=`echo $line | awk '{print $2}'`#进行判断#判断次数大于200 并且 防火墙没有屏蔽这个IP地址if [ $ip_cnt -ge 200 -a `iptables -nL | grep -wc "${ip_addr}"` -eq 0 ];theniptables -t filter -I INPUT -s $ip_addr -j DROPfi
done<${result_file}[root@m01 devops-shell]# sh 30-dos.sh 
[root@m01 devops-shell]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  117.63.25.97         0.0.0.0/0           Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   

温馨提示:

文件的每一行的 第1列 赋值给count变量

文件的每一行的 第2列 赋值给ip变量

while read count ip
do
echo "ip地址是$ip 访问次数是$count"
done<$result_file

12.4 do-until循环

无论条件是否满足,都会执行1次。

#直到型循环: 一直循环,直到条件不满足.
until 条件
do命令命令....
done
until 话费是否充足
do发短信
done

12.5 循环小结

循环格式应用场景
for 循环for 变量 in 清单(列表 ) ;do 命令 ;done
for((i=1;i<=10;i++)) ;do echo $i ;done
大部分使用
数组循环
whilewhile 条件 ;do 命令 ;done死循环,读文件
until循环until 条件 ;do 命令;done很少用

12.6 循环控制语句

1)概述

语句含义应用场景
exit终止执行脚本,退出返回值
exit n
n 0-255
基础用法,判断后加上exit
脚本结束加上exit
用于脚本中检查部分(参数个数,检查格式,adv: rc=0,
可以放在脚本最后 exit $rc)
return放在函数中,终止执行函数,函数返回值写在函数中,检查函数命令运行是否成功。方便调试.
李导建议判断:最后1个命令或函数中关键命令
break终止循环(退出),不会继续运行剩余循环要在循环中表示退出循环
continue终止本次循环,进入下一次循环跳过要在循环中跳过某一次循环

2)实战

continue

for n in {1..10}
do
[ $n -eq 5 ] && continue
echo $n
done[root@m01 devops-shell]# for n in {1..10}
> do
> [ $n -eq 5 ] && continue
> echo $n
> done
1
2
3
4
6
7
8
9
10for n in {1..10}
do
[ $n -eq 5 ] && break
echo $n
done
[root@m01 devops-shell]# for n in {1..10}
> do
> [ $n -eq 5 ] && break
> echo $n
> done
1
2
3
4

3)案例31 修改猜测数字的脚本

  • 输入不是数字,进行提示并继续提示用户输入
  • 如果输入不是数字次数超过3次(大于3),则提示失败次数过多退出脚本
failed_cnt=0
#2. 检查是否为数字
# 用户输入非数字
# 1. 检查是否为数字
# 2. 失败次数是否大于等于3
check_num() {[[ "$num" =~ ^[0-9]+$ ]] || {let failed_cnt++if [ $failed_cnt -le 3 ];thenecho "请输入数字,不要输入其他$num"continueelseecho "失败次数过多,游戏结束"exit 1fi}
}

修改后脚本

4)了解

  • break n 结束多少层循环
  • continue n 结束当前循环,并从第几层运行
for i in {1..5}
dofor j in {a..c}doecho $i $jdone
donefor i in {1..5}
dofor j in {a..c}do[ $j = b ] || continue echo $i $jdone
donefor i in {1..5}
dofor j in {a..c}do[ $j = b ] && continue  2echo $i $jdone
donefor i in {1..5}
dofor j in {a..c}do[ $j = b ] && breakecho $i $jdone
donefor i in {1..5}
dofor j in {a..c}do[ $j = b ] && break 2echo $i $jdone
done

5)小结

要求 熟练掌握break和continue含义即可。
熟练使用exit

13 Shell编程-辅助

颜色
GUI窗口(了解)

13.1 颜色

Linux命令行给字体加颜色命令为:
echo -e "\E[1;31m红色字oldboy\E[0m"
红色字oldboy
echo -e "\033[31m红色字oldboy \033[0m"\E 或\033 表示要开启这种功能。
[1;31m
[效果;颜色m\E[0m 颜色设置结束。红色字oldboy
在上述命令中:echo -e可以识别转义字符,这里将识别特殊字
符的含义,并输出。 \n \t
Linux下面回车是 \n
Windows下面回车是 \r\n
  • 各种颜色的字-效果
    • 1表示加粗,2正常的,5表示闪烁
 echo -e "\E[1;31m红色字oldboy\E[0m"echo -e "\E[2;31m红色字oldboy\E[0m"echo -e "\E[3;31m红色字oldboy\E[0m"echo -e "\E[4;31m红色字oldboy\E[0m"echo -e "\E[5;31m红色字oldboy\E[0m"echo -e "\E[6;31m红色字oldboy\E[0m"echo -e "\E[7;31m红色字oldboy\E[0m"echo -e "\E[8;31m红色字oldboy\E[0m"echo -e "\E[9;31m红色字oldboy\E[0m"echo -e "\E[10;31m红色字oldboy\E[0m"

颜色

for n in {30..50}; do echo -e "\E[1;${n}moldboy\E[0m";done

在这里插入图片描述

应用建议

创建环境变量或写入脚本开头
export RED="\E[5;31m"
export GREEN="\E[1;32m"
export BLUE="\E[1;34m"
export END="\E[0m"
永久使用/etc/profile中即可

在这里插入图片描述

写为函数

redecho() {echo -ne "\e[5;31m"echo -n "$@"echo -e "\e[0m"#echo -e "\e[5;31m $@ \e[0m"
}
greenecho() {echo -ne "\e[1;32m"echo -n "$@"echo -e "\e[0m"
}
blueecho() {echo -ne "\e[1;34m"echo -n "$@"echo -e "\e[0m"
}

案例32:用户自定义的函数库文件,自定义颜色

[root@m01 devops-shell]# cat diy_func.sh 
#!/bin/bash
##############################################################
# File Name:diy_func.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc:
##############################################################redecho() {
#颜色开头部分
echo -ne "\e[5;31m"
#取出要加上颜色的内容
echo -n "$@"
#颜色的结束部分
echo -e "\e[0m"
#echo -e "\e[5;31m $@ \e[0m"
}
greenecho() {
echo -ne "\e[1;32m"
echo -n "$@"
echo -e "\e[0m"
}
blueecho() {
echo -ne "\e[1;34m"
echo -n "$@"
echo -e "\e[0m"
}[root@m01 devops-shell]# . /server/scripts/devops-shell/diy_func.sh 
[root@m01 devops-shell]# redecho hello oldboy linux
hello oldboy linux
[root@m01 devops-shell]# redecho 你网站挂了
你网站挂了

在这里插入图片描述

check_return_value() {if [ $? -eq 0 ]thengreenecho $1 命令执行成功elseredecho  $1 命令执行失败fi
} 
check_user() {echo 检查用户
}
check_num() {echo 检查数字
}

颜色的更多说明链接: https://man7.org/linux/man-pages/man4/console_codes.4.html


[root@m01 devops-shell]# cat 31-func_test.sh 
#!/bin/bash
##############################################################
# File Name:31-func_test.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc:
##############################################################. /server/scripts/devops-shell/diy_func.shredecho 网站挂了id oldboy
check_return_value id[root@m01 devops-shell]# sh -x 31-func_test.sh 
+ . /server/scripts/devops-shell/diy_func.sh
+ redecho 网站挂了
+ echo -ne '\e[5;31m'
+ echo -n 网站挂了
网站挂了+ echo -e '\e[0m'+ id oldboy
uid=1000(oldboy) gid=1000(oldboy)=1000(oldboy)
+ check_return_value id
+ '[' 0 -eq 0 ']'
+ greenecho id 命令执行成功
+ echo -ne '\e[1;32m'
+ echo -n id 命令执行成功
id 命令执行成功+ echo -e '\e[0m'[root@m01 devops-shell]# sh 31-func_test.sh 
网站挂了
uid=1000(oldboy) gid=1000(oldboy)=1000(oldboy)
id 命令执行成功[root@m01 devops-shell]# cat 31-func_test.sh 
#!/bin/bash
##############################################################
# File Name:31-func_test.sh
# Version:V1.0
# Author:oldboy lidao996
# Organization:www.oldboyedu.com
# Desc:
##############################################################. /server/scripts/devops-shell/diy_func.shredecho 网站挂了id oldboy
check_return_value id
iddd oldboy
check_return_value iddd[root@m01 devops-shell]# sh 31-func_test.sh 
网站挂了
uid=1000(oldboy) gid=1000(oldboy)=1000(oldboy)
id 命令执行成功
31-func_test.sh:行16: iddd: 未找到命令iddd 命令执行失败

13.2 gui(了解)

gui图形功能。

未来建议大家使用:颜色和命令cowsay实现即可

yum install -y dialogdialog 功能功能选项     窗口大小高宽度
dialog --textbox /etc/hostname 80 80
dialog --msgbox "老男孩教育 linux81期金牌班lidao996" 10 30

在这里插入图片描述

13.3 小结

颜色.函数或变量即可.
dialog了解即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/304615.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【WSN覆盖优化】基于灰狼优化算法的无线传感器网络覆盖 GWO-WSN覆盖优化【Matlab代码#74】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】1. 灰狼优化算法2. WSN节点感知模型3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】 1. 灰狼优化算法 此处略。 2.…

【Java8新特性】四、强大的Stream api

​ 这里写自定义目录标题 一、了解Stream二、流(stream)到底是什么&#xff1f;三、Stream操作的三个步骤四、创建Stream的四种方式五、Stream 的中间操作1、筛选和切片2、map 映射3、排序 六、Stream 的终止操作1、查找和匹配2、归约3、收集 一、了解Stream Stream是Java8中…

spring容器

spring容器 实现方式 spring中提供了各式各样的IOC容器的实现供用户选择和使用&#xff0c;使用什么样的容器取决于用户的需要 BeanFactory 该接口是最简单的容器&#xff0c;提供了基本的DI支持。最常用的BeanFactory实现是XmlBeanFactory类&#xff0c;根据XML文件中的定义加…

idea常用配置

IDEA设置全局配置 参考&#xff1a;IDEA设置全局配置_idea如何打开一个项目,全局设置-CSDN博客 idea提交代码到git或svn上时&#xff0c;怎么忽略.class、.iml文件和文件夹等不必要的文件 参考&#xff1a;idea提交代码到git或svn上时&#xff0c;怎么忽略.class、.iml文件和文…

Python爬虫网络实践:去哪儿旅游数据爬取指南

Python爬虫网络实践&#xff1a;去哪儿旅游数据爬取指南 在这个博客中&#xff0c;我们将探索如何使用 Python 来进行网络数据抓取&#xff0c;并以抓取旅游数据为例进行演示。我们将通过一个简单的示例来说明如何利用 Python 中的常用库进行网页抓取&#xff0c;从而获取旅游…

软件详细设计说明书(套用案例)

2系统总体设计 2.1整体架构 2.2整体功能架构 2.3整体技术架构 2.4设计目标 2.5.1总体原则 2.5.2实用性和先进性 2.5.3标准化、开放性、兼容性 2.5.4高可靠性、稳定性 2.5.5易用性 2.5.6灵活性和可扩展性 2.5.7经济性和投资保护 3系统功能模块详细设计 3.1个人办公…

一键下载 M3U8 并转换为 MP4升级版

之前的下载 M3U8程序&#xff0c;有很多问题&#xff0c; 为此做了一些升级&#xff0c;分享给大家。 增加了存在播放列表的情况处理播放列表路径和ts路径错误问题多线程问题对于电视剧多文件下载的处理 这里从网上找了一部的链接&#xff0c;可以参考这个网站https://www.zu…

3 突破编程_前端_SVG(rect 矩形)

1 rect 元素的基本属性和用法 在SVG中&#xff0c;<rect> 元素用于创建矩形。 <rect> 元素有一些基本的属性&#xff0c;可以用来定义矩形的形状、位置、颜色等。以下是这些属性的详细解释&#xff1a; x 和 y &#xff1a;这两个属性定义矩形左上角的位置。 x …

Llama 3下月正式发布,继续开源!

4月10日&#xff0c;Techcrunch消息&#xff0c;Meta在本周伦敦举办的一场活动中确定&#xff0c;下个月将正式发布Llama 3并且继续开源。 Meta全球事务总裁Nick Clegg表示&#xff0c;我们希望在下个月&#xff0c;甚至更短的时间内&#xff0c;正式推出新一代基础模型Llama …

全光谱台灯哪个牌子好,2024全光谱护眼台灯推荐

近年来&#xff0c;全光谱台灯悄然跻身于家庭必备品之列&#xff0c;赢得了众多消费者的好评。它们以减轻眼睛疲劳的功效而受到推崇&#xff0c;尽管也有声音质疑其实际效用&#xff0c;认为所谓的益处不过是一种心理安慰。面对这些相互矛盾的观点&#xff0c;许多消费者感到困…

Java数据结构二叉树

概念 一棵二叉树是结点的一个有限集合&#xff0c;该集合&#xff1a; 1. 或者为空 2. 或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。 从上图可以看出&#xff1a; 1. 二叉树不存在度大于2的结点 2. 二叉树的子树有左右之分&#xff0c;次序不能颠倒&#x…

【QingHub】EMQX单节点一键部署

EMQX 简介 EMQX是全球最具扩展性的开源MQTT 代理&#xff0c;具有高性能&#xff0c;可在 1 个集群中连接 1 亿多个 IoT 设备&#xff0c;同时保持每秒 100 万条消息的吞吐量和亚毫秒级的延迟。 EMQX 支持MQTT、HTTP、QUIC、WebSocket等多种开放标准协议。它 100% 符合MQTT 5.…

【氧化镓】β-Ga2O3肖特基势垒二极管的缺陷识别

本文是一篇关于β-Ga2O3肖特基势垒二极管在电子辐射和退火调节下缺陷识别的研究。文章首先介绍了β-Ga2O3作为一种高性能器件材料的重要性&#xff0c;然后详细描述了实验方法&#xff0c;包括样品制备、电子辐照、热退火处理以及电学特性和深能级瞬态谱&#xff08;DLTS&#…

Java快速入门系列-7(测试与调试)

第七章:测试与调试 第7章:测试与调试7.1 单元测试(JUnit)7.1.1 为什么要进行单元测试7.1.2 JUnit基础7.1.3 断言7.1.4 测试套件7.2 集成测试与系统测试7.2.1 集成测试7.2.2 系统测试7.3 调试技巧与工具7.3.1 断点7.3.2 单步执行7.3.3 变量检查7.3.4 条件断点7.3.5 日志记录…

集群服务器使用

查看剩余资源&#xff1a;sinfo -O Nodehost,Gres:.30,GresUsed:.45 第二列是总资源 第三列是占用量 申请资源&#xff1a;salloc -N 1 -n 1 -p normal --gresgpu:NVIDIAGeForceGTX1080Ti1 gres的名字来源于sinfo 查看任务情况 squeue JOBID NODES 连接资源 ssh NODES …

云原生__K8S

createrepo --update /var/localrepo/# 禁用 firewall 和 swap [rootmaster ~]# sed /swap/d -i /etc/fstab [rootmaster ~]# swapoff -a [rootmaster ~]# dnf remove -y firewalld-*[rootmaster ~]# vim /etc/hosts 192.168.1.30 harbor 192.168.1.50 master 192.168.1.…

注解(Annotation) --java学习笔记

注解 就是Java代码里的特殊标记&#xff0c;比如:Override、Test等&#xff0c;作用是:让其他程序根据注解信息来决定怎么执行该程序注意:注解可以用在类上、构造器上、方法上、成员变量上、参数上、等位置处 自定义注解 就是自己定义注解 自定义注解到底该怎么写&#xff1a…

linux离线安装redis

一、下载linux版本压缩包 地址&#xff1a;Download | Redis 为了安全稳定性&#xff0c;下载 6.2 版本&#xff0c;不下载最新版 二、上传到linux服务器 笔者上传到 /opt/redis下 &#xff0c;使用Xftp和Xshell工具&#xff0c;使用root权限 cd /opt sudo mkdir redis cd r…

Dude, where’s that IP? Circumventing measurement-based IP geolocation(2010年)

下载地址:https://www.usenix.org/legacy/event/sec10/tech/full_papers/Gill.pdf 被引次数:102 Gill P, Ganjali Y, Wong B. Dude, Wheres That {IP}? Circumventing Measurement-based {IP} Geolocation[C]//19th USENIX Security Symposium (USENIX Security 10). 2010.…

SQLite 4.9的虚拟表机制(十四)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite 4.9的 OS 接口或“VFS”&#xff08;十三&#xff09; 下一篇:SQLite数据库文件格式&#xff08;十五&#xff09; 1. 引言 虚拟表是向打开的 SQLite 数据库连接注册的对象。从SQL语句的角度来看&#xff0c; 虚拟表…