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

#!/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 ]; then
    exit 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/false
  exit 1
}

#检查端口
[[ $port =~ ^[0-9]+$ ]] || {
  action "请输入有效的端口:" /bin/false
  exit 2
}
#3.正式检查
port_count=`nmap -p $port $url |grep -wc open`
if [ $port_count -eq 1 ];then
   action "$url $port 是通畅的" /bin/true
else
   action "$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 ;then
   action "地址:$dst 端口:$port is ok" /bin/true
else
   action "地址:$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 ];then
  echo "$url is ok"
else
  echo "$url is failed"
fi
}

main() {
  check_url
  url_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
do
     echo $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}
do
   echo $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
10

i=1 变量i初始化是1.
i<=10 i的值小于等于10的时候运行循环语句。(条件)
每次循环后执行i++  i=i+1

1.执行循环
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}
do
  filename_suiji=`mkpasswd -l 10 -s 0`
  filename_full=${filename_suiji}_oldboy.html
  cd $dir
  touch $filename_full

done

[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
  • 生成随机字符
uuidgen
 
mkpasswd  -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/urandom

date +%N |md5sum 
%N纳秒

echo $RANDOM   0-32767

echo $((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 ]
do
  echo $i
  let 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+i
  let i++
done
#3.结果
echo $sum

[root@m01 devops-shell]# sh 27-while_sum.sh 
5050
  • 可以写更多的方法
    • for循环
    • awk写法

3)while循环-死循环

  • 含义:一直循环,直到用户手动中止或满足指定条件后退出。
  • 应用场景:
    • 一般与用户交互的时候或脚本在系统后台持续运行
while true
do
    echo 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 :
do
  read -p "请输入你猜测的数字:" num
  #检查输入是否为数字-待增加
  [[ "$num" =~ ^[0-9]+$ ]] || {
    echo "请输入数字"
    #exit 1
    continue #结束本次循环,进入下次循环
  }
  #判断输入的数字与目标
  if [ $num -eq $guess_num ];then
    echo "恭喜您猜对了"
    exit 1
  fi
  if [ $num -gt $guess_num ];then
    echo "数字过大,请换一个更小的数字"
  else
    echo "数字过小,请换一个更大的数字"
  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 ];then
    echo "您超越了99.99%的人"
  elif [ $i -ge 4 -a $i -le 6 ];then
    echo "您超越了80%的人"
  else
    echo "您超越了70%的人"
  fi
  }
#2.while循环
while :
do
  read -p "请输入你猜测的数字:" num
  let i++
  #检查输入是否为数字-待增加
  [[ "$num" =~ ^[0-9]+$ ]] || {
    echo "请输入数字"
    #exit 1
    continue #结束本次循环,进入下次循环
  }
  #判断输入的数字与目标
  if [ $num -eq $guess_num ];then
    echo "恭喜您猜对了"
    echo "您一共猜测了:$i次"
    check_percent
    exit 0
  fi
  if [ $num -gt $guess_num ];then
    echo "数字过大,请换一个更小的数字"
  else
    echo "数字过小,请换一个更大的数字"
  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
do
   cmd
    echo $line
done

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

while循环处理。
cat FILE|while read line
do
   cmd
   echo $line
done

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

while read line
do
   cmd
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.txt

while read line
do
  #echo $line
  let sum=sum+$line
  let i++

done <$file

echo "这个文件一共有$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
do
     echo $ip
     let i++
done
echo "次数 $i"
#02
echo "方法3:while + 输入"
while read ipaddr
do
     echo $ipaddr
     let 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
do
  ip_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 ];then
    iptables -t filter -I INPUT -s $ip_addr -j DROP
  fi
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
10

for 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 ];then
         echo "请输入数字,不要输入其他$num"
         continue
     else
         echo "失败次数过多,游戏结束"
         exit 1
     fi
   }
}

修改后脚本

4)了解

  • break n 结束多少层循环
  • continue n 结束当前循环,并从第几层运行
for i in {1..5}
do
    for j in {a..c}
    do
        echo $i $j
    done
done

for i in {1..5}
do
    for j in {a..c}
    do
       [ $j = b ] || continue 
        echo $i $j
     done
done

for i in {1..5}
do
    for j in {a..c}
    do
       [ $j = b ] && continue  2
        echo $i $j
    done
done

for i in {1..5}
do
    for j in {a..c}
    do
       [ $j = b ] && break
        echo $i $j
    done
done

for i in {1..5}
do
    for j in {a..c}
    do
       [ $j = b ] && break 2
        echo $i $j
    done
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 ]
   then
       greenecho $1 命令执行成功
   else
       redecho  $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.sh

redecho 网站挂了

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.sh

redecho 网站挂了

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 dialog

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

在这里插入图片描述

13.3 小结

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

  • 47
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值