Я использую функцию ниже для увеличения внешнего скрипта. Основная цель этого — просто вернуть некоторые данные из выходных данных 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