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

如何处理参数包含空格的shell getopts,shell,getopts,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" ;; -) b

我正在寻找一种方法来处理包含必须解析的空格的参数 通过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
现在if-u的参数类似于“带空格的字符串” 而不仅仅是字符串的第一部分被触发,while循环不会结束

非常感谢。

请注意,您的脚本片段已经正确。如果从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
需要这些引号并不是脚本中的缺陷,而是调用shell的方式。所有程序、脚本或其他程序都以字符串列表的形式接收参数。调用shell中的引号用于将这些参数排序为单独的“单词”(列表元素)。上面的所有调用(从unix shell发出)都会向脚本传递一个包含三个字符串的列表:
$0
是脚本名(
myscript
),
$1
-u
$2
是带空格的字符串是年轻玩家的陷阱(即我!)

注意这样一句话:

main $@
您真正需要的是:

main "$@"
否则,
getopts
将把您的选项切碎


这通常是不可能的。你需要正确地引用脚本中的参数,就像你在文章中所做的那样。谢谢你指出了错误:这个bash getopts是人类getopt对达尔文的一个很好的替代。如果Mat回答,我应该得到他的答案:-)同时,你的这是一个经常被忽视的,但很重要的提示!非常适合我,谢谢你的帖子!的确,我忽略了你,你提醒了我。谢谢在这种情况下,这是非常好的提醒。谢谢+如果可以的话。另外,不要使用带引号或不带引号的
main$*
。这不一样,不起作用。