Eric Blake wrote: > According to Jim Meyering on 2/13/2010 7:55 AM: >>> For negated character classes in shell case statements, POSIX says to use >>> [!a-z], not [^a-z]. >> >> I've made that change, too. >> Does it matter in practice? > > It matters for at least Solaris /bin/sh. > > $ /bin/sh -c 'case a in [^b]) echo yes;; *) echo no;; esac' > /bin/sh: syntax error at line 1: `^' unexpected > $ /bin/sh -c 'case a in [!b]) echo yes;; *) echo no;; esac' > yes > > But that particular example is a moot point, given the use of $(). > >> That's certainly more efficient. >> Since it's less readable to me, I've added a comment. > > Indeed. And it still needs a tweak: > >> + *) # Remove leading file name components as well as the .exe suffix. >> + feb_file_=${${feb_file_##*/}%.exe} >> feb_result_="$feb_result_$feb_sp_$feb_file_";; > > Won't work as written, the % operator only works on variable names, but > ${feb_file_##*/} is not a variable name. Instead, you need an > intermediate store: > > feb_file_=${feb_file_%.exe} > feb_file_=${feb_file_##*/}
Ha! ;-) I even thought of that, but tried what I wrote, and it worked for me. My error was to use zsh. Normally I know better than to use that shell as a reference. dash is generally good. What we really need is a unit test to exercise init.sh. BTW, I prefer to remove the usually-larger leading components first, to avoid processing that part twice. Thanks. I'll squash this onto the previous: diff --git a/tests/init.sh b/tests/init.sh index fc2796a..951ec78 100644 --- a/tests/init.sh +++ b/tests/init.sh @@ -106,8 +106,9 @@ find_exe_basenames_() case $feb_file_ in *[!-a-zA-Z/0-9_.+]*) feb_fail_=1; break;; *) # Remove leading file name components as well as the .exe suffix. - feb_file_=${${feb_file_##*/}%.exe} - feb_result_="$feb_result_$feb_sp_$feb_file_";; + feb_file_=${feb_file_##*/} + feb_file_=${feb_file_%.exe} + feb_result_="$feb_result_$feb_sp_$feb_file_";; esac feb_sp_=' ' done