Quoth Polytropon on Thursday, 28 October 2010: > On Thu, 28 Oct 2010 09:17:12 -0700, Chip Camden <[email protected]> > wrote: > > Perhaps someone with more sh fu can transform the > > 'if' paragraph into a one-liner at least. When I tried to do so, I got an > > unexpected ; error. > > Not tested, but this should do the trick: > > #!/bin/sh > if [ $# -ge 1 ] && ( exec cat $@ | $0; exit ) > while read data; do echo $data; done > > The ; denotes a line break, means that you can use EITHER ; or > a newline. In the original construct, > > if [ $# -ge 1 ]; then > exec cat $@ | $0 > exit > fi > > you can change the ; into > > if [ $# -ge 1 ] > then > exec cat $@ | $0 > exit > fi > > which is often seen in scripts. In this case, no ; is required (or > even allowed). The same rule applies for the while/do/done iterator. > > > -- > Polytropon > Magdeburg, Germany > Happy FreeBSD user since 4.0 > Andra moi ennepe, Mousa, ... > _______________________________________________ > [email protected] mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-questions > To unsubscribe, send any mail to "[email protected]"
Tested, and it had a bug ('if' is extraneous). It also waits for input
even if it has file arguments. But it's easily corrected:
#!/bin/sh
[ $# -ge 1 ] && exec cat $@ && exit | $0
while read data; do echo $data; done
The first line can be converted to an alias, like so:
alias inargs='[ $# -ge 1 ] && exec cat $@ && exit | $0'
So, if you add the alias to your profile, you can use it to enable the
behavior in any script:
#!/bin/sh
inargs
while read data; do echo $data; done
Thanks for the pointer in the right direction.
--
Sterling (Chip) Camden | [email protected] | 2048D/3A978E4F
http://camdensoftware.com | http://chipstips.com | http://chipsquips.com
pgpLgX2WMBYbo.pgp
Description: PGP signature
