如何处理参数包含空格的shell getopts
我正在寻找一种方法来处理包含必须解析的空格的参数 通过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
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$*
。这不一样,不起作用。