40

I want to call a bash script like this

$ ./scriptName -o -p -t something path/to/file

This is as far as I get

#!/bin/bash

o=false
p=false

while getopts ":opt:" options
do
    case $options in
        o ) opt1=true
        ;;
        p ) opt2=true
        ;;
        t ) opt3=$OPTARG
        ;;
    esac
done

but how do I get the path/to/file?

2 Answers 2

66

You can do something like:

shift $(($OPTIND - 1))
first_arg=$1
second_arg=$2

after the loop has run.

Sign up to request clarification or add additional context in comments.

2 Comments

Could the first line be written shift $((OPTIND - 1)) - i.e. losing the dollar sign inside the parentheses?
Armand, so it seems as per: tldp.org/LDP/abs/html/arithexp.html
12

To capture all the remaining parameters after the getopts processing, a good solution is to shift (remove) all the processed parameters (variable $OPTIND) and assign the remaining parameters ($@) to a specific variable. Short answer:

shift $(($OPTIND - 1))
remaining_args="$@"

Long example:

#!/bin/bash

verbose=false

function usage () {
    cat <<EOUSAGE
$(basename $0) hvr:e:
    show usage
EOUSAGE
}

while getopts :hvr:e: opt
do
    case $opt in
        v)
            verbose=true
            ;;
        e)
            option_e="$OPTARG"
            ;;
        r)
            option_r="$option_r $OPTARG"
            ;;
        h)
            usage
            exit 1
            ;;
        *)
            echo "Invalid option: -$OPTARG" >&2
            usage
            exit 2
            ;;
    esac
done


echo "Verbose is $verbose"
echo "option_e is \"$option_e\""
echo "option_r is \"$option_r\""
echo "\$@ pre shift is \"$@\""
shift $((OPTIND - 1))
echo "\$@ post shift is \"$@\""

This will output

$ ./test-getopts.sh -r foo1 -v -e bla -r foo2 remain1 remain2
Verbose is true
option_e is "bla"
option_r is " foo1 foo2"
$@ pre shift is "-r foo1 -v -e bla -r foo2 remain1 remain2"
$@ post shift is "remain1 remain2"

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.