Смешивание, если ..; с {command-grouping} и [[test]] и логическими операторами [closed]

-v , который вы передали, заставляет его делать противоположное тому, что вы намереваетесь - он показывает вам для каждой строки в sitelist1.txt все строки в sitelist2.txt , которые не совпадают. Готов поспорить, вы видите много дубликатов. Вы хотите использовать ту же команду без параметра -v :

fgrep -f sitelist1.txt sitelist2.txt

Это приведет к выполнению следующей английской директивы: Для каждой строки в sitelist1.txt покажите мне все строки в sitelist2.txt , которые содержат строку файла 1, которая меня интересует, как целую строку или как часть строки файла 2.

Параметр -v - это параметр «инвертировать совпадение», который показывает все несовпадающие строки.

4
16.08.2018, 23:33
3 ответа

Вы можете использовать подоболочку для группировки:

if cmd1 || ( [[ "$x" == 'z' ]] && cmd2 ); then
 ...
else
 ...
fi
4
27.01.2020, 20:49

Работает нормально:

cmd1() { return 1; }
cmd2() { return 0; }
x=z
if cmd1 || { [[ "$x" = "z" ]] && cmd2; }; then
   echo Success
else
   echo Failure
fi
Success

Вы уверены, что не запускаете этот код в sh? Это даст вам что-то вроде

sh: 4: [[: not found
4
27.01.2020, 20:49

Код в вопросе должен нормально работать в реальной оболочке, но я понимаю, что какая-то другая программа не сможет его проанализировать. Предполагая, что мы не можем исправить эту программу, обходной путь может состоять в том, чтобы разделить вторую часть условия на функцию:

cond2() { [[ "$x" = "z" ]] && cmd2; }
if cmd1 || cond2; then
    ...

Это не так кратко, но если синтаксический анализатор стоит чего-либо , он должен быть в состоянии проанализировать определение этой функции.

0
27.01.2020, 20:49

Теги

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