开源一个比对 sha 值的脚本

刚写的,绝对新鲜
这个作者很懒,有很多地方可以优化的,但是我懒得写了
注释已经标好了,允许二次更改分享(但希望在转载时能注明原作者 :wink:
本人能力有限,如果有可以优化的地方欢迎反馈(我也要学习学习,没事的话也可以给我补补课)

#!/bin/bash
#set -x
#原作者: forums.debiancn.org 的 user-145580717118795 允许修改转载, 但请注明原作者
#如果没有参数,则......
if [[ ${@} == "" ]];then
	echo "作者很懒, 没有设计这种操作方式呢" >&2
fi
#如果参数为 "--help" 则输出帮助
if [[ ${@} == "--help" ]];then
	echo "语法: ${0} [--mode=<数字>] [<文件名0> | sha=<sha值>] [<文件名1> | sha=<sha值1>]"
	exit
fi
#在所有的参数中查找
for var0 in ${@};do
	#如果有以 "--mode=sha" 开头的参数
	if [[ ${var0} == "--mode=sha"* ]];then
		#将 sha 位数设定为 "--mode=sha" 后面的结果
		mode=${var0#--mode=sha}
	fi
done
#如果没有设置具体 sha 位数
if [[ "${mode}" == "" ]];then
	#sha 位数默认为 512
	mode="512"
fi
#列举合法的数字
aviliable_num=("1" "224" "256" "384" "512")
#验证用户输入的数字是否合法(检查是否在上面的数组中)
for var0 in ${aviliable_num[@]};do
	#如果 mode变量 与 变量0 相等
	if [[ "${var0}" == "${mode}" ]];then
		#记录数据是合法的
		aviliable="true"
		break
	fi
done
#如果不合法则报错并退出
if [[ ${aviliable} != "true" ]];then
	echo "错误: 不支持的位数" >&2
	if [[ ${mode} == *"sum" ]];then
		echo "请不要在参数后加\"sum\" (绝对不是作者为了偷懒没有适配,绝对不是![傲娇.jpg])" >&2
	fi
	echo "mode的格式: \"--mode=sha<数字>\"" >&2
	echo "所有支持的数字: \"${aviliable_num[@]}\"" >&2
	exit
fi
#查找参数
for var0 in ${@};do
	#忽略掉以 "--mode=sha" 开头的参数
	if [[ ${var0} != "--mode=sha"* ]];then
		#如果 参数0 为空
		if [[ ${par0} == "" ]];then
			#如果 当前参数 是以 "sha=" 开头或没有这个文件(说明这个参数表示一个 sha 值)
			if [[ ${var0} == "sha="* ]] || [[ !(-f ${var0}) ]];then
				#将 sha 值计入 参数0
				par0=${var0#sha=}
			#否则
			else
				#计算 sha值 并计入变量
				par0=$(sha${mode}sum ${var0}|echo $(awk 'NR==1{print$1}'))
			fi
		#如果 参数0 有数据且 参数1 没有数据
		elif [[ ${par0} != "" ]] && [[ ${par1} == "" ]];then
			#如果 当前参数 是以 "sha=" 开头或没有这个文件(说明这个参数表示一个 sha 值)
			if [[ ${var0} == "sha="* ]] || [[ !(-f ${var0}) ]];then
				#将 sha 值计入变量
                                par1=${var0#sha=}
			#否则
                        else
				#计算 sha值 并计入 参数1
                                par1=$(sha${mode}sum ${var0}|echo $(awk 'NR==1{print$1}'))
                        fi
		fi
	fi
done
#如果 参数0 值不为空(虽然理论上不可能,但还是保险起见吧)
if [[ ${par0} != "" ]];then
	#输出 参数0 的值
	echo -e "sha${mode}sum0=\033[34m${par0}\033[0m"
fi
#如果 参数1 值不为空
if [[ ${par1} != "" ]];then
	#输出 参数1 的值
	echo -e "sha${mode}sum1=\033[34m${par1}\033[0m"
fi
#如果 参数0 与 参数1 均不为空
if [[ ${par0} != "" ]] && [[ ${par1} != "" ]];then
	#比对 参数0 与 参数1 并输出结果
	if [[ ${par0} == ${par1} ]];then
		echo "sha${mode}比对结果: 相同"
	else
	        echo "sha${mode}比对结果: 不同"
	fi
fi
2 个赞

呃,下载文件的话,这个一般都是用 xxxsum -c 来检查的,不需要自己去比对。

2 个赞

有趣,挺好玩的。