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)ՎՎʢ |
web | http请求 | 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次
- 生成随机字符保存
- 创建文件+随机字符
- 循环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 | 大部分使用 数组循环 |
while | while 条件 ;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了解即可