Похоже, вы отправляете общедоступную версию своего ключа вместо личной.
Попробуйте изменить:
/Users/jay/.ssh/id_rsa.pub
на
/Users/jay/.ssh/id_rsa
Вы можете использовать
output=$(grep -c 'name' inputfile)
Переменная output
будет содержать число 0
, 1
или 2
. Затем вы можете использовать оператор if
для выполнения различных действий.
Если вам нужен результат 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
Это довольно просто:
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"
)если у вас нет веской причины не делать этого, и вы уверены, что знаете, что делаете.
Попробуйте этот код, я чувствую, он делает то, что вам нужно.
grep
в переменную OUTPUT
grep
статус выхода как логическое значение. Это 0 или 1, и это не подходит для вашей задачи. Вам нужно количество строк -0, 1, 2 и т.д. Поэтому посчитайте строки в переменной OUTPUT и подставьте это число во вторую переменную-line_count
. В результате мы получим две переменные. Первый с выводом grep, второй с количеством строк. 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