如何使用包含空格的参数处理shell getopts

DrF*_*k3n 14 shell getopts

我正在寻找一种方法来处理包含空格的参数,这些空格必须由shell getopts命令解析.

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
Run Code Online (Sandbox Code Playgroud)

现在,如果-u具有像"STRING WITH WHITE SPACE"这样的参数,而不仅仅是触发了字符串的第一部分,而while循环不会结束.

非常感谢.

Eri*_*ulz 31

年轻球员的陷阱(即我!)

要注意这样一条线:

main $@
Run Code Online (Sandbox Code Playgroud)

你真正需要的是:

main "$@"
Run Code Online (Sandbox Code Playgroud)

否则getopts会把你的选择分成小块

http://www.unix.com/shell-programming-scripting/70630-getopts-list-argument.html

  • 这是一个经常被忽视但必不可少的提示!为我完美工作,谢谢你的帖子! (3认同)

Gil*_*il' 10

正如Mat所说,你的脚本片段已经是正确的.如果您从shell调用脚本,则需要正确引用参数,例如

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
Run Code Online (Sandbox Code Playgroud)

要求这些引号不是脚本中的缺陷,而是调用shell的工作方式.所有程序,脚本或其他方式都将接收参数作为字符串列表.调用shell中的引号用于将这些参数排序为单独的"单词"(列表元素).上面的所有调用(由unix shell创建)将三个字符串的列表传递给脚本:$0是脚本名称(myscript),$1-u$2是字符串string with white space.