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
?
Updated: 02/01/2021 by Computer Hope. On Unix-like operating systems, getopts is a builtin command of the Bash shell. It parses command options and arguments, such as those passed to a shell script.
An option character in this string can be followed by a colon (' : ') to indicate that it takes a required argument. If an option character is followed by two colons (' :: '), its argument is optional; this is a GNU extension. getopt has three ways to deal with options that follow non-options argv elements.
According to man getopts , OPTIND is the index of the next argument to be processed (starting index is 1). Hence, In sh foo.sh -abc CCC Blank arg1 is -abc , so after a we are still parsing arg1 when next is b ( a 1 ). Same is true when next is c , we are still in arg1 ( b 1 ).
You can do something like:
shift $(($OPTIND - 1)) first_arg=$1 second_arg=$2
after the loop has run.
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"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With