LINUX.ORG.RU

История изменений

Исправление vodz, (текущая версия) :

Но IFS лучше сохранять и восстанавливать. А уж первый символ сравнивать вызовом внешней программы (grep) при наличии bash совсем тяп-ляпно. Вот даже без bash-измов, работает для конфига в том числе с комментариями по '#' после строки с адресом и флагом (оно само так получилось) :) :

#!/bin/ash

# cat cfg.txt
10.10.10.1=of
10.20.20.1=sh #special
#10.10.30.1=of
10.30.50.2=sh

#cat parser.sh
parser_ip_str() {
        local l ip flg
        while read l; do
                l=${l%#*}
                [ -z "$l" ] && continue
                ip=${l%=*}
                flg=${l#*=}
                if [ of = "$flg" ]; then
                        ip_ip="$ip_ip${ip_ip:+ }$ip"
                elif [ sh = "$flg" ]; then
                        ip_sh="$ip_sh${ip_sh:+ }$ip"
                fi
        done < "$1"
}

parser_ip_str cfg.txt
echo "ip_ip=$ip_ip ip_sh=$ip_sh"

Исходная версия vodz, :

Но IFS лучше сохранять и восстанавливать. А уж первый символ сравнивать вызовом внешней программы (grep) при наличии bash совсем тяп-ляпно. Вот даже без bash-измов, работает для конфига в том числе с комментариями по '#' после строки с адресом и флагом (оно само так получилось) :) :

#!/bin/ash

parser_ip_str() {
        local l ip flg
        while read l; do
                l=${l%#*}
                [ -z "$l" ] && continue
                ip=${l%=*}
                flg=${l#*=}
                if [ of = "$flg" ]; then
                        ip_ip="$ip_ip${ip_ip:+ }$ip"
                elif [ sh = "$flg" ]; then
                        ip_sh="$ip_sh${ip_sh:+ }$ip"
                fi
        done < "$1"
}

parser_ip_str cfg.txt
echo "ip_ip=$ip_ip ip_sh=$ip_sh"