test command

Synopsis

test <str-op> <s>
test <s1> <str-cmp> <s2>
test <n1> <num-cmp> <n2>
test ! <expr>
test <expr1> -o <expr2>
test <expr1> -a <expr2>
test -e <interface> <dev[:part]> <path>
test <s> =~ <re>

Description

The test command is similar to the ordinary shell built-in by the same name. Unlike in ordinary shells, it cannot be spelled [.

Strings

The string tests -n and -z, and string comparison operators =, !=, < and >, work exactly as in ordinary shells.

Numbers

The number comparison operators -lt, -le, -gt, -gt, -eq and -ne work as in ordinary shells.

Note

Numbers are parsed with simple_strtol(, 0), meaning that they are treated as decimal unless there is a 0x prefix, any errors in parsing are ignored, and parsing stops as soon as a non-digit (for the selected base) is encountered. And most U-Boot commands that generate “numeric” environment variables store them as hexadecimal without a 0x prefix.

For example, this is not a correct way of testing whether a given file has a size less than 4KiB:

# Assuming readme.txt exists, sets 'filesize' environment variable
$ size mmc 0:1 readme.txt
$ if test "$filesize" -lt 4096 ; then ...

If the file size is actually 8000 (decimal), its hexadecimal representation, and thus the value of $filesize, is 1f40, so the comparison that is done ends up being “1 < 4096”.

Logic

The ! operator negates the sense of the test of the expression <expr>.

The -o and -a operators perform logical OR and logical AND, respectively, of the two expressions.

File existence

Like ordinary shells, the -e operator can be used to test for existence of a file. However, the U-Boot version takes three arguments:

  • The interface (e.g. mmc).

  • The device number, possibly including a partition specification.

  • The usual path argument, which is interpreted relative to the root of the filesystem.

Regular expressions

When CONFIG_REGEX is enabled, an additional operator =~ is available. This is similar to the same operator available with bash’s extended test command [[ ]]. The left operand is a string which is matched against the regular expression described by the right operand.

The regular expression engine supports these features:

  • Anchoring ^ and $, matching at the beginning/end of the string.

  • Matching any single character (including whitespace) using ..

  • Character classes [ ], including ranges [0-9] and negation [^ /.].

  • Grouping ( ).

  • Alternation |.

  • Postfix qualifiers *, + and ? and their non-greedy variants *?, +? and ??

For extracting the parts matching a capture group and/or performing substitutions, including back references, see setexpr command.