In a bash script, I have to check for the existence of several files.
I know an awkward way to do it, which is as follows, but that would mean that my main program has to be within that ugly nested structure:
if [ -f $FILE1 ] then if [ -f $FILE2 ] then echo OK # MAIN PROGRAM HERE fi fi
The following version does not work:
([ -f $FILE1 ] && [ -f $FILE2 ]) || ( echo 'NOT FOUND'; exit 1 ) echo OK
It prints
NOT FOUND OK
Is there an elegant way to do this right?
UPDATE: See the accepted answer. In addition, in terms of elegance I like Jonathan Leffler’s answer:
arg0=$(basename $0 .sh) error() { echo '$arg0: $@' 1>&2 exit 1 } [ -f $FILE2 ] || error '$FILE2 not found' [ -f $FILE1 ] || error '$FILE1 not found'
How about
See
help [[andhelp testfor the options usable with the[[style tests. Also read this faq entry.Your version does not work because
(...)spawns a new sub-shell, in which theexitis executed. It therefor only affects that subshell, but not the executing script.The following works instead, executing the commands between
{...}in the current shell.I should also note that you have to quote both variables to ensure there is no unwanted expansion or word splitting made (they have to be passed as one argument to
[).