--作者:飞翔的小胖猪

--创建时间:2021年2月16日

--修改时间:2021年2月20日

说明

每日上传更新一个shell脚本,周期为60天。如有需求的读者可根据自己实际情况选用合适的脚本,也可在评论区留言提出脚本需求,作者会尽快根据需求编写相关脚本对功能进行实现。

每篇文章包含5个脚本。

总进度:5/12

上一篇脚本链接:https://www.cnblogs.com/Pigs-Will-Fly/p/14399775.html

下一篇脚本链接:https://www.cnblogs.com/Pigs-Will-Fly/p/14415847.html

主要内容

21年2月16日-mysql连接脚本

************************************************************************************************************************************************************************************************************************************

脚本说明

mysql连接脚本,在脚本中键入指定的sql执行。好像没有实质性的用处。

文件说明

Mysql_driver.sh:脚本主体文件

脚本主体

[root@135 21_Mysql_driver]# cat Mysql_driver.sh
#!/bin/bash
#定义变量数据相关参数,其他的函数需要使用时直接从这里获取。
connect_db(){
IP=${IP:-127.0.0.1}
PORT=${PORT:-3306}
USERNAME=${USERNAME:-test21}
PASSWORD=${PASSWORD:-123456}
DBNAME=${DBNAME:-test_db}
echo -e "DB connection parameters>> \n HOSTNAME: $IP \n PORT: $PORT \n USERNAME: $USERNAME \n PASSWORD: $PASSWORD \n DB_NAME: $DBNAME"
} #测试数据库是否能够连接。
test_connection_status(){
mysql -h${IP} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e"show tables;" &>/dev/null
return $?
} #执行语句函数
edit_data(){
sql_language=${1:- }
echo "sql执行语言为:$sql_language "
mysql -h${IP} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e"${sql_language};"
if [ $? -eq 0 ];then
echo "Command executed successfully。"
else
echo "Command execution failed!"
fi
} #主函数
main(){
#输入数据连接参数
IP="127.0.0.1"
PORT="3306"
USERNAME="test21"
PASSWORD="123456"
DBNAME="test_db" #需要执行的sql语句,通过执行时传入,如果为传入则查看所有的表名
sql_l='select * from t1;' connect_db
test_connection_status
sql_l_f=`echo "${sql_l} commit;"` if test_connection_status;then
echo "数据库连接成功,可以执行命令。"
edit_data "${sql_l_f}"
else
echo -e "数据库连接失败!!!\nCase:\n 1.请检查连接参数是否正确。\n 2.数据库连接设置是否正确。"
fi
} main

结果

**************************************************************************************************************2021年2月16日脚本结束*****************************************************************************************************************

21年2月17日-显示love脚本

************************************************************************************************************************************************************************************************************************************

脚本说明

循环显示 i love字母。

文件说明

display_love.sh:脚本主体文件

脚本主体

[root@135 22_i_love_you]# cat display_love.sh
#!/bin/bash
trap 'onCtrlC' INT
# 显示LOVE
love1(){
echo ""
echo " #### "
echo " ## "
echo " ## "
echo " ## "
echo " ## "
echo " ## "
echo " ## "
echo " ## "
echo " ## "
echo " #### "
} love2(){
echo ""
echo "## "
echo "## "
echo "## "
echo "## "
echo "## "
echo "## "
echo "## "
echo "## "
echo "#########"
echo "######## "
} love3(){
echo ""
echo " ###### "
echo " ######## "
echo " ### ### "
echo " ### ### "
echo " ### ### "
echo " ### ### "
echo " ### ### "
echo " ### ### "
echo " ######## "
echo " ###### "
} love4(){
echo ""
echo "## ##"
echo "## ##"
echo "## ##"
echo " ## ## "
echo " ## ## "
echo " ## ## "
echo " ## ## "
echo " ## ## "
echo " ### "
echo " # "
} love5(){
echo ""
echo " #############"
echo " ############"
echo " ##"
echo " ##"
echo " ###########"
echo " ###########"
echo " ##"
echo " ##"
echo " ###########"
echo " #############"
} display_love(){
clear
while :
do
for i in {1..5}
do
love${i}
love${i} > love${i}
sleep 0.5
clear
done
sleep 0.7
paste love1 love2 love3 love4 love5
sleep 2
rm -rf love1 love2 love3 love4 love5
clear
done
} #捕获ctrl+c执行删除临时文件。
onCtrlC(){
rm -rf love1 love2 love3 love4 love5 &>/dev/null
exit 99
} display_love

结果

**************************************************************************************************************2021年2月17日脚本结束*****************************************************************************************************************

21年2月18日-echo显示hello word

************************************************************************************************************************************************************************************************************************************

脚本说明

使用echo的定位符来回显示“hello,word!”这句话。

文件说明

advanced_echo.sh:脚本主体文件

脚本主体

[root@135 23_advanced_echo]# cat advanced_echo.sh
#!/bin/bash
clear
hello=("H" "e" "l" "l" "o" "," "W" "o" "r" "d" "!")
arr_len=${#hello[*]}
while :
do
for((i=0;i<$arr_len;i++))
do
let j=$i+3
echo -e "\033[5;${j}H${hello[i]}"
sleep 0.2
done
clear
for((i=$arr_len;i>=0;i--))
do
let j=$i+3
echo -e "\033[5;${j}H${hello[i]}"
sleep 0.2
done
clear
done

结果

**************************************************************************************************************2021年2月18日脚本结束*****************************************************************************************************************

21年2月19日-系统网络接口流量脚本

************************************************************************************************************************************************************************************************************************************

脚本说明

脚本提取/proc/net/dev文件内容计算出系统中网卡流量信息,接口数据流量大小,错误包个数等。

文件说明

net_info.sh:脚本主体文件

脚本主体

[root@135 24_net_info]# cat net_info.sh
#!/bin/bash
#网络流量信息
#通过两次读取/proc/net/dev文件,间隔一秒,导出1秒的网卡流量数据。
net_info(){
echo -e "-------------Net------------\n" #获取网口名
net_dict=`awk '$1!~/lo/{if(NR>2)print $1}' /proc/net/dev|sed 's/\://g'` #截取两个数据间隔时间为1秒
net_info_old=`awk '$1!~/lo/{if(NR>2)print}' /proc/net/dev`
#设置文件提取信息间隔为1秒
sleep 1
net_info_new=`awk '$1!~/lo/{if(NR>2)print}' /proc/net/dev` echo -e "New: \n$net_info_new\n"
echo -e "Old: \n$net_info_old\n" echo "$net_dict"| while read dev_name
do
rx_old=`echo "$net_info_old"|grep $dev_name|awk '{printf $2}'`
rx_new=`echo "$net_info_new"|grep $dev_name|awk '{printf $2}'`
rx_old_p=`echo "$net_info_old"|grep $dev_name|awk '{printf $3}'`
rx_new_p=`echo "$net_info_new"|grep $dev_name|awk '{printf $3}'`
rx_old_e=`echo "$net_info_old"|grep $dev_name|awk '{printf $4}'`
rx_new_e=`echo "$net_info_new"|grep $dev_name|awk '{printf $4}'` tx_old=`echo "$net_info_old"|grep $dev_name|awk '{printf $10}'`
tx_new=`echo "$net_info_new"|grep $dev_name|awk '{printf $10}'`
tx_old_p=`echo "$net_info_old"|grep $dev_name|awk '{printf $11}'`
tx_new_p=`echo "$net_info_new"|grep $dev_name|awk '{printf $11}'`
tx_old_e=`echo "$net_info_old"|grep $dev_name|awk '{printf $13}'`
tx_new_e=`echo "$net_info_new"|grep $dev_name|awk '{printf $13}'` rx=$((${rx_new}-${rx_old}))
rx_p=$((${rx_new_p}-${rx_old_p}))
rx_e=$((${rx_old_e}-${rx_new_e})) tx=$((${tx_new}-${tx_old}))
tx_p=$((${tx_new_p}-${tx_old_p}))
tx_e=$((${tx_old_e}-${tx_new_e})) #echo "$rx"
#echo "$rx_p"
echo -e "Net_name: $dev_name"
echo -e " 收流量/B: $rx\n 收包数/个: $rx_p\n 收错误包/个: $rx_e\n 发流量/B: $tx\n 发包数/个: $tx_p\n 发包错误数/个: $tx_e\n" done } main(){
net_info
} main

结果

**************************************************************************************************************2021年2月19日脚本结束*****************************************************************************************************************

21年2月20日-系统监控脚本(详细版)

************************************************************************************************************************************************************************************************************************************

脚本说明

脚本通过8个函数获取当前操作系统的性能数据,包括cpu、内存、磁盘io、网络流量、进程信息、端口及打开文件限制、系统基本信息、文件md5值比对。

脚本只对使用比较广泛的数据进行采集,如果需要更详细的数据各位看官可在对应的函数中进行代码增减。

文件说明

performance_info.sh:脚本主体文件

脚本主体

[root@135 25_cpu_info]# cat performance_info.sh
#!/bin/bash
#cpu信息
cpu_info(){
Cpu_Num=`nproc` #获取逻辑CPU的个数
Avage_five_cpu=`uptime | sed 's/.*load average: //g' | sed 's#\,##g'|awk '{print $2}'` #采集5分钟CPU负载情况
let Used_rate_cpu=100-`vmstat 1 2 |awk '{if(NR>3){printf $(NF-2) }}'` #cpu使用率
CPU_queue_depth=`vmstat 1 2 |awk '{if(NR>3){printf $1}}'` #cpu队列深度 #cpu信息总输出
echo -e "-------------CPU------------\n"
echo -e "Cpu_num: ${Cpu_Num:-null}\nCpu five avage: ${Avage_five_cpu:-null}\nCPU_rate: ${Used_rate_cpu:-null}\nCPU_queue: ${CPU_queue_depth:-null}\n"
} #内存信息
mem_info(){
all_mem_info=`awk '/^MemTotal|^MemFree|^SwapTotal|^SwapFree|^Buffers|^Cached/{print}' /proc/meminfo` total_mem=`echo "$all_mem_info"|awk '/MemTotal/{printf ("%d\n",$2/1024)}'`
free_mem=`echo "$all_mem_info"|awk '/MemFree/{printf ("%d\n",$2/1024)}'`
total_swap=`echo "$all_mem_info"|awk '/SwapTotal/{printf ("%d\n",$2/1024)}'`
free_swap=`echo "$all_mem_info"|awk '/SwapFree/{printf ("%d\n",$2/1024)}'`
buffer=`echo "$all_mem_info"|awk '/Buffers/{printf ("%d\n",$2/1024)}'`
cached=`echo "$all_mem_info"|awk '/Cached/{printf ("%d\n",$2/1024)}'`
swappiness=`cat /proc/sys/vm/swappiness ` #内存信息总输出
echo -e "-------------Mem------------\n"
echo -e "Swappiness: ${swappiness:-null}"
echo -e "Total_Mem: ${total_mem:-null}MB\nFree_mem: ${free_mem:-null}MB\nTotal_swap: ${total_swap:-null}MB\nFree_mem: ${free_swap:-null}MB\nBuffers: ${buffer:-null}MB\nCached: ${cached:-null}MB\n"
} #磁盘IO信息
io_info(){
#不适用于rhel8以上的版本
disk_num=`iostat -dxy 1 1 |awk '$1~/[svx]d[a-z]$/'|wc -l`
io_info=`iostat -dxy 1 1 |awk '$1~/[svx]d[a-z]$/'` #echo "$io_info" |while read dev_name r_s w_s rkB_s wkB_s rrqm_s wrqm_s rrqm wrqm r_await w_await aqu_sz rareq_sz wareq_sz svctm util
echo -e "-------------I/O------------\n"
echo "$io_info" |while read dev_name line
do
echo -e "Dev_name: $dev_name"
iops=`echo "$line" | awk '{printf ("%f\n",$1+$2)}'`
rbps=`echo "$line" | awk '{printf ("%f\n",$3/1024)}'`
wbps=`echo "$line" | awk '{printf ("%f\n",$4/1024)}'`
rwbps=`echo "$line" | awk '{printf ("%f\n",($3+$4)/1024)}'`
util=`echo "$line" | awk '{printf ("%f\n",$NF)}'` #磁盘信息总输出
echo -e " iops: $iops\n r/bps: $rbps\n r/bps: $wbps\n 吞吐量: $rwbps\n 响应时间: ${util}\n"
done
} #网络流量信息
net_info(){
echo -e "-------------Net------------\n" #获取网口名
net_dict=`awk '$1!~/lo/{if(NR>2)print $1}' /proc/net/dev|sed 's/\://g'` #截取两个数据间隔时间为1秒
net_info_old=`awk '$1!~/lo/{if(NR>2)print}' /proc/net/dev`
sleep 2
net_info_new=`awk '$1!~/lo/{if(NR>2)print}' /proc/net/dev` echo -e "New: \n$net_info_new"
echo -e "Old: \n$net_info_old" echo "$net_dict"| while read dev_name
do
rx_old=`echo "$net_info_old"|grep $dev_name|awk '{printf $2}'`
rx_new=`echo "$net_info_new"|grep $dev_name|awk '{printf $2}'`
rx_old_p=`echo "$net_info_old"|grep $dev_name|awk '{printf $3}'`
rx_new_p=`echo "$net_info_new"|grep $dev_name|awk '{printf $3}'`
rx_old_e=`echo "$net_info_old"|grep $dev_name|awk '{printf $4}'`
rx_new_e=`echo "$net_info_new"|grep $dev_name|awk '{printf $4}'` tx_old=`echo "$net_info_old"|grep $dev_name|awk '{printf $10}'`
tx_new=`echo "$net_info_new"|grep $dev_name|awk '{printf $10}'`
tx_old_p=`echo "$net_info_old"|grep $dev_name|awk '{printf $11}'`
tx_new_p=`echo "$net_info_new"|grep $dev_name|awk '{printf $11}'`
tx_old_e=`echo "$net_info_old"|grep $dev_name|awk '{printf $13}'`
tx_new_e=`echo "$net_info_new"|grep $dev_name|awk '{printf $13}'` rx=$((${rx_new}-${rx_old}))
rx_p=$((${rx_new_p}-${rx_old_p}))
rx_e=$((${rx_old_e}-${rx_new_e})) tx=$((${tx_new}-${tx_old}))
tx_p=$((${tx_new_p}-${tx_old_p}))
tx_e=$((${tx_old_e}-${tx_new_e})) #echo "$rx"
#echo "$rx_p"
echo -e "Net_name: $dev_name"
echo -e " RX: $rx\n RX_P: $rx_p\n RX_E: $rx_e\n TX: $tx\n TX_P: $tx_p\n TX_E: $tx_e\n"
done
} #进程信息
process_info(){
echo -e "----------------------------------------------Process---------------------------------------------\n"
top_head=`ps aux|head -1` #cpu占用top5
top_cpu=`ps aux|grep -v PID|sort -rn -k +3|head` #内存占用top5
top_mem=`ps aux|grep -v PID|sort -rn -k +4|head` #业务进程传参
yw_p_name="sshd"
yw_p_num=`ps -ef | grep -i ${yw_p_name:- } | grep -v grep|wc -l` #僵尸进程
zombie_num=`ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'|wc -l` #打开进程数
process_num=`ps -aux | wc -l` #最大允许进程数
limit_total_p_n=`ulimit -u` #程序相关总输出
echo -e "$yw_p_name进程数量: ${yw_p_num:-null}\n僵尸进程数量: ${zombie_num:-null}\n运行进程数量: $((${process_num:-null}-1))\n当前用户允许进程数: ${limit_total_p_n:-null}\n"
echo -e "$top_head\nCpu---------------\n$top_cpu\n\nMem------------------\n$top_mem\n" } #端口及文件
port_file_limit(){
echo -e "-------------Port && File------------\n"
#端口数分别统计ipv4和ipv6
port_4_n=`netstat -alntup | grep -v -E '^tcp6|^udp6' |egrep -i '^tcp|^udp|^TCP|^UDP'| wc -l`
port_6_n=`netstat -alntup | grep -E '^tcp6|^udp6' | wc -l` #监听端口
list_port_n=`netstat -ntlpu | egrep -i '^tcp|^udp|^TCP|^UDP'|wc -l` #总端口数
total_n=`netstat -alntup| egrep -i '^tcp|^udp|^TCP|^UDP'|wc -l` #打开文件总数
open_f_num=`lsof | wc -l` #允许打开文件数
limit_total_f_n=`cat /proc/sys/fs/file-max` echo -e "ipv4端口: ${port_4_n:-null}\nipv6端口: ${port_6_n:-null} \n监听端口: ${list_port_n:-null}\n总打开端口数: ${total_n:-null}\n允许最大端口数: 65535\n打开文件总数: ${open_f_num:-null}\n允许打开文件数: ${limit_total_f_n:-null}"
} #系统及基本信息
system_info(){
if cat /proc/version|grep -i centos &>/dev/null;then
system_version='Centos'
elif cat /proc/version|grep -i redhat &>/dev/null;then
system_version='Red hat'
elif cat /proc/version|grep -i debian &>/dev/null;then
system_version='Debian'
elif cat /proc/version|grep -i Ubuntu &>/dev/null;then
system_version='Ubuntu'
elif cat /proc/version|grep -i suse &>/dev/null;then
system_version='Suse'
else
echo "This system Manufacturer : unknown"
fi machine_name=`hostname`
line_n=`w |awk 'NR>2{print $1}'|wc -l `
login_user=`w |awk 'NR>2{print $1}' |sort -r -n |uniq`
ip_address=`ip a|grep -i -A2 'MULTICAST,UP,LOWER_UP' | grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" |grep -E -v "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.255" | head -1 `
System_start_time=`uptime | awk '{print $1}'` #得开机时间
System_uptime=`uptime |awk -F ',' '{print $1}' |sed 's#.*up##g'` #得到运行时常 #系统信息总输出
echo -e "-------------System------------\n"
echo -e "开机时间: ${System_start_time:-null}"
echo -e "运行时间: ${System_uptime:-null}"
echo -e "系统厂商: ${system_version:-null}\n主 机 名: ${machine_name:-null}\nIp 地 址: ${ip_address:-null}\n登录用户: ${login_user:-$USER}\n在线用户数: ${line_n:-null}\n"
} #检测关键文件md5值
Check_file_md5(){
echo -e "-------------File_sum------------\n时间: `date`\n"
#读取文件路径生成MD5保存到临时文件中
first_ctl=0
for file_name in /etc/passwd /etc/group /etc/shadow
do
if [ -f .history_sum.txt ];then
#如果first_ctl变量为1表示为第一次获取md5值
if [ ${first_ctl} -eq 1 ];then
md5sum $file_name >> .history_sum.txt
fi #对比md5值
new_sum=`md5sum $file_name|awk '{printf $1}'`
old_sum=`cat .history_sum.txt |grep ${file_name}|awk '{printf $1}'`
if [ "${new_sum}" == "${old_sum}" ];then
#echo "`date` Check ${file_name} not changed." >> /var/log/message
echo "Check ${file_name} not changed."
else
#echo "`date` Check ${file_name} changed!!!" >> /var/log/message
echo "Check ${file_name} changed!!!"
fi else
#地没有历史文件,创建一个并且把控制变量置1
first_ctl=1
md5sum $file_name >> .history_sum.txt
#echo "`date` Check ${file_name} not changed." >> /var/log/message
echo "Check ${file_name} not changed."
fi
done
echo ""
} main(){
cpu_info
mem_info
io_info
net_info
process_info
port_file_limit
system_info
Check_file_md5
} main

结果

**************************************************************************************************************2021年2月20日脚本结束*****************************************************************************************************************

60天shell脚本计划-5/12-渐入佳境的更多相关文章

  1. 60天shell脚本计划-12/12-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年3月23日 --修改时间:2021年3月27日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可 ...

  2. 60天shell脚本计划-8/12-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年3月3日 --修改时间:2021年3月7日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可在评 ...

  3. 60天shell脚本计划-11/12-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年3月18日 --修改时间:2021年3月22日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可 ...

  4. 60天shell脚本计划-10/12-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年3月13日 --修改时间:2021年3月17日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可 ...

  5. 60天shell脚本计划-9/12-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年3月8日 --修改时间:2021年3月12日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可在 ...

  6. 60天shell脚本计划-7/12-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年2月26日 --修改时间:2021年3月2日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可在 ...

  7. 60天shell脚本计划-6/12-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年2月21日 --修改时间:2021年2月25日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可 ...

  8. 60天shell脚本计划-4/12-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年2月11日 --修改时间:2021年2月15日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可 ...

  9. 60天shell脚本计划-3/12-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年2月6日 --修改时间:2021年2月10日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可在 ...

随机推荐

  1. How to check in Windows if you are using UEFI

    You might be wondering if Windows is using UEFI or the legacy BIOS, it's easy to check. Just fire up ...

  2. Arduino+ESP32 之 SD卡读写

    背景知识: ESP32有两种使用SD卡的方法,一种是使用SPI接口访问SD卡,另一种是使用SDMMC接口访问SD卡 . Arduino core for the ESP32中SPI方式占用4个IO口, ...

  3. python 小兵(6)函数根据问题详解

    _list = []for i in range(3): def func(a): return i+a_list.append(func)for f in _list: print(f(1)) 首先 ...

  4. ApacheCN Golang 译文集 20211025 更新

    Go 云原生编程 零.前言 一.现代微服务架构 二.使用 RESTAPI 构建微服务 三.保护微服务 四.使用消息队列的异步微服务架构 五.使用 React 构建前端 六.在容器中部署应用 七.AWS ...

  5. HOW2J 全套教程整理:Java、前端、数据库、中间件、第三方、项目、面试题

    考虑到部分同学寝室会断网,原站的所有的免费内容都提供了一个离线版本以供使用.但是它直接提供了静态页面,并不方便在手机上阅读,因为我将其转换为 EPUB. 目录 HOW2J J2EE 教程.epub H ...

  6. Matplotlib 3.0 秘籍·翻译完成

    原文:Matplotlib 3.0 Cookbook 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. 在线阅读 ApacheCN 面试求职交 ...

  7. 最大公因数与最小公倍数-gcd&lcm

    一.一些性质 \(gcd(a,b)=gcd(b,a)\) \(gcd(-a,b)=gcd(a,b)\) \(gcd(a,a)=|a|, gcd(a,0)=|a|\) \(gcd(a,1)=1\) \( ...

  8. git命令log与reflog的比较

    感谢原文作者:杨鲜生 原文链接:https://blog.csdn.net/u013252047/article/details/80230781 用git命令,想看到自己的操作记录,则可以使用log ...

  9. bom-倒计时

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. homestead 入坑安装

    1.在使用 Homestead 之前,需要先安装 Virtual Box.VMWare.Parallels 或 Hyper-V (四选一,我们通常选择 VirtualBox,因为只有它是免费的)以及  ...