Which statement correctly distinguishes bash's `[[ ... ]]` from `[ ... ]`?

LPIC-1 Exam 102-500, objective 105. Shells and shell scripting hard

Draft — not checked yet. This question was written from the published exam objectives and cites the clause it comes from, but nobody has yet read it against that clause and signed for it.

It is kept out of search results and out of mock exams until they have. Read the source below before you take the answer as settled.

The options

Not correct `[[ ... ]]` is the POSIX form and works in any /bin/sh, while `[ ... ]` is a bash extension.

Wrong, and reversed. `[` is the POSIX test command and exists as a builtin in every POSIX shell and as /usr/bin/[ on disk. `[[ ]]` is a bash and ksh extension that plain /bin/sh (dash) does not accept.

Correct `[[ ... ]]` is shell syntax, so word splitting and filename expansion are not applied to unquoted variables inside it, whereas `[` is an ordinary command whose arguments are expanded normally.

Correct. Because `[[` is parsed as a compound command, `[[ $file = *.txt ]]` works even when $file is empty or contains spaces, while `[ $file = x ]` can break into the wrong number of arguments.

Not correct `[ ... ]` needs no closing bracket; the trailing ] is optional.

Wrong. `[` is a command whose final argument must be `]`. Omitting it is a syntax error from the test builtin itself.

Not correct `[[ ... ]]` compares only integers, so strings must always be tested with `[`.

Wrong. `[[ ]]` handles strings well, including pattern matching with = and regex matching with =~. Numeric comparison inside it still uses -eq, -lt and friends, exactly as in `[`.

Why

`[` is literally a command: `[ -f /etc/passwd ]` is the test builtin with `]` as its last argument, which is why the spaces around the brackets are mandatory. `[[ ]]` is a bash keyword, so it can also offer && and || inside the test and unquoted pattern matching. For portable /bin/sh scripts use `[`; for bash-only scripts `[[ ]]` is safer against unquoted variables.

Where this comes from

Cited
LPI exam objective 105.2
What it says
Use test and conditional expressions in shell scripts.

Practise this

Reading one question is not practice. The trainer will draw a set from objective 105 and space the ones you get wrong.

Practise LPIC-1 Exam 102-500