-
Notifications
You must be signed in to change notification settings - Fork 1.8k
SC1014
if [ grep -q pattern file ]
then
echo "Found a match"
fi
if grep -q pattern file
then
echo "Found a match"
fi
[ ... ]
as shell syntax is a simple command that tests for whether certain conditions are true or false, such as whether the value assigned to a variable has a non-zero length ([ -n "${foo}" ]
) or whether a file system object is a directory ([ -d "${dir}" ]
). If-then-(elif-then)-else-fi
statements are logical constructs which themselves contain lists of commands which can include simple commands.
[
is just regular command, like whoami
or grep
, but with a funny name (see ls -l /bin/[
). It's a shorthand for test
. [[
is similar to both [
and test
, but [[
offers some additional unary operators, such as '=~' the regular expression comparison operator. It allows one to use extglobs such as @(foo|bar)
(a "bashism"), among some other less commonly used features.
[[
, [
and test
are often used within if...fi
constructs in the conditional commands position: which is between the 'if' and the 'then.'
There are certain shell syntaxes which can be wrapped directly around simple commands, in particular: (1) { ...;}
compound command groupings, (2) $( ... )
command substitutions and (3) <( ... )
and >( ... )
process substitutions. Some examples include { [ -d "${HOME}/file" ]; echo $?;}
, var=$(logname)
and readarray -d "" -t files < <( find ~ -iname '*bash*' -print0 2> /dev/null )
, respectively. However, the various testing commands' syntaxes are not to be included among this list.
If you want to check the exit status of a certain command, use that command directly as demonstrated in the correct code, above.
If you want to check the output of a command, use "$(..)"
to get its output, and then use test
or [
/[[
to do a string comparison:
# Check output of `whoami` against the string `root`
if [ "$(whoami)" = "root" ]
then
echo "Running as root"
fi
For more information, see this problem in the Bash Pitfall list, or generally Tests and Conditionals in the WoolEdge BashGuide
None.