Search code examples
shellgetopts

How to handle shell getopts with parameter containing blank spaces


I'm looking for a way to handle arguments containing blank spaces that has to be parsed by shell getopts command.

while getopts ":a:i:o:e:v:u:" arg
  do
  echo "ARG is: $arg" >> /tmp/submit.log
  case "$arg" in
  a) arg1="$OPTARG" ;;
  i) arg2="$OPTARG" ;;
  o) arg3="$OPTARG" ;;
  ...
  u) argn="$OPTARG" ;;
  -) break ;;
  \?) ;;
  *) echo "unhandled option $arg" >> /tmp/submit.log ;;
  ?) echo $usage_string
     exit 1 ;;
  esac
done

Now if -u has argument like "STRING WITH WHITE SPACE" than just the first part of the string is triggered and the while loop doesn't go to the end.

many thanks.


Solution

  • As Mat notes, your script fragment is already correct. If you're invoking your script from a shell, you need to quote arguments properly, e.g.

    myscript -u "string with white space"
    myscript -u 'string with white space'
    myscript -u string\ with\ white\ space
    myscript -u string' w'ith\ "whi"te" "''space
    

    Requiring these quotes is not a defect in your script, it's the way the calling shell works. All programs, scripts or otherwise, receive arguments as a list of strings. The quotes in the calling shell are used to sort these arguments into separate “words” (list elements). All the calls above (made from a unix shell) pass a list of three strings to the script: $0 is the script name (myscript), $1 is -u and $2 is the string string with white space.