我用来sha256sum
检查 bash 脚本中的文件是否已更改。我的想法是首先将其存储在文件sha256sum
中*.sha256
。然后,如果存在,则使用命令sha256
使用它进行比较--check
。如果哈希值匹配,则继续脚本的其余部分,否则创建新的哈希文件 ( *.sha256
) 并用新的哈希文件替换旧的哈希文件。我已经做好了:
x="/home/test.json"
if [[ -s $x.sha256 ]]; then
sha256sum --check $x.sha256
#exit 1
s1=$(sha256sum "$x" > "$x.sha256")
#exit 1
else
s1=$(sha256sum "$x" > "$x.sha256")
echo "sha256 file is created"
fi
但从上面的代码开始,如果 x.sha256 文件不存在,则会创建它。但是如果文件已经可用并且哈希值不匹配,则会抛出错误:
/home/test.json: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match
这是预期的,但在这种情况下我想创建新x.sha256
文件并替换旧文件。
谁能告诉我需要进行哪些更改?
提前致谢
答案1
来自评论:
但脚本使用
set -Eeo pipefail
set -e
如果sha256sum --check
以虚假状态退出,则会导致整个脚本失败。为了避免这种情况,请将命令置于任何类型的条件中,例如 run sha256sum --check || true instead
。
另外,如前所述,s1=$(sha256sum "$x" > "$x.sha256")
看起来有点不对劲,因为输出sha256sum
被重定向到文件,命令替换没有任何内容可以捕获,并且$s1
无论发生什么,最终都会为空。如果您不需要s1
,只需删除命令替换,如果您想将 的输出sha256sum
放入变量和文件中,请使用类似
s1=$(sha256sum "$x" | tee "$x.sha256")
因此,我会将整个脚本重写为如下所示:
#!/bin/bash
set -e
file="/home/test.json"
if [[ -s $file.sha256 ]]; then
if ! sha256sum --check "$file.sha256"; then
echo "stored hash for '$file' does not match existing file, storing new hash"
sha256sum "$file" > "$file.sha256"
else
: # hash file exists and matches existing file, do nothing
fi
else
echo "no stored hash for '$file', creating hash file"
sha256sum "$file" > "$file.sha256"
fi
也就是说,除非您需要文件中进一步的哈希副本,在这种情况下,还需要读入现有匹配哈希的分支"$file.sha256"
。
但如果您正在使用set -e
,请参阅BashFAQ/105 -- 为什么 set -e (或 set -o errexit 或 trap ERR)没有达到我的预期?