On Saturday 27 October 2012 04:29:57 Joseph S. Myers wrote:
On Sat, 27 Oct 2012, Mike Frysinger wrote:
In looking through tzselect, I can't see any functionality that isn't covered by the POSIX shell spec. Since we're modernizing, change this to use /bin/sh by default.
The "select" builtin is not POSIX.
hmm, so it isn't. would people be against re-using $@ and manually outputting the list ? here's a quick hack. it could be made simpler if we set clear limits on what is fair game ... would be SuSv3 be asking too much ? -mike diff --git a/tzselect.sh b/tzselect.sh index 40134d8..73fa1ff 100755 --- a/tzselect.sh +++ b/tzselect.sh @@ -82,6 +82,21 @@ case $(echo 1 | (select x in x; do break; done) 2>/dev/null) in esac +# Set up the continent choices. +set -- \ + Africa \ + Americas \ + Antarctica \ + 'Arctic Ocean' \ + Asia \ + 'Atlantic Ocean' \ + Australia \ + Europe \ + 'Indian Ocean' \ + 'Pacific Ocean' \ + 'none - I want to specify the time zone using the Posix TZ format.' + + # Begin the main loop. We come back here if the user wants to retry. while @@ -97,30 +112,36 @@ while echo >&2 'Please select a continent or ocean.' - select continent in \ - Africa \ - Americas \ - Antarctica \ - 'Arctic Ocean' \ - Asia \ - 'Atlantic Ocean' \ - Australia \ - Europe \ - 'Indian Ocean' \ - 'Pacific Ocean' \ - 'none - I want to specify the time zone using the Posix TZ format.' + while :; do + + c=1 + while [ $c -le $# ] do - case $continent in - '') - echo >&2 'Please enter a number in range.';; - ?*) + [ $c -lt 10 ] && b=' ' || b= + eval echo \""$b$c) \${$c}"\" >&2 + c=$(expr $c + 1) + done + echo '#?' | tr '\n' ' ' + read continent + case $(echo "$continent" | tr -d '[0-9]') in + '') + if [ $continent -gt 0 -a $continent -le $# ]; then + eval continent=\""\${$continent}"\" case $continent in Americas) continent=America;; *' '*) continent=$(expr "$continent" : '\([^ ]*\)') esac break - esac + else + echo >&2 'Please enter a number in range.' + fi + ;; + *) + echo >&2 'Please enter a valid number.' + esac + done + case $continent in '') exit 1;;