получить вывод и возвращаемое значение grep за одну операцию в bash

Похоже, вы отправляете общедоступную версию своего ключа вместо личной.

Попробуйте изменить:

/Users/jay/.ssh/id_rsa.pub

на

/Users/jay/.ssh/id_rsa

7
22.06.2017, 20:01
4 ответа

Вы можете использовать

output=$(grep -c 'name' inputfile)

Переменная outputбудет содержать число 0, 1или 2. Затем вы можете использовать оператор ifдля выполнения различных действий.

14
27.01.2020, 20:16

Если вам нужен результат grep, вы не можете использовать флаг -c, как указано в другом ответе. Что вы можете сделать, так это запустить дважды, один раз с флагом -c, чтобы получить количество совпадений, и один раз без флага -c, чтобы увидеть совпадения. Однако это может быть очень неэффективно, в зависимости от размера вашего входного файла.

Вы можете сделать что-то вроде этого:

Содержимое ввода :

The first line is foo
I have a drink at the bar
The third line is foo again

Содержимое скрипта :

#!/usr/bin/env bash

countMatches(){
    echo Searching for "${1}"
    result=$(grep "${1}" input)
    if [ $? -eq 1 ]; then
        echo No match found
        echo
        exit 1
    fi

    if [ $(echo "${result}" | wc -l) -eq 1 ]; then
        echo 1 match found:
        echo "${result}"
        echo
    else
        echo 2 matches found:
        echo "${result}"
        echo
    fi
}

countMatches foo
countMatches bar
countMatches baz

А вот вывод при вызове скрипта :

Searching for foo
2 matches found:
The first line is foo
The third line is foo again

Searching for bar
1 match found:
I have a drink at the bar

Searching for baz
No match found
1
27.01.2020, 20:16

Это довольно просто:

OUTPUT=$(pfiles "$1" 2> /dev/null | grep peername)
grep_return_code=$?

Если подстановка команды $(…)назначена переменной, $?получит код возврата из последней команды в $(…). И, конечно же, вам не нужно явно ссылаться на $?; вы можете делать такие вещи, как

if OUTPUT=$(pfiles "$1" 2> /dev/null | grep peername)
then
    # the rest of the script
                ︙
fi

или

if ! OUTPUT=$(pfiles "$1" 2> /dev/null | grep peername)
then
    exit
fi
# the rest of the script

Этот подход полезен в ситуациях, когда вывод команды и его код возврата (, также известный как статус выхода ), не коррелированы. Но для grepони сильно коррелированы :Если он произвел вывод, он преуспел. Если он не произвел вывода, он потерпел неудачу. Так почему бы просто не протестировать вывод  ?

OUTPUT=$(pfiles "$1" 2> /dev/null | grep peername)
if [ "$OUTPUT" ]
then
    # the rest of the script
                ︙
fi

или

OUTPUT=$(pfiles "$1" 2> /dev/null | grep peername)
if [-z "$OUTPUT" ]
then
    exit
fi
# the rest of the script

П.С. Вы всегда должны заключать ссылки на переменные оболочки в кавычки (, например,"$1")если у вас нет веской причины не делать этого, и вы уверены, что знаете, что делаете.

3
27.01.2020, 20:16

Попробуйте этот код, я чувствую, он делает то, что вам нужно.

  1. Я поместил вывод grepв переменную OUTPUT
  2. Я думаю, вам не нужен grepстатус выхода как логическое значение. Это 0 или 1, и это не подходит для вашей задачи. Вам нужно количество строк -0, 1, 2 и т.д. Поэтому посчитайте строки в переменной OUTPUT и подставьте это число во вторую переменную-line_count. В результате мы получим две переменные. Первый с выводом grep, второй с количеством строк.
  3. Затем проверьте line_countв операторе caseи выполните необходимые действия.

Использование:./switching_by_grep_result.sh your_file.txt

#!/bin/bash

# your code
OUTPUT=$(pfiles $1 2> /dev/null | grep name) # $1 Process Id

# count lines in the OUTPUT variable by using 'grep -c'
line_count=$(echo -n "$OUTPUT" | grep -c '^')

# checks lines count in here and invokes needed script or exit.
# if 0 lines - exit
# if 1 lines - invoke A
# if any other number of lines - invoke B
case $line_count in  
    0) echo 'exit'
    ;;  
    1) echo 'A() script invoking here'
    ;;  
    *) echo 'B() script invoking here'
    ;;  
esac
0
27.01.2020, 20:16

Теги

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