I tried below but it doesn’t work. Throwing some errors. Exp1 or expr2 should evaluate first & at result should be evaluated with expr3 ( &&)
if [ "$val1" == "$val2" || "$val1" == "$val3" ] && [ "$val4" > "$val5" ] then echo "success" elif [ "$val1" == "$val2" || "$val1" == "$val3" ] && [ "$val4" < "$val5" ] then echo "fail" else echo "no result" fi fi
i tried as per suggestion, it throws error as
./temp.ksh[11]: 03/20/1996: not found [No such file or directory]
Fyi- that date is val1 value.
Advertisement
Answer
You might see different results based on the shell or version, eg: sh vs bash vs ash. One example is some bash yield an error from [ [ (with a separating space), while [[ (without a separating space) is accepted. Note there are different semantics within [ ] vs [[ ]] expressions.
Try dropping the outer space-separated [ and ] from your || expression. Also check documentation for operator precedence to meet or confirm your needs.
Another issue is the use of redirects < and >. Check your current directory for files named with the values from $val4 and $val5. Switch to -gt and -lt for comparisons.
Also to avoid surprises: when using -gt and -lt, check what happens when an operand is empty or non-numeric.
=======
May 24 update:
The original post did not specify a shell; now using ksh, there’s an issue with operator combos. Looks like you’ll need to use -o and -a with [ ] expressions or || and && with [[ ]] expressions. After switching to [[ ]] and replacing > and <, this version works on jdoodle.com :
if [[ "$val1" == "$val2" || "$val1" == "$val3" ]] && [[ "$val4" -gt "$val5" ]]; then echo "success" elif [[ "$val1" == "$val2" || "$val1" == "$val3" ]] && [[ "$val4" -lt "$val5" ]]; then echo "fail" else echo "no result" fi