Получить вывод команды в операторе if в переменную - PullRequest
0 голосов
/ 08 июля 2019

Мне нужны записи в Ansible hostfile, которые должны быть отформатированы таким образом, чтобы их можно было использовать в обычном файле хоста в Linux. Я могу добиться этого, дважды вызвав в моем скрипте nslookup.

Цель - вызвать nslookup только один раз, но я не знаю, как преобразовать вывод nslookup в операторе if в переменную.

Я пробовал это

if [[ $(nslookup $i > $DNSHOST) && $? == 0 ]]
if [[ $(nslookup $i > $DNSHOST && $? == 0) ]]
if  (($(nslookup $i > $DNSHOST) && $? == 0))
if [[ $("nslookup $i > $DNSHOST") && $? == 0 ]]

... и много других комбинаций, но ничего не работает ??

Этот скрипт работает и выполняет свою работу:

for i in $HOSTS; do

                if [[ $(nslookup $i) && $? == 0 ]]; then

                        nslookup $i | sed -e '1,3d;6d' | cut -d$'\t' -f2 | cut -d ' ' -f2 | xargs -n2 | awk '{print $2,"\t",$1}'

                fi
done

Это тот, кого я не могу заставить работать:

for i in $HOSTS; do

        if [[ $(nslookup $i > $DNSHOST) && $? == 0 ]]; then

                cat $DNSHOST | sed -e '1,3d;6d' | cut -d$'\t' -f2 | cut -d ' ' -f2 | xargs -n2 | awk '{print $2,"\t\t",$1}'

        fi
done

Когда я использую двойные кавычки, я получаю сообщение об ошибке «каталог не существует». Иначе он просто зацикливается на списке хостов без nslookup.

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Не совсем уверен, что вы хотите.

Но это выглядит любопытно:

if [[ $(nslookup $i > $DNSHOST) && $? == 0 ]]

Попробуйте вместо:

if nslookup $i > $DNSHOST
0 голосов
/ 08 июля 2019

Если вы хотите захватить вывод nslookup, вы все равно можете сделать это в условной части команды if:

if output=$( nslookup ... ); then 
    # do something with "$output"
fi

Проблемы с if [[ $(nslookup $i > $DNSHOST) && $? == 0 ]]

  • у вас есть 2 выражения: $(nslookup $i > $dnshost) и $? == 0
  • && с короткими замыканиями, поэтому, если первое выражение оценивается как ложное, логический результат не может быть истинным, а 2-е выражение не считается.
  • Первое выражение:
    • , поскольку имеется только один операнд, значение true / false определяется длиной строки операнда
    • , как выперенаправьте вывод в файл, стандартным результатом вывода команды подстановки будет пустая строка.
    • пустая строка в качестве выражения false.

Обратите внимание, что условие команды if не имеет в квадратных скобках.Если вы хотите написать команду if, которая будет действовать при статусе выхода какой-либо команды, просто введите
if some_command; then ...; else ...; fi

В интерактивном режиме: help if, help [[, help test

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...