1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
.. SPDX-License-Identifier: GPL-2.0-or-later
.. index::
single: test (command)
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 :doc:`setexpr`.
|