Поведение создания переменной внутри функции bash

Поведение создания переменной внутри функции bash

Я использую функцию ниже для увеличения внешнего скрипта. Основная цель этого — просто вернуть некоторые данные из выходных данных ifconfig и ping-теста. Я пытаюсь установить их внутри той же функции с помощью переменных, просто чтобы сделать некоторые другие «каналы» и снова объединить их с другой информацией. Но я получил такое поведение. По сути, то, что я пытаюсь сделать, это:

    > for i in $(ifconfig | grep "inet addr" | tr -s " " | cut -d" " -f 3 | cut -d: -f2) ; do ping -c1 $i | grep packet | a=`echo $i-$(cut -d,
    -f3)` | echo $a; done  
4  
4  
4  
4

Как видите, для каждой итерации возвращается число 4.

Если я просто уберу атрибут переменной, то получу вывод, который ожидал установить в переменной «a» в первом месте:

> for i in $(ifconfig | grep "inet addr" | tr -s " " | cut -d" " -f 3 | cut -d: -f2) ; do ping -c1 $i | grep packet | echo $i-$(cut -d, -f3); done
10.0.2.15- 0% packet loss
192.168.0.2- 0% packet loss
10.0.2.100- 0% packet loss
127.0.0.1- 0% packet loss
  • Почему я получаю число 4 в качестве вывода при выполнении кода первой функции?
  • Как мне установить переменную внутри той же функции и вывести ее снова после некоторых конвейеров? Это возможно?

С наилучшими пожеланиями !

решение1

 for i in $(...) ; do ... | a=`...` | echo $a; done

Почему я получаю число 4 в качестве вывода при выполнении кода первой функции?

Поскольку a=`...`и echo $aвыполняются в разных подоболочках / подпроцессах. a=1; a=3 | echo $aбудет напечатано 1в любой оболочке. Нет способа передать переменную из подоболочки в ее родителя.

Как мне установить переменную внутри той же функции и вывести ее снова после некоторых конвейеров? Это возможно?

Нет. Если только вы не установите это в основном скрипте, перед конвейером.

решение2

Если вы перестроите последнюю часть конвейера, используя sedЯ думаю, вы можете получить то, что хотите. Скрипт sedсопоставляет весь стандартный ввод и заменяет его значением, $iза которым следует -и третье поле вашего pingвывода (из stdin). Например,

$ for i in $(ifconfig | grep "inet addr" | tr -s " " | cut -d" " -f3 | cut -d: -f2); do \
    ping -c1 $i | grep packet | cut -d, -f3 | sed "s/\(.*\)/$i - \\1/"; \
done
123.145.167.189 -  0% packet loss
127.0.0.1 -  0% packet loss

Связанный контент