Чтение строк из файла и токенизация каждой строки для извлечения указанного c слова в сценарии оболочки - PullRequest
0 голосов
/ 29 марта 2020

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

while read -ra line; 
    do
        netmask="${line[5]}"
        echo "netmask is $netmask" // first line reading is correct, second line onwards its showing 
                                      wrong output
        IFS='.' tokens=($netmask) 
        prefix=0
        for i in 0 1 2 3
        do
            var="${tokens[$i]}"
            # i have a logic to calculate number of 1's in the number.
        done 
done < routes.sh

Содержание маршрута. sh являются

route add -net 10.212.220.0 netmask 255.255.255.0 gw 10.213.248.1
route add -net 10.212.220.0 netmask 255.255.128.0 gw 10.213.248.1

Фактический результат

netmask is 255.255.255.0
netmask is 128

Ожидаемый результат

netmask is 255.255.255.0
netmask is 255.255.128.0

Дополнительное примечание:

Моя цель - (концепция сети)

  1. Считать все строки из файла (каждая строка изображает маршрут)
  2. Из каждая строка извлекает маску сети (например: 255.255.255.255)
  3. Токен "255.255.255.255" с '.', поэтому мы получаем 4 числа, вычисляем число 1 в каждом токене, складываем их. Это будет длина префикса для сетевого IP.

1 Ответ

1 голос
/ 29 марта 2020

Проблема в том, что вы установили IFS='.', поэтому для второго read в массиве line будет установлен неправильно.

Один из способов исправить это путем сохранения оригинала IFS а затем сбросьте его при необходимости. Например,

OldIFS=$IFS
while read -ra line; do
    netmask="${line[5]}"
    echo "netmask is $netmask"
    IFS='.' tokens=($netmask)
    prefix=0
    for i in 0 1 2 3; do
        var="${tokens[$i]}"
    done
    IFS=$OldIFS
done < routes.sh

Вы должны быть осторожны при изменении IFS, иначе произойдут странные вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...