У меня есть следующий код, в котором я пытаюсь проверить, получает ли машина свой IP-адрес от dhcp или он статический. Код должен работать как для Ubuntu, так и для sles 12. Теперь, если я использую код на sles, я получаю сообщение об ошибке, что файл не найден, что нормально. Но я не хочу, чтобы пользователь видел это сообщение. Есть ли способ перенаправить вывод оператора if? Обычное перенаправление не работает.
Я уже пытался поставить if [[ ${statement} ]] &> /dev/null после оператора if, но это ничего не меняет.
if [[ ! "$(grep "dhcp4: true" /etc/netplan/50-cloud-init.yaml | awk '{print $2}')" == "true" ]] || [[ ! "$(grep 'BOOTPROTO' /etc/sysconfig/network/ifcfg-eth0 | cut -d '=' -f2 | sed "s/'//g" | xargs)" == "dhcp" ]]
then
# more code...
fi
Если у кого-то есть лучшее решение для проверки того, получает ли клиент IP-адрес через dhcp, я был бы признателен, если бы вы сообщили мне об этом.
Поэтому я попробовал новый подход, но он меня не очень устраивает. Подход выглядит следующим образом:
if [[ ${osname1} == "Ubuntu" ]]
then
statement = "$(grep 'dhcp4: true' /etc/netplan/50-cloud-init.yaml | awk '{print $2}')"
matchword = "true"
else
statement = "$(grep 'BOOTPROTO' /etc/sysconfig/network/ifcfg-eth0 | cut -d '=' -f2 | sed "s/'//g" | xargs)"
matchword = "dhcp"
fi
if [[ ! ${statement} == ${matchword} ]]
then
# more statements
fi
отличное улучшение вашего Q! Мы можем удалить то, что теперь является посторонними комментариями. Удачи.
Во-первых, я не думаю, что if [[ .... ]] &> /dev/null может зафиксировать какой-либо вывод (хотя я вижу, что это может быть хорошей идеей). Вам нужно перенаправить вывод отдельных программ или, если вам это нравится, группы, такой как { echo stdout ; echo stderr >&2 ; } &> /dev/ null. Я предпочитаю использовать перенаправления «старой школы», поэтому { echo stdout; echo stderr >&2 ; } > /dev/null 2>&1 является эквивалентом. Итак, вы хотите что-то вроде grep 'srchStr' /path/to/file 2> /dev/null | more stuff. Обратите внимание, что &> также отправит стандартный вывод на /dev/null
Я думаю, что вашу вторую идею/блок кода гораздо легче понять, какова ваша цель, и другим будет легче поддерживать ее после того, как вас повысят ;-). Но это else состояние довольно мучительное. можно использовать завершающий xargs без какой-либо программы для вызова, но это не традиционное использование. Вам нужно будет объяснить это в комментарии к вашему коду. Но... Хм... см. мой ответ ниже.
@shellter спасибо за отзыв. Я удалил xargs, так как в этом нет необходимости. Я не помню, почему он был у меня в команде, прошло некоторое время с тех пор, как я прикасался к этому скрипту, но я должен поддерживать его сейчас, чтобы он работал и в других дистрибутивах. Я очень ценю вашу помощь!





Работая со своей второй идеей кода,
if [[ ${osname1} == "Ubuntu" ]] ; then
if awk 'BEGIN{fnd=1};/dhcp4: true/{fnd=0} ; END{exit fnd}' /etc/netplan/50-cloud-init.yaml ; then
# we're setting the shell return value for fnd, so it's fnd=1 indicates error, 0 indicates success
matchword = "true"
fi
else
# statement = "$(grep 'BOOTPROTO' /etc/sysconfig/network/ifcfg-eth0 | cut -d '=' -f2 | sed "s/'//g" | xargs)"
if awk 'BEGIN{fnd=1};/BOOTPROTO/{fnd=0);END{exit fnd}' /etc/sysconfig/network/ifcfg-eth0]] ;then
matchword = "dhcp"
fi
fi
if [[ ${matchword} == "dncp" ]]
then
# dhcp stuff statements
elif [[ ${matchword] = "true" ]] ; then
# true stuff staments
else
echo "Found value for matchword = "XX${matchword}ZZ", can't continue"
exit 1
fi
Я бы использовал оператор case для финального блока.
Обратите внимание, что нам не нужны пары [[ ... ]], когда мы проверяем возвращаемое значение вызываемой программы, отсюда и вид кода awk 'END{exit retVal}'.
------- Редактировать -------
И поскольку мы полагаемся только на нахождение определенного термина в определенном файле и НЕ анализируем вывод каким-либо образом, это можно упростить, заменив скрипты awk простым grep -q, т.е.
if [[ ${osname1} == "Ubuntu" ]] ; then
if grep -q 'dhcp4: true' /etc/netplan/50-cloud-init.yaml ; then
# grep returns true if it finds the search target in the supplied filelist
matchword = "true"
fi
else
if grep -q 'BOOTPROTO' /etc/sysconfig/network/ifcfg-eth0 ;then
matchword = "dhcp"
fi
fi
----------- конец редактирования ---------
Не проверено, так как у меня нет этих операционных систем или файлов и их содержимого.
Хм, у меня был еще один комментарий, но я отвлекся на очистку своего кода. Когда я подумаю об этом, я добавлю это в качестве комментария ниже.
IHTH
@LaurentHee: Спасибо за "вотум доверия". Я внес еще несколько изменений и, возможно, добавлю еще один комментарий позже. Рад, что это помогло. Используйте свой пересмотренный вопрос в качестве модели для будущих вопросов, которые вы публикуете, и вы получите хорошую помощь. Удачи.
Спасибо за время, которое вы инвестируете, чтобы помочь! Вы делаете мир лучше. Я запомню это. Желаю вам тоже удачи.
@LaurentHee: сделал еще одно важное изменение, которое вы, возможно, захотите проверить.
Возможный дубликат Как я могу сделать так, чтобы grep не распечатывал ошибки «Нет такого файла или каталога»?