Ego 说:“这些 Shell 脚本是为了检验 Linux 学习成果而编写的。当然,这些脚本本身就很实用,如果有您需要的,请放心复制粘贴。”
检测局域网的已启动主机
IP嗅探,父子Shell通信,多进程并发
#!/bin/bash
### ###
# ip-sniffer.sh #
### ###
trap 'rm -f "$TMPFILE"' EXIT
export TMPFILE=$(mktemp) || exit 1
PREFIX_PART='192.168.0'
count=0
function fn() {
ping -c 2 -i 0.3 -W 1 $1 &>/dev/null && echo "1" >> $TMPFILE && echo "$1 is up"
}
for i in {1..254}; do
ip="$PREFIX_PART.$i"
# 以 & 结尾表示另起一个 Shell 进程来执行该行
fn $ip &
done
wait
# 这里不使用管道符的方式向 read 命令传递文件数据,否则会导致 read 命令在子 Shell 中执行
while read line; do
let "count = count + 1"
done < $TMPFILE
echo "Total: $count"
exit 0
下载合并 JS 依赖的主体和必要模块(以 dayjs 为例)
文件下载,文件合并,文档生成
#!/bin/bash
### ###
# download-concat.sh #
### ###
PROJECT_BASE="https://cdn.staticfile.net"
PROJECT_NAME="dayjs"
PROJECT_VERSION="1.11.10"
PROJECT_OUTPUT="/tmp/dayjs.js"
declare -a PROJECT_FILES=("dayjs.min.js" "locale/es-us.js" "locale/zh-cn.js")
if [ ! -e "$PROJECT_OUTPUT" ]; then
touch "$PROJECT_OUTPUT"
fi
cat << __EOF__ > "$PROJECT_OUTPUT"
/**
* DIY dayjs and make it support locale en-us and zh-cn:
*
* dayjs.locale('en-us')
* dayjs.locale('zh-cn')
*/
__EOF__
function download() {
local url="$PROJECT_BASE/$PROJECT_NAME/$PROJECT_VERSION/$1"
echo "Downloading $url ..."
curl -sL "$url" >> "$PROJECT_OUTPUT"
echo -e "\n" >> "$PROJECT_OUTPUT"
}
for file in "${PROJECT_FILES[@]}"; do
download "$file"
done
echo "The result file is put in $PROJECT_OUTPUT"
exit 0
监听网卡的实时流量
流量监测,浮点计算,颜色标注
#!/bin/bash
### ###
# download-concat.sh #
### ###
declare -A network_names=$(ls /sys/class/net/ | grep -v lo)
declare -A results
declare -A last_in_results
declare -A last_ot_results
declare -A curr_in_results
declare -A curr_ot_results
declare in_data
declare ot_data
declare in_data_pattern
declare out_data_pattern
declare formatted_in_data
declare formatted_ot_data
for network_name in $network_names; do
results[$network_name]=$(cat /proc/net/dev | grep $network_name | awk '{print $2,$10}')
last_in_results[$network_name]=$(eval echo \${results[${network_name}]} | cut -d ' ' -f 1)
last_ot_results[$network_name]=$(eval echo \${results[${network_name}]} | cut -d ' ' -f 2)
done
while true; do
clear
echo -e "网卡名称 流入↓ 流出↑"
for network_name in $network_names; do
results[$network_name]=$(cat /proc/net/dev | grep $network_name | awk '{print $2,$10}')
curr_in_results[$network_name]=$(eval echo \${results[$network_name]} | cut -d ' ' -f 1)
curr_ot_results[$network_name]=$(eval echo \${results[$network_name]} | cut -d ' ' -f 2)
in_data=$(echo "scale=2; (${curr_in_results[$network_name]} - ${last_in_results[$network_name]}) / 1024" | bc)
ot_data=$(echo "scale=2; (${curr_ot_results[$network_name]} - ${last_ot_results[$network_name]}) / 1024" | bc)
in_data_int=$(echo "$in_data / 1" | bc)
ot_data_int=$(echo "$ot_data / 1" | bc)
in_data_pattern="\033[32m%.1f%s\033[0m"
ot_data_pattern="\033[32m%.1f%s\033[0m"
if [ $in_data_int -lt 1 ]; then
in_data_pattern="\033[31m%.1f%s\033[0m"
fi
if [ $ot_data_int -lt 1 ]; then
ot_data_pattern="\033[31m%.1f%s\033[0m"
fi
formatted_in_data=$(printf $in_data_pattern $in_data "KB/s")
formatted_ot_data=$(printf $ot_data_pattern $ot_data "KB/s")
echo -e "$network_name $formatted_in_data $formatted_ot_data"
done
sleep 1
for network_name in $network_names; do
last_in_results[$network_name]=${curr_in_results[$network_name]}
last_ot_results[$network_name]=${curr_ot_results[$network_name]}
done
done
exit 0