bash 具有 OR 逻辑语法的 IF 条件
bash IF condition with OR logic syntax
我很困惑..
我只是如果文件不存在或 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"
我很困惑..
我只是如果文件不存在或 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"