Как перенаправить вывод на переменную в оболочке?



у меня есть такой скрипт



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
515   8  

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

вот что он делает и зачем это важно:

  1. давайте притворимся, что series | of | commands - это очень сложная серия набор команд.

  2. mystic_command может принимать содержимое файла как stdin вместо пути к файлу, но не --opt arg поэтому он должен входить как переменная. Команда выводит измененное содержимое и обычно перенаправляется в файл или передается в другую команду. (Например,sed,awk,perl, так далее.)

  3. read берет stdin и помещает его в переменную $string

  4. поставить 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

    Ничего не найдено.