i am confused..
i just make if file does not exist OR md5 sum is wrong
something like this
md5=20ffa23fbb589484d03d79608fe8d2ad
if ! -f /tmp/1.txt  || echo -n ${md5} /tmp/1.txt | md5sum --status --check -
then
 ....
fi
how write valid syntax?
i am confused..
i just make if file does not exist OR md5 sum is wrong
something like this
md5=20ffa23fbb589484d03d79608fe8d2ad
if ! -f /tmp/1.txt  || echo -n ${md5} /tmp/1.txt | md5sum --status --check -
then
 ....
fi
how write valid syntax?
 
    
     
    
    The things in an if condition are commands (like echo ... | md5sum ...), not conditional expressions (like -f /tmp/1.txt). In order to use a conditional expression, you need to use the test command:
if ! test -f /tmp/1.txt  || echo -n ${md5} /tmp/1.txt | md5sum --status --check -
or its synonym [ (note that it expects a "]" as its last argument, so it looks like funny parentheses):
if ! [ -f /tmp/1.txt ]  || echo -n ${md5} /tmp/1.txt | md5sum --status --check -
or in bash or zsh, you can use [[ ]] (which isn't a regular command, and has somewhat cleaner syntax for more complex conditions):
if ! [[ -f /tmp/1.txt ]]  || echo -n ${md5} /tmp/1.txt | md5sum --status --check -
BTW, I'm pretty sure you also want to negate the md5 status check, so you need another "!" to negate that as well:
if ! [[ -f /tmp/1.txt ]]  || ! echo -n ${md5} /tmp/1.txt | md5sum --status --check -
Edit: I'd also recommend skipping the -n option on echo -- it doesn't seem to be necessary, and it isn't portable. So some versions of echo will just print "-n" as part of their output, which will confuse md5sum. I had a bunch of scripts that used echo -n, and had to rewrite them in a panic after a system update changed the behavior of echo... so ever since then I've avoided it like the plague, and used printf when I need something like that.
 
    
    md5hash=031f8c1dba9b8ca6890a7f3dc13428f2
[ ! -f /tmp/1.txt ] || md5arr=( $(md5sum /tmp/1.txt) ) && [ ${md5arr[0]} == $md5hash ]
[ $? -ne 0 ] && echo "no file or file changed"
