Ответ 1
Используйте конструкцию $( ... )
:
hash=$(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)
У меня есть script такой
genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5
Я хочу получить поток, генерируемый genhash в переменной. Как перенаправить его в переменную $hash
для сравнения внутри условного?
if [ $hash -ne 0 ]
then echo KO
exit 0
else echo -n OK
exit 0
fi
Используйте конструкцию $( ... )
:
hash=$(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)
Конечно, все эти другие ответы показывают, как не делать то, что задал ОП, но это действительно замалчивает всех нас, которые искали вопрос ОП.
read
.# I would usually do this on one line, but for readability...
series | of | commands \
| \
(
read string;
mystic_command --opt "$string" /path/to/file
) \
| \
handle_mystified_file
Предположим, что series | of | commands
- очень сложная серия команд с каналами.
mystic_command
может принимать содержимое файла как stdin вместо пути к файлу, но не --opt
arg, поэтому он должен входить как переменная. Команда выводит измененный контент и обычно перенаправляется в файл или передается по другой команде. (Например, sed
, awk
, perl
и т.д.)
read
принимает stdin и помещает его в переменную $string
Помещение read
и mystic_command
в "подклассу" через скобки не требуется, но заставляет его течь как непрерывный канал, как если бы две команды находились в отдельном файле script.
Всегда есть альтернатива, и в этом случае альтернатива уродлива и нечитаема:
mystic_command --opt "$(series | of | commands)" /path/to/file | handle_mystified_file
По сравнению с
series | of | commands | (read string; mystic_command --opt "$string" /path/to/file) | handle_mystified_file
Это полностью хронологически и логично.
read hash < <(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)
В этом методе используется Bash " замена процесса" не следует путать с " замена команды".
Вот несколько хороших ссылок:
Я предполагаю совместимый способ:
hash=`genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5`
но я предпочитаю
hash="$(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)"
Если конвейер слишком сложный для переноса в $(...)
, рассмотрите возможность записи функции. Доступны любые локальные переменные, доступные во время определения.
function getHash {
genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5
}
hash=$(getHash)
http://www.gnu.org/software/bash/manual/bashref.html#Shell-Functions
Вы можете сделать:
hash=$(genhash --use-ssl -s $IP -p 443 --url $URL)
или
hash=`genhash --use-ssl -s $IP -p 443 --url $URL`
Если вы хотите, чтобы весь цельный канал был назначен переменной, вы можете использовать весь конвейер в указанных выше назначениях.
Иногда я получаю ошибку при использовании конструктора $(`code`)
.
Наконец, я получил некоторый подход к этому: fooobar.com/info/53119/...
В принципе, используя Tee, чтобы снова прочитать вывод и вставить его в переменную. Theres, как вы видите нормальный выход, затем читайте его из выпадающего меню.
нет? Я предполагаю, что ваша текущая задача genhash выведет только это, однострочный хэш может работать для вас.
Im so neewbie и все еще ищет полный выход и сохраняет в команде 1. С наилучшими пожеланиями.