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

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

Machine-checked — no person has signed for it. This question was read against the source cited below by an automated pass, which found no contradiction. That is a weaker claim than it sounds: the same kind of process wrote the question, so it can confirm its own mistake.

Treat it as a good draft rather than as settled fact, and read the source below before you rely on it. It is not used in mock exams here — only questions a person has signed for are.

How these questions are written — where each question comes from, what the verification ledger records, and what happens when one is found wrong.

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 short set from objective 105 and space the ones you get wrong.

Practise LPIC-1 Exam 102-500

More questions on this objective

All questions on Shells and shell scripting

Practise LPIC-1 Exam 102-500