一、这节课掌握如下几个知识点
【1】分享shell编程中的一些小技巧、以及一些巧妙的使用方法。
【2】通过该次分享能在使用过程避免一些坑。
二、代码讲解
本节主要讲解在shell中涉及的加减乘除、时间等相关运算。
#!/bin/bash
#10.sh v1
PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
export LANG=zh_CN.UTF-8
export PATH
#1.随机数的获取,随机小数、随机数字、随机字符串
#随机小数,使用场景:需要进行随机延迟处理的情况
rds=$(echo "0.`tr -dc 0-9 </dev/urandom |head -c 3`")
echo $rds
#随机数字范围,使用场景:用于取随机小时或分,然后任务在指定的小时或分钟去执行
function rand(){
min=$1
max=$(($2-$min+1))
num=$(($RANDOM+$RANDOM))
echo $(($num%$max+$min))
}
sss=$(rand 0 60)
dd=$(date +%M)
if [[ 10#$dd -eq $sss ]];then
echo "run"
fi
#取20位数字 使用场景:随机生成密码
head /dev/urandom | tr -dc 0-9 | head -c 20
#取20位包含数字、大小写的字符串,使用场景:随机生成密码
head /dev/urandom | tr -dc A-Za-z0-9 | head -c 20
#2.IP的获取和正则匹配
Ip=$(ifconfig | awk '/inet /{sub(/addr:/,"",$2);print $2}'|grep -v "127.0.0.1")
echo $Ip|grep -P '^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'
#3.编码转换处理,使用场景:将utf-8编码的文件转成gbk编码,反之亦可,适用在Linux终端是gbk编码需要处理utf8编码下的中文字符
iconv -f UTF-8 -t GBK file1 >file2
iconv -f GBK -t UTF-8 file1 >file2
#4.将windows下编写的脚本放到linux运行时需要执行此命令转成linux格式的文件。
dos2unix test.sh
#5.curl使用,使用场景:在使用curl的情况下加上超时可以避免curl进程被长期挂住的情况,加上-s参数可以不打印文件下载的过程
curl -s --connect-timeout 5 --max-time 10
-s:静默模式
--connect-timeout:连接超时
--max-time:最大下载时间
#6.wget使用
/usr/bin/wget -N -c -t 3 -T 60 -P
-N:表示文件有更新就进行下载
-c:用于断点续传
-t : 重试3次
-T:超时60秒
-P:下载之后存放的目录
#7.EOF处理大段字符输出,或者用于注释脚本
cat >> /etc/xx.conf <<"EOF"
/etc/
/data/PRG/*/etc
/data/PRG/*/conf
/data/PRG/*/config
/var/
/var/spool/cron/
/usr/local/etc/
/usr/etc/
EOF
#可用于注释一段shell代码
:<<EOF
echo "yes"
echo "yes"
EOF
#8.脚本执行的唯一性,使用场景:防止脚本同时执行
if [ -s /tmp/.run.tag ];then
lastrunt=$(head -1 /tmp/.run.tag)
ttimes=$(( ${Timestamp:0:10} - $lastrunt ))
if [[ 10#$ttimes -ge 180 ]] || [[ 10#$ttimes -lt 0 ]];then #避免进程意外退出导致tag标签遗留
rm -f /tmp/.run.tag
fi
echo "`date +"%Y-%m-%dT%H:%M:%S"` [ERROR] task already run" >>$logfile 2>&1
exit 0
fi
echo "${Timestamp:0:10}" >/tmp/.run.tag
#9.获取脚本执行的路径,使用场景:可以增加脚本的通用型,将脚本放于任何目录都可以执行。
ROOT=$(cd "$(dirname "$0")"; pwd) #获取脚本所在路径
#10.掌握find,xargs、vim、iptables等重要命令,处理任务起来半功倍。
#11.jq命令,使用场景:在Linux 终端解析json字符串的最佳命令
#12.命令执行超时,高版本Linux系统会有timeout命令,低版本系统只能通过脚本实现。为了避免某个操作出现异常时不被长期挂起,需要在执行的命令前面加上超时。
function TimeOut() {
waitsec=10
( $* ) & pid=$!
( sleep $waitsec && kill -HUP $pid ) 2>/dev/null & watchdog=$!
if wait $pid 2>/dev/null; then
pkill -HUP -P $watchdog
wait $watchdog
fi
}
#13.shell中的进制,在shell中遇到 0开头的数字,默认会以八进制来计算,也就是说到8时就会溢出,正确用法是在变量前用10#。
dd=$(date +%M)
if (( 10#$dd % 2 == 0 ));then
echo "run"
fi
#14.while 循环中,通过管道符传入数据的循环中定义的变量的作用域只限于循环内。
cat 4.example.txt|while read ip name
do
total=$[total+1]
echo "$ip $name"
done
echo "all:$total"
#解决方法:done < 4.example.txt
15.在执行ping检测时,为了方便记录ping的检测结果,在ping的结果上加时间戳
ping 192.168.239.43 | awk '{ print $0"\t" strftime("%H:%M:%S",systime()) }' >> ping.log &