bash Условие IF с логическим синтаксисом OR - PullRequest
0 голосов
/ 22 апреля 2019

я в замешательстве ..

я просто делаю , если файл не существует ИЛИ сумма md5 неверна

как то так

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

как написать правильный синтаксис?

Ответы [ 2 ]

3 голосов
/ 22 апреля 2019

В состоянии 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 когда мне нужно что-то подобное.

0 голосов
/ 22 апреля 2019
md5hash=031f8c1dba9b8ca6890a7f3dc13428f2
[ ! -f /tmp/1.txt ] || md5arr=( $(md5sum /tmp/1.txt) ) && [ ${md5arr[0]} == $md5hash ]
[ $? -ne 0 ] && echo "no file or file changed"
...