Как перенаправить вывод на переменную в оболочке?
у меня есть такой скрипт
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
8 ответов:
использовать
$( ... )конструкция:hash=$(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)
TL; DR
в магазине
"abc"на$foo:echo "abc" | read foo
конечно, все эти другие ответы показывают способы не делать то, что ОП спросил, но это действительно портит остальных из нас, кто искал вопрос ОП.
ответ на вопрос заключается в использовании
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 вместо пути к файлу, но не--optarg поэтому он должен входить как переменная. Команда выводит измененное содержимое и обычно перенаправляется в файл или передается в другую команду. (Например,sed,awk,perl, так далее.)
readберет stdin и помещает его в переменную$stringпоставить
readиmystic_commandв "sub shell" через скобки не нужно, но делает его поток как непрерывная труба, как будто 2 команды, где в отдельном файле сценария.всегда есть альтернатива, и в этом случае альтернатива уродлива и нечитабельна по сравнению с моим примером выше.
# my example above as a oneliner series | of | commands | (read string; mystic_command --opt "$string" /path/to/file) | handle_mystified_file # ugly and unreadable alternative mystic_command --opt "$(series | of | commands)" /path/to/file | handle_mystified_fileмой путь полностью хронологическом и логично. Альтернатива начинается с 4-й команды и толкает команды 1, 2 и 3 в подстановку команд.
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`Если вы хотите, чтобы результат всего трубопровода был назначен переменной, вы можете использовать весь трубопровод в вышеуказанных назначениях.
создать функцию, назвав ее как команду, которую вы хотите вызвать. В этом случае, мне нужно использовать ruok.
затем вызовите функцию и назначьте ее результат в переменную. В этом случае я присваиваю результат переменной здоровье.
function ruok { echo ruok | nc *ip* 2181 } health=echo ruok *ip*
Я получил ошибку иногда при использовании
$(`code`)конструктор.наконец-то я получил некоторый подход к этому здесь:https://stackoverflow.com/a/7902174/2480481
в основном, используя Tee, чтобы снова прочитать выход и поместить его в переменную. Там, как вы видите нормальный выход, а затем прочитать его из выхода.
нет? Я думаю, что ваша текущая задача genhash выведет именно это, один строковый хэш, поэтому может работать для вас.
Im so neewbie и все еще ищет полный вывод и сохранение в 1 команду. С уважением.
Comments