简体   繁体   中英

Combining multiple options into one single option (Getopts)

Due to my lack of thorough understanding using getopts, the title is definitely vague :0. I am currently writing a bash script and I would like to add an option that outputs the other options within the case statement in getopts. For the sake of scaling, I have shortened the program.

#!/bin/bash

while getopts :abc opt
do
  case $opt in
       a) 
           echo "Hello"
           ;;
       b)
           echo "Goodbye"
       c)            
           :ab #****I WANT -c TO OUTPUT THE RESULTS OF a and b************
           ;;
esac
done

As you can see in option c, I would like this particular option (-c) to put out both the results of -a and -b. Is there a way to go about this by simply making c call on option a and b?

you can introduce functions to reduce duplications, something like this:

#!/bin/bash

do_a() {
  echo "Hello"
}

do_b() {
  echo "Goodbye"
}


while getopts :abc opt
do
  case $opt in
     a)
         do_a
         ;;
     b)
         do_b
         ;;
     c)    
         do_a
         do_b
         ;;
  esac
done

If you are using a recent version of Bash, instead of terminating case clauses with ;; you could use bash specific ;;& with multiple patterns:

#!/bin/bash

while getopts :abc opt
do
    case $opt in
        a|c) 
            echo "Hello"
            ;;&
        b|c)
            echo "Goodbye"
            ;;&
    esac
done

And:

$ bash script.bash -a
Hello
$ bash script.bash -c 
Hello
Goodbye

Using ';;&' in place of ';;' causes the shell to test the patterns in the next clause, if any, and execute any associated command-list on a successful match.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM