Как несколько шаблонов, указанных в файле с `-f` до` grep`, работают вместе?

Это:

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/ Команды [ или конструкция ((...)).

0
26.02.2017, 23:58
1 ответ

Когда вы передаете несколько шаблонов, grep ищет строки, которые соответствуют хотя бы одному из шаблонов. Другими словами, передача нескольких шаблонов эквивалентна передаче их как одного шаблона в сочетании с оператором "или" (| в синтаксисе ERE (grep -E)). В основном это полезно для синтаксиса шаблонов BRE (простой grep) и строкового (grep -F), где оператор "или" - это новая строка, которую нежелательно передавать в качестве параметра.

Вы можете передавать несколько шаблонов, повторяя опцию -e или используя опцию -f с многострочным файлом (или несколько раз).

3
28.01.2020, 02:25

Теги

Похожие вопросы