Проверка состояния выхода grep с ошибкой канала и переменной

1237
uldics

Мне нужна как можно более короткая команда bash test (скобочный тест), чтобы оценить результат конвейерного grep с переменной в качестве аргумента поиска. Я проверяю, есть ли новая строка в массиве - отправляя содержимое массива в виде строк в grep и проверяя код выхода. Но это как-то не работает. Не находит значение в массиве. Я пытался по-разному скобки, скобки, кавычки, точки с запятой без удачи. Что здесь не так?

#! /bin/bash startLineNrs=(); startLineNrs+=("45"); startLineNrs+=("280"); startLineNrs+=("80"); startLineNr="280"; echo "\$startLineNrs:" ${#startLineNrs[@]}; printf '%s\n' "$"; [ "$(printf '%s\n' $ | grep -xq $)" ] && { echo $?; echo Found ;} || { echo $?; echo Not found ;} 

По сути, я хочу понять, если ... тогда построить против теста скобок. Метод if ... then работает:

if !( printf '%s\n' "$" | grep -xq "$" ); then startLineNrs+=("$startLineNr") ; fi 
4
К вашему сведению, `$?` Возвращает только последний статус выхода канала, если у вас более длинный ряд каналов, вам может понадобиться $ PIPESTATUS Xen2050 6 лет назад 1

2 ответа на вопрос

3
John1024

Для того, чтобы сделать &&- ||командную работу, попробуйте:

printf '%s\n' $ | grep -xq $ && { echo $?; echo Found ;} || { echo $?; echo Not found ;} 

Заметки:

  1. Команда test ( [) и команда substitution ( $(...)) не нужны.

  2. Тонкость конструкции a && b || cзаключается в том, что cона будет выполнена не только в случае aсбоя, но и в случае bсбоя. Так как ваш bсостоит из echoутверждений, которые обычно должны быть успешными, это обычно не должно быть проблемой.

  3. Другие методы тестирования членства в массиве см. В разделе «Проверка наличия в массиве Bash значения» .

2
codeforester

Правильный способ написать ваше утверждение if:

if printf '%s\n' "$" | grep -xq "$startLineNr"; then # your logic fi 

Проблема с вашим оператором test [...]заключается в том, что он [или testобрабатывается "$(printf '%s\n' $ | grep -xq $)как строка, и он не запускается как подстановка команд. Поскольку это непустая строка, она всегда будет иметь значение true.