Search code examples
bashgetopts

getopts second flag is not required?


Having issues making sure that both -v and -o are both required elements but -h is not in my getopts. how would I fix this?

usage() { echo "Usage: $0 [-v <5.x|6.x>] [-o <string>]" 1>&2; exit 1; }

if ( ! getopts ":v:o:h" opt); then
    echo "Usage: `basename $0` options (-v [version]) (-o [organization unit]) -h for help";
    exit $E_OPTERROR;
fi

while getopts ":v:o:h" opt; do
     case $opt in
         v) vermajor=$OPTARG;;
         o) org_unit=$OPTARG;;
         h) usage;;
        \?) echo "Invalid option: -$OPTARG" >&2; exit 1;;
         :) echo "Option -$OPTARG requires an argument." >&2; exit 1;;
     esac
done

exit

Solution

  • What about this?:

    usage() { echo "Usage: $0 [-v <5.x|6.x>] [-o <string>]" 1>&2; exit 1; }
    
    test=$(echo "$@" | grep "\-v" | grep "\-o")
    
    if [[ -z "$test" ]]; then
        printf "requirements not met.\n"
        usage
    fi
    if [[ -n "$test" ]]; then
       printf "requirements met.\n"
    fi
    

    Output:

    bob@crunchbang:~$ ./test -v 5.0 -h
    requirements not met.
    Usage: ./test [-v <5.x|6.x>] [-o <string>]
    bob@crunchbang:~$ ./test -v 5.0
    requirements not met.
    Usage: ./test [-v <5.x|6.x>] [-o <string>]
    bob@crunchbang:~$ ./test -o "yoh"
    requirements not met.
    Usage: ./test [-v <5.x|6.x>] [-o <string>]
    bob@crunchbang:~$ ./test 
    requirements not met.
    Usage: ./test [-v <5.x|6.x>] [-o <string>]