logo

Programming Languages - if / else

Last Updated: 2024-01-21

Depending on the language, if may be a statement or an expression, check out Statement vs Expression

if / else

C++ / Java

if (a < 0) {
    // ...
} else if (a == 0) {
    // ...
} else {
    // ...
}

Go

() is optional, {} is required.

if a < 0 {
	// ...
} else {
  // ...
}

Variables declared by the statement are only in scope until the end of the if. This is a common pattern to deal with errors, err is limited to the if statement:

if err := foo(); err != nil {
  // ...
}

Rust

if a < 0 {
    // ...
} else if a == 0 {
    // ...
} else {
    // ...
}

Python

if a < 0:
  # ...
elif a == 0:
  # ...
else:
  # ...

Bash

if [ ... ]
then
  ...
elif [ ... ]
then
  ...
else
  ...
fi

Examples

Test if file exists

if [ -e "/path" ]
then
  echo "path exists."
fi

As One-liner

$ if [ 1 -eq 1 ]; then echo "yes"; fi
yes

Ternary

Rust

let result = if var > 0 { true } else { false };

Python

>>> "a" if 1 + 1 == 2 else "b"
'a'

JavaScript

result = condition ? 'a' : 'b';

Appendix: Bash Conditions

condition True if ...
[ -a FILE ] if FILE exists.
[ -b FILE ] if FILE exists and is a block-special file.
[ -c FILE ] if FILE exists and is a character-special file.
[ -d FILE ] if FILE exists and is a directory.
[ -e FILE ] if FILE exists.
[ -f FILE ] if FILE exists and is a regular file.
[ -g FILE ] if FILE exists and its SGID bit is set.
[ -h FILE ] if FILE exists and is a symbolic link.
[ -k FILE ] if FILE exists and its sticky bit is set.
[ -p FILE ] if FILE exists and is a named pipe (FIFO).
[ -r FILE ] if FILE exists and is readable.
[ -s FILE ] if FILE exists and has a size greater than zero.
[ -t FD ] if file descriptor FD is open and refers to a terminal.
[ -u FILE ] if FILE exists and its SUID (set user ID) bit is set.
[ -w FILE ] if FILE exists and is writable.
[ -x FILE ] if FILE exists and is executable.
[ -O FILE ] if FILE exists and is owned by the effective user ID.
[ -G FILE ] if FILE exists and is owned by the effective group ID.
[ -L FILE ] if FILE exists and is a symbolic link.
[ -N FILE ] if FILE exists and has been modified since it was last read.
[ -S FILE ] if FILE exists and is a socket.
[ FILE1 -nt FILE2 ] if FILE1 is newer than FILE2, or if FILE1 exists and FILE2 does not.
[ FILE1 -ot FILE2 ] if FILE1 is older than FILE2, or is FILE2 exists and FILE1 does not.
[ FILE1 -ef FILE2 ] if FILE1 and FILE2 refer to the same device and inode numbers.
[ -o OPTIONNAME ] if shell option "OPTIONNAME" is enabled.
[ -z STRING ] if the length of "STRING" is zero.
[ -n STRING ] or [ STRING ] if the length of "STRING" is non-zero.
[ STRING1 == STRING2 ] if the strings are equal.
[ STRING1 != STRING2 ] if the strings are not equal.
[ STRING1 < STRING2 ] if "STRING1" sorts before "STRING2" in the current locale.
[ STRING1 > STRING2 ] if "STRING1" sorts after "STRING2" in the current locale.

[ ARG1 OP ARG2 ]: "OP" is one of -eq, -ne, -lt, -le, -gt or -ge. These arithmetic binary operators return true if "ARG1" is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to "ARG2", respectively. "ARG1" and "ARG2" are integers.

Combining expressions

Operation Effect
[ ! EXPR ] True if EXPR is false.
[ ( EXPR ) ] Returns the value of EXPR. This may be used to override the normal precedence of operators.
[ EXPR1 -a EXPR2 ] True if both EXPR1 and EXPR2 are true.
[ EXPR1 -o EXPR2 ] True if either EXPR1 or EXPR2 is true.

e.g.

if $SPARK_HOME is not set

if [ -z "${SPARK_HOME}" ]; then
  export SPARK_HOME="$(cd "`dirname "$0"`"/..; pwd)"
fi