Избавление от пробелов в возвращаемой строке в bash

Это продолжение другой темы здесь. https://shorturl.at/kyAu3

Я получаю enigineID SMMPv3 от нескольких тысяч устройств, которые могут быть заменены новыми в любое время из-за поломки/исправления. У меня есть входной список устройств. Мне нужно записать этот результат в /etc/snmp/snmptrapd.conf, когда все будет сказано и сделано.

createUser -e 800092C404534E2D353332303435383232 UserName SHA Authphrase AES passphrase

Вот что я делаю

while IFS=, read -r myIP UserIn _
do
    UserName=''
   
    case $UserIn in
      EverNeXT)
          UserName = "DeviceType_1"
          ;;
      UPS)
          UserName = "DeviceType_2"
          ;;
      *)
          echo "$(date '+%Y-%m-%d %H:%M:%S') Exception! Missing or incorrect information in $DeviceList, look for $myIP or $UserIn" >> $myLog
          UserName = "foobar"
    esac

Затем я выполняю snmpget для указанных выше полных доменных имен, чтобы получить engineID, который представляет собой шестнадцатеричную строку с пробелом между каждыми двумя значениями. Мне нужно убрать пробелы и записать это в snmptrapd.conf.

if test $snmpget_RC -eq 0
then
    set -- $(snmpget -v3 -l authPriv -u $UserName -a SHA -A Authphrase -x AES -X Passphrase $myIP SNMP-FRAMEWORK-MIB::snmpEngineID.0)
    shift 3
    IFS = ""
    echo "Hex value for $myIP is $*"
    echo 'createUser -e' "$*" $UserName' SHA Authphrase AES Passphrase ' >>$snmpPath/$MyFile
else
    echo "$(date '+%Y-%m-%d %H:%M:%S') $myIP is not reachable" >> $myLog
    RC=0
fi

Я получил очень ценную помощь в другой теме, но комментарии не позволяют мне публиковать дополнительную информацию, и я не отвечаю на свой вопрос.

Я получаю один экземпляр engineID, написанный правильно, но остальное — мусор. Вот как выглядит соответствующая часть моего snmptrapd.conf после завершения

createUser -e 800092C404534E2D353332303435383232 UserName SHA Authphrase AES passphrase
createUser -e SNMP-FRAMEWORK-MIB::snmpEngineID.0 = Hex-STRING: 80 00 92 C4 04 53 4E 2D 35 33 32 30 36 30 35 37
39  UserName SHA Authphrase AES Passphrase

Первая строка идеальна, остальное непригодно для использования. Это потому, что я использую IFS дважды? или что-то другое? Что еще более важно, как мне сделать так, чтобы все строки в snmptrapd.conf были такими же, как первая?

С уважением, Том

Поставьте set -x в начале скрипта, тогда вы увидите расшифровку всех команд с заменой переменных.

Barmar 26.06.2024 23:46

Ваше изменение на IFS на первой итерации цикла все равно будет действовать на следующей итерации. Таким образом, это меняет способ разделения вывода snmpget на слова. Зачем нужен IFS = ""?

Barmar 26.06.2024 23:47

мне кажется, что у вас проблемы с обработкой звонка snmpget; если это правильно, обновите вопрос, сосредоточив внимание исключительно на вызове snmpget (например, удалите (ненужный и неполный) блок кода while/case); вы показали 3 разные строки вывода... обновите вопрос, чтобы показать полный необработанный результат 3 вызовов snmpget, которые сгенерировали ваши 3 строки вывода; также обновите вопрос (правильными) ожидаемыми createUser командами для тех же 3 snmpget вызовов

markp-fuso 27.06.2024 00:13

Пожалуйста, прочитайте раздел Как превратить плохой скрипт в хороший вопрос (этот совет касается всех языков, а не только bash). Удачи!

shellter 27.06.2024 00:25

IFS в цикле while работает по назначению, передавая правильные myIP и UserName команде snmpget. В другой теме мне сказали, что мне нужны IFS = " и "$*", чтобы избавиться от пробелов. Как уже говорилось, первая строка результата правильна, но остальные неверны (идентификатор двигателя не извлекается и не объединяется, как в первой строке).

Rovernut 27.06.2024 02:46

Я подчищу сообщение завтра утром, когда снова получу root-доступ к серверу и смогу проверить, что публикую.

Rovernut 27.06.2024 03:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не указали этот контекст в своем предыдущем вопросе. Да, цикл по этой последовательности вызывает проблемы, потому что на второй итерации действует настройка IFS = "" для set -- $(snmpget ...), поэтому она не разделяется так, как вы хотите.

Однако в предыдущем вопросе вы также не указали bash. С bash первое решение, которое я дал раньше -- read -d '' x x x hex < <(snmpget ...) затем ${hex//[:space:]} -- вероятно, лучше. Или вы можете использовать этот модифицированный подход, который не меняется IFS:

   set -- $(snmpget ...) # unquoted, splits on default IFS including newline
   shift 3; hex=$* # rebuilt with spaces (but not newline)
   echo createuser -e ${hex// } ... # removes spaces in some shells including bash

Это сделало это!! Shelcheck говорит двойную кавычку $(snmpget.....), но это нарушает ее, поэтому я игнорирую Shellcheck в этом случае.

Rovernut 27.06.2024 16:11

Другие вопросы по теме