Parsing arguments using manual loop

#!/bin/bash

show_help(){
echo "Usage: ${0##*/} [-h|--help] [-v|--verbose] [-l|--lines number] FILE... "
}

while (( "$#" )); do
    case $1 in
        -h|--help)
            show_help
            exit
            ;;
        -l|--lines) 
            if [ "$2" ] && [ ${2:0:1} != "-"  ]; then
                number=$2
                shift
            else
                echo "Option -l|--lines needs an argument" 
                show_help
                exit 1
            fi
            ;;
        -v|--verbose)
            verbose=1 
            ;;
        -?*)
            echo "Option $1 is not supported."
            show_help
            exit 1
            ;;
        *)       
            break
    esac
    shift
done

Line 7 can be replace by “while :; do”

Parsing arguments using getopts

#!/bin/bash

show_help(){
echo "Usage: ${0##*/} [-h] [-v] [-l number] FILE... "
}
#Consider set OPTIND in case it's used somewhere
#OPTIND=1
while getopts hvl: opt; do
    case $opt in
        h)
            show_help
            exit 0
            ;;
        v)  verbose=1
            ;;
        l)  number=$OPTARG
            ;;
        ?)
            show_help >&2
            exit 1
            ;;
    esac
done
#Discard options already been parsed
shift "$((OPTIND-1))"

1.getopts doesn’t support double dash like “–help”

2.getopts supports options combination like “-cvf”

3.In line 8, colon “:” means that option requires an argument