Арифметическая команда считается успешной, если значение арифметического выражения не равно нулю. Если значение выражения равно 0, команда завершается ошибкой со статусом 1.Это позволяет использовать арифметические команды в тестах, поскольку логические операторы в арифметических выражениях оболочки возвращают 0 для истины и 1 для false (как в C). Например,
if ((x==3)); then …
работает, потому что ((x == 3))
возвращает 0, когда $ x
равно 3, и 1 в противном случае.
Оператор постфиксного приращения возвращает старое значение переменной. Итак, ((var ++))
возвращает статус ошибки, если var
ранее был равен нулю.
set -e
указывает оболочке завершить работу при первой неудачной команде. Никаких сюрпризов.
Чтобы избежать нежелательных ошибок, возникающих из-за арифметических выражений, которые на законных основаниях могут иметь значение 0, не используйте арифметические команды, используйте обычное присваивание с арифметическим выражением.
var=$((var+1))
Это все связано с вашей оболочкой, а не с awk
.
В Bourne -, как и в оболочках, \
, '...'
и "..."
являются операторами кавычек.
Заключение в кавычки удаляет особое значение, которое символ может иметь в синтаксисе оболочки. \
заключает в кавычки один символ (, за исключением символа новой строки, который вместо этого удаляется ), '...'
и "..."
может заключать в кавычки более одного (с "..."
, а не заключает в кавычки каждый символ ).
;
— это специальный символ в синтаксисе оболочки. Он используется для разделения команд. Вам нужно заключить его в кавычки, если вы хотите дословно передать его команде. \;
, ';'
подойдут.
";"
также подойдет, так как ;
не является одним из тех символов, которые все еще являются специальными в двойных кавычках, но вам потребуется "\\"
, чтобы передать одну буквальную обратную косую черту команде, потому что \
является одним из тех символов, которые по-прежнему являются особыми внутри "..."
(, хотя тогда они становятся особенными только тогда, когда за ними следуют другие специальные символы внутри "..."
, такие как сам "
).
Опять же, очень многое зависит от оболочки. Например, в оболочке rc
\
и "
не являются специальными, не говоря уже о кавычках, -F\;
не будет работать там, поскольку команда будет анализироваться как команды awk -F\
и ...
, разделенные с ;
.
См. Как использовать специальный символ как обычный? для получения более подробной информации.
Чтобы еще больше усложнить ситуацию,обратите внимание, что сам аргумент -F
также проходит через один или два уровня обработки обратной косой черты с помощью awk .
awk
сначала обрабатывает полученный аргумент, чтобы расширить в нем escape-последовательности ANSI C. Если вы используете awk -F '\t'
, или awk -F \\t
, или awk -F "\\t"
, или awk -F "\t"
, awk
получает аргумент, содержащий \t
, который расширяется до символа TAB. Переменная FS
awk будет содержать символ TAB, а не \t
.
С помощью awk -F '\\'
awk
получает аргумент \\
и устанавливает FS
в символ \
. Строго говоря, awk -F '\'
will не определено, так как эта escape-последовательность не завершена, но на практике, за исключением busybox awk
, все известные мне реализации awk
обрабатывают ее так же, как awk -F '\\'
.
В awk
, когда FS
содержит один символ, этот символ является разделителем полей. awk -F.
разбивает записи на точечные символы.
Однако, когда FS
содержит более одного символа, оно интерпретируется как регулярное выражение. awk -F..
распространяется не на последовательности из двух точек, а на последовательности из любых двух символов, поскольку .
— это оператор регулярного выражения, который соответствует любому одиночному символу. Чтобы разделить на две точки, вам понадобится awk -F '[.][.]'
или awk -F '\\.\\.'
.
С awk -F '\\\\'
литерал \\\\
передается оболочкой в awk
, awk
расширяет каждый из этих двух \\
в \
, так что FS
становится \\
, что является рассматривается как регулярное выражение. \
также имеет особое значение в синтаксисе регулярных выражений и на этот раз используется для удаления специального значения символа в качестве оператора регулярного выражения . Итак, опять же, это разбиение на символы обратной косой черты, но на этот раз в виде регулярного выражения.
Так вот, на практике для разделения на \
все эти (в борне -как снаряды )будут работать:
awk -F '\' # FS becomes a single \ except in busybox where it's empty
awk -F "\\" # instead so it's a one-character split on backslash
awk -F \\ # and a one-field-by-character split in busybox
awk -F '\\' # FS becomes a single \ in every awk implementation
awk -F \\\\ # so one-character split on backslash
awk -F "\\\\"
awk -F '\\\' # FS is \ on busybox and \\ in other implementations
awk -F \\\\\\ # so one-character split on backslash in busybox and
awk -F "\\\\\\" # \\ regex split in other implementations, to the same effect
awk -F '\\\\' # FS is \\ in all implementations so
awk -F \\\\\\\\ # \\ regex split
awk -F "\\\\\\\"
Я бы посоветовал использовать одинарные кавычки, так как это самый простой и наименее неожиданный вид кавычек. Итак, переносимое разделение на обратную косую черту:awk -F '\\'
.
Вы также можете делать такие вещи, как:
awk -v FS='\\'...
или
awk 'BEGIN{FS="\\"}...'
или
awk... 'FS=\\'
или:
FS='\' awk 'BEGIN{FS = ENVIRON["FS"]}...'
(, что позволяет избежать дополнительной обратной косой черты, выполняемой awk
, поэтому требуется только одна обратная косая черта ).
Все символы в одинарных кавычках обрабатываются буквально (, т. е. между парой одинарных кавычек нет специальных символов ). Без одинарных кавычек вам нужно использовать обратную косую черту -для экранирования символа со специальным значением, если вы хотите использовать буквальный символ.
Это правила цитирования оболочки, не связанные с awk.