一键脚本
bash <(curl -sL gitee.com/meimolihan/cmdbox/raw/master/sh/hash_create.sh) /路径/文件 md5
bash <(curl -sL ../sh/hash_create.sh) /路径/文件 md5
效果预览
补充说明
该脚本用于生成文件的哈希校验值(md5 / sha256),支持命令行传参和纯交互式两种模式,结果以独立文件保存到源文件同目录,适合文件校验、下载完整性验证等场景。
功能特点
- 双模式调用:命令行传参或纯交互式选择
- 参数顺序灵活:文件路径与算法可任意顺序传入,自动识别
- 三种算法:sha256 / md5 / all(all 同时生成两种)
- 省略算法:命令行未指定算法时默认生成 sha256 + md5
- 算法大小写兼容:自动转小写处理
- 结果落盘:输出文件与源文件同目录,内容含文件名便于比对
参数说明
# 指定文件与算法
./hash_create.sh /路径/文件 sha256
# 参数顺序可互换
./hash_create.sh md5 /路径/文件
# 省略算法,同时生成 sha256 + md5
./hash_create.sh /路径/文件
# 纯交互式选择
./hash_create.sh
输出说明
脚本默认将结果保存到源文件同目录,文件名为「原文件名去掉扩展名 + 后缀」:
| 生成文件 | 内容 |
|---|---|
<名>_hash-sha256.txt |
SHA-256 哈希值(格式:<hash> ./<文件名>) |
<名>_hash-md5.txt |
MD5 哈希值(格式:<hash> ./<文件名>) |
注意事项
- 需要 sha256sum / md5sum 命令可用(coreutils 自带)
- 算法仅支持 md5 / sha256 / all,其它值返回错误
- 文件不存在时报错退出;交互模式空输入返回上级菜单
- 结果文件会覆盖同目录下同名文件
- 交互模式算法选项仅支持 1/2/3
脚本源码
#!/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_create() {
local p1="${1:-}"
local p2="${2:-}"
local target_file=""
local algo=""
if [[ -n "${p1}" && -f "$p1" ]]; then
target_file="$p1"
algo="$p2"
elif [[ -n "${p2}" && -f "$p2" ]]; then
target_file="$p2"
algo="$p1"
fi
if [[ -z "$target_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}请输入文件绝对路径: ")" target_file
if [[ -z "$target_file" ]]; then
cancel_empty "返回"
return 1
fi
if [[ ! -f "$target_file" ]]; then
log_error "文件不存在:$target_file"
return 1
fi
echo ""
echo -e "${gl_huang}>>> 请选择哈希算法${gl_bai}"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
echo -e "${gl_bufan}1. ${gl_bai}sha256"
echo -e "${gl_bufan}2. ${gl_bai}md5"
echo -e "${gl_bufan}3. ${gl_bai}all(同时生成sha256+md5)"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
read -r -e -p "$(echo -e "${gl_bai}输入选项 [1/2/3]: ")" sel
case "$sel" in
1) algo="sha256" ;;
2) algo="md5" ;;
3) algo="all" ;;
*)
log_error "无效选项"
return 1
;;
esac
fi
local base_name=$(basename "$target_file")
local dir_name=$(dirname "$target_file")
local stem="${base_name%.*}"
algo=$(echo "$algo" | tr '[:upper:]' '[:lower:]')
gen_single() {
local a="$1"
local hash_out
case "$a" in
sha256)
hash_out=$(sha256sum "$target_file" | awk -v n="$base_name" '{print $1,"./"n}')
echo "$hash_out" > "${dir_name}/${stem}_hash-sha256.txt"
log_ok "sha256 已保存: ${dir_name}/${stem}_hash-sha256.txt"
;;
md5)
hash_out=$(md5sum "$target_file" | awk -v n="$base_name" '{print $1,"./"n}')
echo "$hash_out" > "${dir_name}/${stem}_hash-md5.txt"
log_ok "md5 已保存: ${dir_name}/${stem}_hash-md5.txt"
;;
*)
log_error "不支持算法: $a,仅支持 md5 / sha256 / all"
return 2
esac
}
case "$algo" in
""|all)
gen_single sha256
gen_single md5
;;
sha256|md5)
gen_single "$algo"
;;
*)
log_error "不支持参数:$algo,可选 sha256 / md5 / all"
return 2
;;
esac
}
hash_create "$@"
创建本地脚本
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"
相关命令
- sha256sum 哈希计算
- md5sum 哈希计算
- cksum 校验和
- hash_verify 校验哈希
- hash_create 👈 当前所在位置