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