我正在寻找一种方法来处理包含必须被解析的空格的参数 通过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
现在如果-u的参数像“STRING WITH WHITE SPACE” 不仅仅是触发了字符串的第一部分而且while循环没有结束。
非常感谢。答案 0 :(得分:29)
年轻球员的陷阱(即我!)
要注意这样一条线:
main $@
你真正需要的是:
main "$@"
否则getopts
会将你的选择分成小部分
http://www.unix.com/shell-programming-scripting/70630-getopts-list-argument.html
答案 1 :(得分:9)
如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
要求这些引号不是脚本中的缺陷,而是调用shell的工作方式。所有程序,脚本或其他方式都接收参数作为字符串的列表。调用shell中的引号用于将这些参数排序为单独的“单词”(列表元素)。上面的所有调用(由unix shell创建)将三个字符串的列表传递给脚本:$0
是脚本名称(myscript
),$1
是-u
并且$2
是字符串string with white space
。