как вызывать функции из цикла for в сценарии оболочки

Петлевой интерфейс является виртуальным интерфейсом. Единственная цель петлевого интерфейса — возвращать отправленные на него пакеты, т. е. все, что вы отправляете на него, принимается на интерфейсе. Не имеет большого смысла прописывать маршрут по умолчанию на петлевом интерфейсе, потому что единственное место, куда он может отправлять пакеты, — это воображаемый кусок провода, который зацикливается от выхода интерфейса до входа. Нет ничего, что могло бы изменить это поведение петлевого интерфейса, для этого он и запрограммирован.

При пинге 10.0.3.2 ответ приходит не от какого-то внешнего устройства, а от самого петлевого интерфейса. Когда вы добавляете адрес в петлевом интерфейсе, например.

sudo ip addr add 10.0.3.1/24 dev lo

добавлен маршрут к 10.0.3.0/24. Вы можете увидеть это с

ip route show table local

Что-то вроде

local 10.0.3.0/24 dev lo proto kernel scope host src 10.0.3.1

должно появиться.Эта запись таблицы маршрутизации сообщает, что пакет, отправленный на любой адрес между 10.0.3.1 и 10.0.3.254, отправляется через интерфейс lo, с которого он немедленно вернулся.

РЕДАКТИРОВАТЬ: уточнение в ответ на комментарий ниже.

Вот что происходит, когда вы пингуете 10.0.3.2: ядро ​​получает IP-пакет для доставки с адресом назначения 10.0.3.2. Как и при доставке любого пакета, ядро ​​сверяется с таблицей маршрутизации. В этом случае соответствующая запись выглядит так: local 10.0.3.0/24 dev lo proto kernel scope host src 10.0.3.1, в которой говорится, что пакет должен быть доставлен через интерфейс lo с исходный адрес 10.0.3.1.

Теперь, поскольку пакет был передан интерфейсу lo, петлевой интерфейс делает то, что обычно делает: он берет пакет из очереди отправки и помещает его в очередь получения. С точки зрения ядра мы получили входящий пакет, готовый к использованию серверным процессом, прослушивающим сокет. (В случае ping ядро ​​обрабатывает его внутри.) Теперь мы получили «удаленный» ICMP-пакет с адресом назначения 10.0.3.2, который, возможно, не является одним из наших локальных адресов, но он был доставлен в петлю. интерфейс тем не менее.

Затем ядро ​​отправляет ответ на эхо-запрос: пакет ответа ICMP с обратными адресами: 10.0.3.2 в качестве адреса источника и 10.0.3.1 в качестве адреса назначения. Это доставляется через петлевой интерфейс обратно в программу ping, которая показывает, что мы получили ответ от 10.0.3.2.

0
29.04.2019, 15:07
2 ответа

Просто измените цикл for:

for index in ${array_item[*]}
    do
       check_$index
    done

Полный сценарий

#!/bin/bash

array_item=(item1 item2)

#function
check_item1 ()
{
   echo "hello from item1"
}
check_item2 ()
{
   echo "Hello from item2"
}   

for index in ${array_item[*]}
    do
       check_$index
    done

NB: Кроме того, доступны следующие фанковые конструкции:

${array_item[*]}         # All of the items in the array
${!array_item[*]}        # All of the indexes in the array
${#array_item[*]}        # Number of items in the array
${#array_item[0]}        # Length of item zero
2
28.01.2020, 02:15
array_item= (item1 item2)

Не помещайте пробелы вокруг = в назначении, это не работает. Также это дает мне синтаксическую ошибку в скобках. Вы можете получить ошибку check_: command not found , если элементы массива не установлены или пусты.

for (( i=0; i<${array_item[@]}; i++ ))

$ {array_item [@]} расширяется до всех элементов массива. Думаю, вам нужно $ {# array_item [@]} для количества элементов. Если массив пуст, это также должно привести к ошибке, поскольку другой операнд сравнения будет отсутствовать.

Конструкция for ((...)) {cmds ...} , похоже, работает в Bash, но в руководстве описывается только обычный for ((...)); делать ... ; done конструкция.

Или просто используйте вместо x в "$ {array_item [@]}"; do ... done для перебора значений массива.

Если вам действительно нужны индексы во время цикла, может быть технически лучше перебрать "$ {! Array_item [@]}" , поскольку индексы на самом деле не обязательно должны быть смежными. Это также работает с ассоциативными массивами.

5
28.01.2020, 02:15

Теги

Похожие вопросы