展示系统信息
#!/bin/bash
# 系统信息查看脚本 (函数式版本)
# 适用平台: Linux / macOS (部分命令需根据系统调整)
# 颜色定义 (可选,使输出更美观)
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 分隔线
print_separator() {
echo "=============================="
}
# 打印标题
print_title() {
echo -e "\n${BLUE}[$1]${NC}"
}
# 获取操作系统类型
get_os() {
echo "$(uname -s)"
}
# 1. 操作系统信息
show_os_info() {
print_title "操作系统"
OS=$(get_os)
echo "系统内核: $OS"
if [ -f /etc/os-release ]; then
. /etc/os-release
echo "发行版: $NAME $VERSION"
elif command -v sw_vers &>/dev/null; then
echo "macOS: $(sw_vers -productVersion)"
fi
}
# 2. 主机信息
show_host_info() {
print_title "主机信息"
echo "主机名: $(hostname)"
echo "内核版本: $(uname -r)"
echo "系统架构: $(uname -m)"
}
# 3. 运行时间与负载
show_uptime() {
print_title "运行时间与负载"
uptime_info=$(uptime)
echo "$uptime_info"
}
# 4. CPU 信息
show_cpu_info() {
print_title "CPU 信息"
OS=$(get_os)
if [ "$OS" = "Linux" ]; then
lscpu | grep "Model name" | sed 's/Model name:[[:space:]]*//'
echo "物理核心数: $(nproc --all)"
elif [ "$OS" = "Darwin" ]; then
sysctl -n machdep.cpu.brand_string
echo "总核心数: $(sysctl -n hw.ncpu)"
fi
}
# 5. 内存使用情况
show_memory_info() {
print_title "内存使用"
OS=$(get_os)
if [ "$OS" = "Linux" ]; then
free -h | awk 'NR==1{print $0} NR==2{print $0}'
elif [ "$OS" = "Darwin" ]; then
vm_stat | perl -ne '/page size of (\d+)/ and $size=$1; /Pages free:\s+(\d+)/ and printf "Free: %.2f GB\n", $1*$size/1073741824; /Pages active:\s+(\d+)/ and printf "Active: %.2f GB\n", $1*$size/1073741824; /Pages inactive:\s+(\d+)/ and printf "Inactive: %.2f GB\n", $1*$size/1073741824; /Pages speculative:\s+(\d+)/ and printf "Speculative: %.2f GB\n", $1*$size/1073741824; /Pages wired down:\s+(\d+)/ and printf "Wired: %.2f GB\n", $1*$size/1073741824;'
echo "总物理内存: $(sysctl -n hw.memsize | awk '{printf "%.2f GB\n", $1/1073741824}')"
fi
}
# 6. 磁盘使用情况
show_disk_info() {
print_title "磁盘使用 (根目录)"
df -h / | awk 'NR==1{print $0} NR==2{print $0}'
}
# 7. 网络信息
show_network_info() {
print_title "网络信息"
OS=$(get_os)
if [ "$OS" = "Linux" ]; then
ip -4 addr show | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v 127.0.0.1
elif [ "$OS" = "Darwin" ]; then
ifconfig | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}'
fi
}
# 8. 当前登录用户
show_logged_users() {
print_title "登录用户"
who | awk '{print $1}' | sort | uniq | paste -s -d ', '
}
# 9. 最近登录历史
show_last_logins() {
print_title "最近5次登录"
if command -v last &>/dev/null; then
last -n 5 | head -n 5
else
echo "last 命令不可用"
fi
}
# 显示所有信息
show_all_info() {
print_separator
echo -e "${GREEN} 系统信息报告${NC}"
print_separator
show_os_info
show_host_info
show_uptime
show_cpu_info
show_memory_info
show_disk_info
show_network_info
show_logged_users
show_last_logins
print_separator
}
# 显示帮助信息
show_help() {
echo "用法: $0 [选项]"
echo "选项:"
echo " -a, --all 显示所有信息 (默认)"
echo " -o, --os 只显示操作系统信息"
echo " -h, --host 只显示主机信息"
echo " -u, --uptime 只显示运行时间"
echo " -c, --cpu 只显示CPU信息"
echo " -m, --memory 只显示内存信息"
echo " -d, --disk 只显示磁盘信息"
echo " -n, --network 只显示网络信息"
echo " -l, --login 只显示登录用户"
echo " -L, --last 只显示最近登录"
echo " --help 显示此帮助信息"
}
# 主函数 - 处理命令行参数
main() {
# 如果没有参数,显示所有信息
if [ $# -eq 0 ]; then
show_all_info
return
fi
# 解析命令行参数
case $1 in
-a|--all)
show_all_info
;;
-o|--os)
show_os_info
;;
-h|--host)
show_host_info
;;
-u|--uptime)
show_uptime
;;
-c|--cpu)
show_cpu_info
;;
-m|--memory)
show_memory_info
;;
-d|--disk)
show_disk_info
;;
-n|--network)
show_network_info
;;
-l|--login)
show_logged_users
;;
-L|--last)
show_last_logins
;;
--help)
show_help
;;
*)
echo "未知选项: $1"
show_help
exit 1
;;
esac
}
# 调用主函数,传递所有命令行参数
main "$@"
第二个版本
#!/bin/bash
# 系统信息查看脚本 (函数式版本)
# 适用平台: Linux / macOS
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m' # No Color
# 全局缓存 OS 类型,避免重复调用 uname
OS=$(uname -s)
# 分隔线
print_separator() {
echo "==============================="
}
# 打印标题
print_title() {
echo -e "\n${BLUE}${BOLD}[$1]${NC}"
}
# 打印键值对
print_kv() {
echo -e " ${CYAN}$1:${NC} $2"
}
# 1. 操作系统信息
show_os_info() {
print_title "操作系统"
print_kv "内核类型" "$OS"
if [ -f /etc/os-release ]; then
. /etc/os-release
print_kv "发行版" "$NAME ${VERSION:-}"
elif command -v sw_vers &>/dev/null; then
print_kv "macOS 版本" "$(sw_vers -productVersion) ($(sw_vers -buildVersion))"
fi
print_kv "内核版本" "$(uname -r)"
}
# 2. 主机信息
show_host_info() {
print_title "主机信息"
print_kv "主机名" "$(hostname)"
print_kv "系统架构" "$(uname -m)"
if [ "$OS" = "Linux" ]; then
print_kv "虚拟化" "$(systemd-detect-virt 2>/dev/null || echo 'N/A')"
fi
}
# 3. 运行时间与负载
show_uptime() {
print_title "运行时间与负载"
if [ "$OS" = "Linux" ]; then
local seconds
seconds=$(awk '{printf "%d", $1}' /proc/uptime 2>/dev/null)
if [ -n "$seconds" ]; then
local days=$(( seconds / 86400 ))
local hours=$(( (seconds % 86400) / 3600 ))
local mins=$(( (seconds % 3600) / 60 ))
print_kv "已运行" "${days}天 ${hours}小时 ${mins}分钟"
fi
fi
# 通用:显示原始 uptime 含负载均值
print_kv "负载均值" "$(uptime | grep -oE 'load average[s]?:.*')"
}
# 4. CPU 信息
show_cpu_info() {
print_title "CPU 信息"
if [ "$OS" = "Linux" ]; then
local model
model=$(grep -m1 "model name" /proc/cpuinfo 2>/dev/null | sed 's/.*: //')
print_kv "型号" "${model:-未知}"
print_kv "物理核心数" "$(grep -c ^processor /proc/cpuinfo 2>/dev/null)"
local physical
physical=$(grep "physical id" /proc/cpuinfo 2>/dev/null | sort -u | wc -l)
[ "$physical" -gt 0 ] && print_kv "物理CPU数" "$physical"
print_kv "CPU 使用率" "$(top -bn1 2>/dev/null | grep "Cpu(s)" | awk '{printf "%.1f%%", $2+$4}' || echo 'N/A')"
elif [ "$OS" = "Darwin" ]; then
print_kv "型号" "$(sysctl -n machdep.cpu.brand_string 2>/dev/null)"
print_kv "物理核心数" "$(sysctl -n hw.physicalcpu 2>/dev/null)"
print_kv "逻辑核心数" "$(sysctl -n hw.logicalcpu 2>/dev/null)"
fi
}
# 5. 内存使用情况
show_memory_info() {
print_title "内存使用"
if [ "$OS" = "Linux" ]; then
free -h | awk '
NR==1 { printf " %-12s %8s %8s %8s\n", "", $1, $2, $3 }
NR==2 { printf " %-12s %8s %8s %8s\n", "物理内存:", $2, $3, $4 }
NR==3 { printf " %-12s %8s %8s %8s\n", "Swap:", $2, $3, $4 }
'
elif [ "$OS" = "Darwin" ]; then
local page_size total_mem free_pages active_pages inactive_pages wired_pages
page_size=$(sysctl -n hw.pagesize 2>/dev/null || echo 4096)
total_mem=$(sysctl -n hw.memsize 2>/dev/null)
eval "$(vm_stat 2>/dev/null | awk -v ps="$page_size" '
/Pages free/ { free=$3+0 }
/Pages active/ { active=$3+0 }
/Pages inactive/ { inactive=$3+0 }
/Pages wired down/ { wired=$5+0 }
/Pages speculative/ { spec=$3+0 }
END {
used = (active + inactive + wired) * ps
free_b = (free + spec) * ps
printf "used_gb=%.2f free_gb=%.2f\n", used/1073741824, free_b/1073741824
}
')"
print_kv "总物理内存" "$(awk "BEGIN{printf \"%.2f GB\", $total_mem/1073741824}")"
print_kv "已使用" "${used_gb:-N/A} GB"
print_kv "空闲(含投机)" "${free_gb:-N/A} GB"
fi
}
# 6. 磁盘使用情况
show_disk_info() {
print_title "磁盘使用"
if [ "$OS" = "Linux" ]; then
df -hT -x tmpfs -x devtmpfs -x squashfs 2>/dev/null | awk '
NR==1 { printf " %s\n", $0 }
NR>1 { printf " %s\n", $0 }
'
elif [ "$OS" = "Darwin" ]; then
df -h | grep -E "^/dev/" | awk '{ printf " %s\n", $0 }'
# 首行标题
df -h | awk 'NR==1 { printf " %s\n", $0 }' | head -1
fi
}
# 7. 网络信息
show_network_info() {
print_title "网络信息"
if [ "$OS" = "Linux" ]; then
ip -4 addr show 2>/dev/null | awk '
/^[0-9]+:/ { iface=$2 }
/inet / && !/127\.0\.0\.1/ {
gsub("/.*", "", $2)
printf " %-12s %s\n", iface, $2
}
'
elif [ "$OS" = "Darwin" ]; then
ifconfig 2>/dev/null | awk '
/^[a-z]/ { iface=$1 }
/inet / && !/127\.0\.0\.1/ {
printf " %-12s %s\n", iface, $2
}
'
fi
# 默认网关
if [ "$OS" = "Linux" ]; then
local gw
gw=$(ip route 2>/dev/null | awk '/^default/ {print $3; exit}')
[ -n "$gw" ] && print_kv "默认网关" "$gw"
elif [ "$OS" = "Darwin" ]; then
local gw
gw=$(route -n get default 2>/dev/null | awk '/gateway/ {print $2}')
[ -n "$gw" ] && print_kv "默认网关" "$gw"
fi
}
# 8. 当前登录用户
show_logged_users() {
print_title "当前登录用户"
local users
users=$(who 2>/dev/null | awk '{print $1}' | sort -u | paste -s -d ', ')
print_kv "用户" "${users:-(无)}"
}
# 9. 最近登录历史
show_last_logins() {
print_title "最近5次登录"
if command -v last &>/dev/null; then
last -n 5 2>/dev/null | head -n 5
else
echo " last 命令不可用"
fi
}
# 显示所有信息
show_all_info() {
print_separator
echo -e "${GREEN}${BOLD} 系统信息报告${NC}"
print_separator
show_os_info
show_host_info
show_uptime
show_cpu_info
show_memory_info
show_disk_info
show_network_info
show_logged_users
show_last_logins
print_separator
}
# 显示帮助信息
show_help() {
echo -e "用法: ${BOLD}$0${NC} [选项]"
echo "选项:"
echo " -a, --all 显示所有信息 (默认)"
echo " -o, --os 只显示操作系统信息"
echo " -H, --host 只显示主机信息"
echo " -u, --uptime 只显示运行时间"
echo " -c, --cpu 只显示CPU信息"
echo " -m, --memory 只显示内存信息"
echo " -d, --disk 只显示磁盘信息"
echo " -n, --network 只显示网络信息"
echo " -l, --login 只显示登录用户"
echo " -L, --last 只显示最近登录"
echo " -h, --help 显示此帮助信息"
}
# 主函数
main() {
if [ $# -eq 0 ]; then
show_all_info
return
fi
case $1 in
-a|--all) show_all_info ;;
-o|--os) show_os_info ;;
-H|--host) show_host_info ;;
-u|--uptime) show_uptime ;;
-c|--cpu) show_cpu_info ;;
-m|--memory) show_memory_info ;;
-d|--disk) show_disk_info ;;
-n|--network) show_network_info ;;
-l|--login) show_logged_users ;;
-L|--last) show_last_logins ;;
-h|--help) show_help ;;
*)
echo -e "${RED}未知选项: $1${NC}"
show_help
exit 1
;;
esac
}
main "$@"