具有OR逻辑语法的bash IF条件

时间:2019-04-22 06:59:34

标签: linux bash if-statement logical-operators md5sum

我很困惑。

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

类似的东西

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

如何编写有效的语法?

2 个答案:

答案 0 :(得分:3)

处于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 -

编辑:我还建议跳过-n上的echo选项-似乎没有必要,并且它不可移植。因此,echo的某些版本将仅在输出中打印“ -n”,这会使md5sum感到困惑。我有一堆使用echo -n的脚本,并且在系统更新更改了echo的行为后不得不大惊小怪地重写它们……从那时起我就避免了瘟疫,并在需要类似内容时使用printf

答案 1 :(得分:0)

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