0

If I type this on the command line:

_longopt ()
{
    case "$prev" in
        --+([-a-z0-9_]))
            echo foo
        ;;
    esac;
}

it works as expected.

If I put it in a script (foo.sh) it fails:

./foo.sh: line 6: syntax error near unexpected token `('
./foo.sh: line 6: `        --+([-a-z0-9_]))'

Why?

And more importantly: Given that I have a function already defined like the above, how can I automatically convert it into a function that works in a script?

$ bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
  • 1
    Does the script have the appropriate #!-line? – Kusalananda Jun 28 '16 at 7:29
  • 4
    If you have bash-completion installed (which is used in interactive shells), it turns on the extglob option (needed for that code) which would explain why your code works in interactive shell. You'll probably find that code doesn't work in interactive shells started with --norc – Stéphane Chazelas Jun 28 '16 at 7:33
1

You need:

shopt -s extglob

Thanks @Stéphane Chazales for pointing me at extglob.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.