Для уточнения, только строки, поступающие из нескольких источников (здесь цитируется спецификация POSIX):
- Переменные поля
- Ввод из функции getline()
- FILENAME
- Элементы массива ARGV
- Элементы массива ENVIRON
- Элементы массива, созданные функцией split()
- Назначение переменной командной строки
- Назначение переменной из другого числового строковая переменная
должна считаться числовой строкой , если ее значение оказывается числовым (допуская начальные и конечные пробелы, с вариациями между реализациями для поддержки шестнадцатеричного, восьмеричного, inf, nan...) .
Литеральная строковая константа "3.14"
является строкой, а не строкой, поскольку она не получена ни из одного из этих источников.
x = "3.14"; if (x == 3.14) print "yes"
печатает да, но это потому, что он выполняет лексическое сравнение (в зависимости от реализации, используя memcmp()
, strcmp()
или strcollate()
) из 3.14
и преобразование в строку (через строку формата CONVFMT
, %.6g
в gawk
и многих других реализациях) этого номера 3.14
. То есть с этим значением CONVFMT
, (x == 3,14)
совпадает с (x == "3,14")
.
(x будет ложным, потому что
3.14
сортируется лексически после 12
(то же, что ("3.14" ). С
CONVFMT = "%.6e"
, (x == 3.14)
также вернет false, потому что это становится ("3.14" == "3.140000e+00")
.
С другой стороны, в:
"echo \"3.1400 \"" | getline x
if (x == 3.14) print "yes"
if (x < 12) print "yes"
yes
печатается дважды независимо от значения CONVFMT
, потому что выполняется численное сравнение. x
— это strnum, потому что он получен из getline
и имеет числовое значение.
Тем не менее, он по-прежнему сохраняет свое строковое значение. print x
напечатает "3.1400"
независимо от значения OFMT
или CONVFMT
.
И:
"echo 3.14 foo" | getline x
if (x == 3.14) print "yes"
Не печатает да
. x
происходит от getline
, но не имеет числового значения (из-за foo
). Это обычная строка, как если бы вы написали x = "3.14 foo"
. Тем не менее, вы сможете выполнять с ним числовые операции:
print x + 1
Выведет 4.14
. Выше, поскольку это связано с числовой операцией, строка преобразуется в число путем просмотра начальной части (после возможных пробелов), которая выглядит как число в начале строки.
Итак, (x+0 == 3.14)
и (x+0 также вернут true.
x+0
является числовым, поэтому у нас есть числовое сравнение.
Обратите внимание, что inf
, nan
, Infinity
не распознаются как числа с плавающей запятой inf
или nan
. специальные значения в качестве констант, но в некоторых реализациях awk
вы можете вместо этого использовать ("inf"+0)
.