summaryrefslogtreecommitdiff
path: root/doc/usage/cmd/test.rst
blob: d1379117fcaf9044431401a4f0cea0818252044d (plain)
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`.