Date: Mon, 11 May 2015 12:37:29 -0700 From: Devin Teske <dteske@FreeBSD.org> To: Brooks Davis <brooks@freebsd.org> Cc: John Baldwin <jhb@FreeBSD.org>, Xin LI <delphij@FreeBSD.org>, "src-committers@freebsd.org" <src-committers@freebsd.org>, "svn-src-all@freebsd.org" <svn-src-all@freebsd.org>, "svn-src-head@freebsd.org" <svn-src-head@freebsd.org>, Devin Teske <dteske@FreeBSD.org> Subject: Re: svn commit: r282672 - head/etc/rc.d Message-ID: <9FB76653-EF89-48E5-B4E8-A2006923B76A@FreeBSD.org> In-Reply-To: <20150511191850.GC68045@spindle.one-eyed-alien.net> References: <201505082336.t48NaWRS080408@svn.freebsd.org> <C072FED2-FBED-4EF9-9D74-11B485594AD7@FreeBSD.org> <20150511191850.GC68045@spindle.one-eyed-alien.net>
next in thread | previous in thread | raw e-mail | index | archive | help
> On May 11, 2015, at 12:18 PM, Brooks Davis <brooks@freebsd.org> wrote: >=20 > On Sun, May 10, 2015 at 03:45:48PM -0400, John Baldwin wrote: >>=20 >>> On May 8, 2015, at 19:36, Xin LI <delphij@FreeBSD.org> wrote: >>>=20 >>> Author: delphij >>> Date: Fri May 8 23:36:31 2015 >>> New Revision: 282672 >>> URL: https://svnweb.freebsd.org/changeset/base/282672 >>>=20 >>> Log: >>> Always convert uuid to lower case. >>>=20 >>> MFC after: 2 weeks >>>=20 >>> Modified: >>> head/etc/rc.d/hostid >>>=20 >>> Modified: head/etc/rc.d/hostid >>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>> --- head/etc/rc.d/hostid Fri May 8 23:29:42 2015 (r282671) >>> +++ head/etc/rc.d/hostid Fri May 8 23:36:31 2015 (r282672) >>> @@ -58,7 +58,7 @@ hostid_set() >>>=20 >>> valid_hostid() >>> { >>> - uuid=3D$1 >>> + uuid=3D$(echo $1 | tr '[:upper:]' '[:lower:]') >>=20 >> tr is in /usr/bin so this breaks systems with a separate /usr. = Perhaps you could use dd with conv=3Dlcase instead? >=20 > Alterntively, a shell function "ltr" exists in rc.subr for this = purpose. >=20 ltr would not work in this situation, for multiple reasons. 1. ltr doesn=E2=80=99t support character classes 2. ltr is for replacing one or more characters (cannot be a class) with = a single string (of variable length, 0+). In /etc/networks.subr you can see an example usage of ltr: 287 = <https://svnweb.freebsd.org/base/head/etc/network.subr?view=3Dmarkup#l287>= _punct=3D".-/+" 288 = <https://svnweb.freebsd.org/base/head/etc/network.subr?view=3Dmarkup#l288>= ltr ${_if} "${_punct}" '_' _if The result of this is to take a value of (for example) foo.bar and = replace any occurrences of period, minus, forward slash, or plus with instead a single underscore. The result is stuffed into the variable =E2=80=9C_if=E2= =80=9D (over- writing previous contents which may have contained aforementioned characters replaced with underscore). An attempt to use ltr in the below fashion: ltr $string =E2=80=98[:lower:]=E2=80=99 =E2=80=98[:upper:]=E2=80=99= somevar would surely fail. While it is indeed *possible* to write a find/replace function in = native- shell that supports character classes, it would not be a small function. The primary issue is that you need to know what the character that matched the class and there aren=E2=80=99t any built-ins that provide = this info. For example: case =E2=80=9C$src=E2=80=9D in *[[:lower:]]*) will trigger when you have a lower-case character that needs conversion to upper-case (or opposite if using *[[:upper:]]*) BUT you won=E2=80=99t = know what the character was that you matched (so how can you know which upper-case character to supplant)? The function will have to resort to complicated substring mechanics or any other seldom known procedure. I=E2=80=99ll have a noodle on it and see what I can come up with. It=E2=80= =99s not exactly immediately coming to me how to do this in any simple fashion while maintaining efficiency (read: by not iterating over every single = character and also by not having a giant massive case statement with every letter spelled out =E2=80=94 coming up with a solution that embraces the use of = the character class I would believe to be more efficient). =E2=80=94=20 Devin=
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9FB76653-EF89-48E5-B4E8-A2006923B76A>