4

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

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

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

if !( printf '%s\n' "${startLineNrs[@]}" | grep -xq "${startLineNr}" ); then startLineNrs+=("$startLineNr") ; fi

2 ответа2

3

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

if printf '%s\n' "${startLineNrs[@]}" | grep -xq "$startLineNr"; then
  # your logic
fi

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

3

Чтобы сделать && - || Командная работа, попробуйте:

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

Заметки:

  1. Тестовая команда ([) и подстановка команд ($(...)) не нужны.

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .