fork(1) download
  1. testfunc() {
  2. printf -v args_str '%q ' "$@"
  3. while (( $# )) && [[ $1 = -* ]]; do
  4. arg=${1#-}; shift
  5. while [[ $arg ]]; do
  6. case $arg in
  7. l*) flag_l=1; arg=${arg#l};;
  8. u*) flag_u=1; arg=${arg#u};;
  9. w*)
  10. flag_w=1
  11. rest=${arg#w}
  12. if [[ -z $rest ]]; then
  13. arg=$1; shift; rest=$arg
  14. fi
  15. if [[ $rest =~ ^([[:digit:]]+)(.*) ]]; then
  16. w_value=${BASH_REMATCH[1]}
  17. arg=${BASH_REMATCH[2]}
  18. else
  19. echo "ERROR: -w not followed with a number" >&2
  20. exit 1
  21. fi
  22. ;;
  23. *) echo "Unrecognized flag: $arg" >&2; exit 1;;
  24. esac
  25. done
  26. done
  27.  
  28. echo "After parsing $args_str"
  29. echo "flag_w = ${flag_w:-0}"
  30. echo "flag_l = ${flag_l:-0}"
  31. echo "flag_u = ${flag_u:-0}"
  32. echo "w_value = ${w_value:-0}"
  33. }
  34.  
  35. testfunc -w42l
  36. testfunc -w 42 -l
Success #stdin #stdout 0.01s 5556KB
stdin
Standard input is empty
stdout
After parsing -w42l 
flag_w = 1
flag_l = 1
flag_u = 0
w_value = 42
After parsing -w 42 -l 
flag_w = 1
flag_l = 1
flag_u = 0
w_value = 42