* Peter Seebach wrote on Wed, Sep 17, 2008 at 08:07:19PM CEST:
> 
> But you can implement a shell function such that
> 
> while func_select var in args
> do
> done
> 
> is equivalent (nearly) to
> 
> select var in args
> do
> done
> 
> I enclose func_select below.  Weaknesses:
> 1.  Newline after prompt.  (Solving this portably seemed like too much work.)

Grab the settings of ECHO_C, ECHO_N, ECHO_T from Autoconf, and use them.

> 2.  "in args" is not optional; it can't implicitly use [EMAIL PROTECTED]
> 
> So far as I can tell, this is basically solid.  What'd I miss?
> 
> func_select () {
>   func_select_args=0
>   if expr "$1" : "^[_a-zA-Z][_a-zA-Z0-9]*$" > /dev/null; then

FWIW, expr expressions are always anchored, so there is no need for more
anchoring (another instance below).  But can't you avoid a fork here,
like
  case $1 in
    [!_a-zA-Z]* | *[!_a-zA-Z0-9]*) usage "$1";;
  esac


>     func_select_var=$1
>   else
>     echo >&2 "func_select: '$1' is not a valid variable name."
>     return 1
>   fi
>   shift 1

'shift N' is not so portable.  Just drop the 1.

>   for func_select_arg
>   do
>     func_select_args=`expr $func_select_args + 1`
>     eval func_select_a_$func_select_args=\$func_select_arg
>   done

This again forks a lot.  I'd use a shell function to factor between
$(()) and expr, so that only shells without the former use the latter
and fork (Autotest and Libtool do this).  Likewise below.

>         if expr "$REPLY" : '^[1-9][0-9]*$' > /dev/null; then

case $REPLY in
  0* | *[!0-9]* ) bad ... ;;
esac

Otherwise, looks good to me (untested).

Cheers,
Ralf


Reply via email to