一篮子高效 Shell 脚本

116 阅读1分钟

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