On Wed, 2010-10-27 at 15:28 -0600, Chad Perrin wrote:
> I know that in sh you can get the contents out of files specified as
> command line arguments:
> 
>     while read data; do
>       echo $data
>     done <$@
> 
> I know you can also get the contents of files from pipes and redirects:
> 
>     while read data; do
>       echo $data
>     done
> 
> In Perl, you can use a single construct to do both and, unlike the first
> sh example, it can also take multiple filenames as arguments and
> effectively concatenate their contents:
> 
>     while (<>) {
>       print $_;
>     }
> 
> I'm not exactly an *expert* in sh, in part because when things start
> getting "interesting" while I'm writing shell scripts I tend to just use
> a more robust language like Perl.  Please let me know if there's some way
> to use a simple idiom like the Perl example to get the same results in
> sh.
> 


see here:
http://druidbsd.sf.net/download/sysrc.txt

For example (NOTE: this is just an example -- the function itself is
inefficient when one considers instead `tail -r file' and `tail -r <
file' and `cat file | tail -r', though the function serves as a good
example of how to achieve what you want):

# ... | lrev
# lrev $file ...
#
# Reverse lines of input. Unlike rev(1) which reverses the ordering of
# characters on a single line, this function instead reverses the line
# sequencing.
#
# For example, the following input:
#
#       Line 1
#       Line 2
#       Line 3
#
# Becomes reversed in the following manner:
#
#       Line 3
#       Line 2
#       Line 1
#
lrev()
{
        local stdin_rev=
        if [ $# -gt 0 ]; then
                #
                # Reverse lines from files passed as positional arguments.
                #
                while [ $# -gt 0 ]; do
                        local file="$1"
                        [ -f "$file" ] && lrev < "$file"
                        shift 1
                done
        else
                #
                # Reverse lines from standard input
                #
                while read -r LINE; do
                        stdin_rev="$LINE
$stdin_rev"
                done
        fi

        echo -n "$stdin_rev"
}




-- 
Cheers,
Devin Teske

-> CONTACT INFORMATION <-
Business Solutions Consultant II
FIS - fisglobal.com
510-735-5650 Mobile
510-621-2038 Office
510-621-2020 Office Fax
909-477-4578 Home/Fax
[email protected]

-> LEGAL DISCLAIMER <-
This message  contains confidential  and proprietary  information
of the sender,  and is intended only for the person(s) to whom it
is addressed. Any use, distribution, copying or disclosure by any
other person  is strictly prohibited.  If you have  received this
message in error,  please notify  the e-mail sender  immediately,
and delete the original message without making a copy.

-> END TRANSMISSION <-

_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "[email protected]"

Reply via email to