Это:
if
first list of commands
then
second list of commands
else
third list of commands
fi
Это для запуска второго списка команд, если первый список команд возвращает true/success (ноль) статус выхода, то есть, если последняя команда запуска возвращается с нулевым статусом выхода.
В:
var=-2 && ((var += 2))
Это cmd1 && cmd2
, где cmd2
запускается только в случае успешного выполнения cmd1
.
var=-2
Обычно выполняется успешно, если $var
не был сделан доступным только для чтения, поэтому будет запущена команда ((var += 2))
:
((arithmetic expression))
Возвращает success/true, если выражение вычислено правильно (без синтаксической ошибки) и результат выражения отличен от нуля.
((123))
, ((1 + 1))
, ((1 == 1))
вернуть истину ((0))
, ((-2 + 2))
, ((2 == -2))
возвращают false. ((4294967296 * 4294967296))
возвращает false в большинстве оболочек из-за переноса 64-битных целых чисел var += 2
как арифметическое выражение, выполняет присваивание и разрешается в присваиваемое значение, здесь 0, следовательно, статус выхода false.
Вы можете увидеть значение, на котором основан статус выхода, используя синтаксис арифметического расширения $((...))
:
$ echo "$((1 + 1)) $((2 == 2)) $((2 == -2)) $((var = -2)) $((var += 2))"
2 1 0 -2 0
Или присвоив его переменной:
$ var=-2; ((result = (var += 2)))
$ echo "$? $result $var"
1 0 0
$?
содержит статус выхода предыдущей команды.Что касается if
/then
/else
/fi
, 0 означает истину, все остальное означает ложь.
Путаница здесь возникает из-за того, что для арифметических выражений все наоборот: 0
означает ложь, а все остальное означает истину (например, 2 == 2
равно 1
, а 2 < 1
равно 0
).
Чтобы не беспокоиться о разнице, просто забудьте о $?
и его возможных значениях. Просто подумайте в терминах логического истина/ложь, успех/неудача.
grep -q foo file
Возвращает true, если foo
находится в file
.
[ "$a" = "$b" ]
Возвращает true, если $a
содержит то же самое, что и $b
.
((6 * 3 - 12))
((4 == 1))
Вернуть true, если результатом арифметического выражения является ненулевое число.
Неважно, выражены ли эти true/false в терминах 0 или 1 статуса выхода этих grep
/ Команды [
или конструкция ((...))
.
Когда вы передаете несколько шаблонов, grep ищет строки, которые соответствуют хотя бы одному из шаблонов. Другими словами, передача нескольких шаблонов эквивалентна передаче их как одного шаблона в сочетании с оператором "или" (|
в синтаксисе ERE (grep -E
)). В основном это полезно для синтаксиса шаблонов BRE (простой grep
) и строкового (grep -F
), где оператор "или" - это новая строка, которую нежелательно передавать в качестве параметра.
Вы можете передавать несколько шаблонов, повторяя опцию -e
или используя опцию -f
с многострочным файлом (или несколько раз).