使用 OR 逻辑语法 bash IF 条件



我很困惑。

我只是如果文件不存在或 md5 总和错误

像这样的东西

md5=20ffa23fbb589484d03d79608fe8d2ad
if ! -f /tmp/1.txt  || echo -n ${md5} /tmp/1.txt | md5sum --status --check -
then
....
fi

如何编写有效的语法?

if条件中的东西是命令(如echo ... | md5sum ...),而不是条件表达式(如-f /tmp/1.txt)。要使用条件表达式,您需要使用test命令:

if ! test -f /tmp/1.txt  || echo -n ${md5} /tmp/1.txt | md5sum --status --check -

或其同义词[(注意它期望"]"作为其最后一个参数,因此看起来像有趣的括号):

if ! [ -f /tmp/1.txt ]  || echo -n ${md5} /tmp/1.txt | md5sum --status --check -

或者在 bash 或 zsh 中,您可以使用[[ ]](这不是常规命令,对于更复杂的条件具有更简洁的语法):

if ! [[ -f /tmp/1.txt ]]  || echo -n ${md5} /tmp/1.txt | md5sum --status --check -

顺便说一句,我很确定您还想否定 md5 状态检查,所以您还需要另一个"!"来否定它:

if ! [[ -f /tmp/1.txt ]]  || ! echo -n ${md5} /tmp/1.txt | md5sum --status --check -

编辑:我还建议跳过echo上的-n选项 - 它似乎不是必需的,而且它不是便携式的。因此,某些版本的echo只会打印"-n"作为其输出的一部分,这会混淆md5sum.我有一堆使用echo -n的脚本,并且在系统更新更改了echo的行为后不得不惊慌失措地重写它们......所以从那以后,我像瘟疫一样避免它,并在我需要这样的东西时使用printf

md5hash=031f8c1dba9b8ca6890a7f3dc13428f2
[ ! -f /tmp/1.txt ] || md5arr=( $(md5sum /tmp/1.txt) ) && [ ${md5arr[0]} == $md5hash ]
[ $? -ne 0 ] && echo "no file or file changed"

相关内容

  • 没有找到相关文章

最新更新