Am Donnerstag, 6. Juli 2017, 11:50:44 CEST schrieb to...@tuxteam.de: > On Thu, Jul 06, 2017 at 09:57:50AM +0100, Darac Marjal wrote: > > On Thu, Jul 06, 2017 at 12:22:29AM +0200, Javier Barroso wrote: > > >Hi, > > > > > >On Wed, Jul 5, 2017 at 11:12 PM, Rainer Dorsch <m...@bokomoko.de> wrote: > > >>Hi, > > >> > > >> > > >> > > >>can anybody help to explain what is going on here ? > > >> > > >> > > >> > > >> > > >> > > >>rd@mohot:~$ echo $SHELL > > >>/bin/bash > > >>rd@mohot:~$ if [ "abc" > "dec" ]; then echo bad; fi > > >>bad > > >>rd@mohot:~$ if [ "abc" < "dec" ]; then echo good; fi > > >>good > > >>rd@mohot:~$ > > >> > > >>How can abc sort before and after dec at the same time? > > > > > >You need to scape "<" and ">": > > > > > >if [ "abc" \> "dec" ] ; then ... ;fi > > >if [ "abc" '>' "dec" ]; then ... ; fi > > >if [ "abc" ">" "dec" ]; then ... ; fi > > > > > > > > >Delete "dec" file, ( ">" is redirection in bash, so you was creating that > > >file> > > That's a very good point. ">" and "<" are NOT the greater-than/less-than > > operators in bash. > > They are (in bash: see below!) -- just check bash's manual page under > "conditional expressions". > > For strings, they list '==' and '=', '!=', '<' and '>'. > > Now *if* you use '[' (single square bracket) as above, you are not using > bash's built in [this is a little white lie[1], see below], but the external > command 'test' or some cousin of that (just try "ls -l /usr/bin/[" to see > what I mean. This one doesn't understand < and >. > > If you want bash's builtin, use '[[' (double square bracket). It's faster > (one less fork/exec), but also more convenient, because it "knows" that > there's special syntax inside, so you don't need to escape < and > (as > someone pointed out in this thread, see (again) below). > > This works: > > if [[ "abc" < "bcd" ]] ; then echo "yo" ; else echo "no" ; fi > > Or this > > if [[ -n "abc" && ( "abc" < "bcd" ) ]] ; then echo "yo" ; else echo "no" > ; fi > > (note I didn't have to escape the parens, which would wreak havoc > elsewhere in the command line, because they have a special meaning > for the shell, and the shell does expansion before calling commands. > Only a builtin can achieve that). > > Now try this: > > if [ "abc" < "bcd" ] ; then echo "yo" ; else echo "no" ; fi > > (note I chose '<' -- and hope there's no file 'bcd' lying around). > Then I get: > > bash: bcd: No such file or directory > > Now this all was a lie :-) > > Or half. The '[' can be a builtin, after all (in bash). You can > switch that on or off with the enable -- uh -- builtin. > > Just type "help enable" at your favourite bash instance to learn > about that. > > But the '[' builtin has to behave as far as possible like the > /usr/bin/[ of yore (aka POSIX 'test'). Including the way the > shell "expands its innards" before handing things to the command. > > That's why there is [[. Much easier to write and much easier on > the eye. > > BUT: this all won't work on dash (Debian's preferred non-interactive > shell: much smaller and faster). There you have to spell things like > so: > > if [ "abc" \< "bcd" ] ; then echo "yo" ; else echo "no" ; fi > > So dash's '[' is a builtin too (remember: /usr/bin/[ doesn't grok > '<' at all). But dash hasn't the '[[' with its syntactic convenience. > > Hope that helps, somewhat :-) >
Many thanks for all the answers (and scaring that kmail just omitted some stuff in the Text mail and just included it in the HTML part...this time w/o html). They helped a lot to solve my problem... Thanks again Rainer -- Rainer Dorsch http://bokomoko.de/