一键脚本
bash <(curl -sL gitee.com/meimolihan/cmdbox/raw/master/sh/hash_verify.sh) /路径/文件 64位sha256哈希值
bash <(curl -sL ../sh/hash_verify.sh) /路径/文件 64位sha256哈希值
效果预览
补充说明
该脚本用于校验文件哈希值是否匹配(md5 / sha256),支持命令行传参和纯交互式两种模式,自动按哈希值长度识别算法,匹配成功或失败均有明确反馈,适合下载完整性验证、文件一致性检查等场景。
功能特点
- 双模式调用:命令行传参或纯交互式输入
- 参数顺序灵活:文件路径与哈希值可任意顺序传入,自动识别
- 算法自动识别:按哈希值长度判断(64 位=sha256,32 位=md5)
- 匹配与失败反馈:失败时同时打印预期与当前哈希,便于比对
- 返回码区分结果:0=匹配、1=参数错误、2=不匹配
- 无哈希文件生成,仅校验比对,纯只读操作
参数说明
# 指定文件与哈希值(64 位 sha256)
./hash_verify.sh /路径/文件 长度64位的sha256值
# 参数顺序可互换(32 位 md5)
./hash_verify.sh 长度32位的md5值 /路径/文件
# 纯交互式输入
./hash_verify.sh
输出说明
| 结果 | 输出 |
|---|---|
| 匹配 | 【sha256/md5】哈希匹配,文件完好 |
| 不匹配 | 【算法】哈希不匹配! 并列出预期 / 当前哈希 |
| 长度非法 | 哈希长度非法!sha256=64位,md5=32位 |
注意事项
- 需要 sha256sum / md5sum 命令可用(coreutils 自带)
- 算法按预期哈希值长度自动判断,非 64 / 32 位直接报错
- 哈希比较区分大小写:命令输出为小写十六进制,粘贴时注意大小写一致
- 交互模式空输入返回上级菜单
- 返回码:0=匹配成功、1=参数或长度错误、2=不匹配,可用于脚本判断
脚本源码
#!/bin/bash
gl_hui='\033[38;5;59m'
gl_hong='\033[38;5;9m'
gl_lv='\033[38;5;10m'
gl_huang='\033[38;5;11m'
gl_lan='\033[38;5;32m'
gl_bai='\033[38;5;15m'
gl_zi='\033[38;5;13m'
gl_bufan='\033[38;5;14m'
log_info() { echo -e "${gl_lan}[信息]${gl_bai} $*"; }
log_ok() { echo -e "${gl_lv}[成功]${gl_bai} $*"; }
log_warn() { echo -e "${gl_huang}[警告]${gl_bai} $*"; }
log_error() { echo -e "${gl_hong}[错误]${gl_bai} $*" >&2; }
cancel_empty() {
local menu_name="${1:-上一级选单}"
echo -e "${gl_hong}空输入,返回 ${gl_huang}${menu_name} ${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai}\c"
sleep 0.5
echo -ne "${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai}\c"
sleep 0.6
echo ""
clear
}
hash_verify() {
local p1="${1:-}"
local p2="${2:-}"
local file=""
local expect_hash=""
local algo=""
if [[ -n "${p1}" && -f "$p1" ]]; then
file="$p1"
expect_hash="$p2"
elif [[ -n "${p2}" && -f "$p2" ]]; then
file="$p2"
expect_hash="$p1"
fi
if [[ -z "$file" ]]; then
clear
echo -e "${gl_zi}>>> 交互式哈希校验 ${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai}"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
read -r -e -p "$(echo -e "${gl_bai}请输入文件绝对路径: ")" file
if [[ -z "$file" ]]; then
cancel_empty "返回"
return 1
fi
if [[ ! -f "$file" ]]; then
log_error "文件不存在:$file"
return 1
fi
echo ""
read -r -e -p "$(echo -e "${gl_bai}请输入预期哈希值: ")" expect_hash
if [[ -z "$expect_hash" ]]; then
cancel_empty "返回"
return 1
fi
fi
local hash_len=${#expect_hash}
if [[ "$hash_len" -eq 64 ]]; then
algo="sha256"
elif [[ "$hash_len" -eq 32 ]]; then
algo="md5"
else
log_error "哈希长度非法!sha256=64位,md5=32位"
return 1
fi
local cur_hash
case "$algo" in
sha256)
cur_hash=$(sha256sum "$file" | awk '{print $1}')
;;
md5)
cur_hash=$(md5sum "$file" | awk '{print $1}')
;;
esac
if [[ "$cur_hash" == "$expect_hash" ]]; then
log_ok "【$algo】哈希匹配,文件完好"
return 0
else
log_error "【$algo】哈希不匹配!"
echo -e "${gl_bai} 预期: $expect_hash"
echo -e "${gl_bai} 当前: $cur_hash"
return 2
fi
}
hash_verify "$@"
创建本地脚本
new_script="new_test.sh"
cat > "$new_script" << 'EOF'
#!/bin/bash
# 粘贴脚本源码
EOF
# 保留本地脚本,去掉 rm -f "$new_script"
chmod +x "$new_script" && ./"$new_script" && rm -f "$new_script"
相关命令
- hash_create 生成哈希
- sha256sum 校验命令
- md5sum 校验命令
- cksum 校验和
- hash_verify 👈 当前所在位置