SH a funkcie
Dan Lukes
dan at obluda.cz
Tue Feb 26 18:35:35 CET 2019
Peter Rosa wrote on 26. 2. 2019 16:36:
A jeste neco co se primo netyka volani funkci, ale toho scriptu jako
takoveho ...
> hm=`ifconfig $iface | grep 'inet' | cut -d' ' -f4`
Problem 1 - tento grep ti vrati nejen radky "inet", ale i "inet6", se
kterymi to nasledne nebude fungovat (maji jiny format). Ty tam chces mit
grep 'inet ' (tedy s mezerou za inet).
Problem 2 - cely vyraz nefunguje dobre, pokud ma interface vice nez
jednu inet adresu (takze radek 'inet ' je tam vice nez jeden) - pokdu ti
staci prvni, tak staci pridat 'head -n 1', jinak je treba data
zpracovavat v cyklu
Problem 3 - vyraz nefunguje dobre na interfacech typu POINTOPOINT
interfacech jejichz 'inet' radek vypada takto:
inet 10.1.0.6 --> 10.1.0.1 netmask 0xffffffff
To uz chce trochu jiny pristup tak se k tomu vratim na konci.
Problem 4 - script nepocita s moznosti, ze interface nema inet adresu
zadnou.
> hm=${hm:2:10}
Script mas deklarovan jako #!/bin/sh, ale uvedeny konstrukt je
bashismus. V sh nic takoveho neexistuje a nebude ti to fungovat (sh:
${hm:2...}: Bad substitution). V sh budes muset pouzit neco jako
hm="${hm#0x}"
Ale ja bych vyresil tohle a soucasne problemy 1 a 3 najednou takto
hm = $( ifconfig vlan300 | sed -n 's/[[:blank:]]*inet .* netmask
0x\(.\{8\}\).*/\1/p' | head -n 1 )
To vraci hodnotu netmask bez ohledu na typ interface, vraci ji to pouze
pro inet a ne inet6, vraci ji to bez uvodniho 0x ktere tam nechces
No, a pokud to ma fungovat i v pripade, ze je adres a masek na interface
vic, tak vynechat 'head -n 1' a na viceradkovy vystup presmerovat do
while read MASK ; do
hex2cidr "$MASK"
done
Dan
Dan
More information about the Users-l
mailing list