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

问题描述 投票:0回答:3

我正在寻找一种方法来处理包含必须解析的空格的参数 通过 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 循环不会到达末尾。

非常感谢。

shell getopts
3个回答
42
投票

年轻玩家的陷阱(即我!)

小心这样的一行:

main $@

你真正需要的是:

main "$@"

否则

getopts
会将你的选择切成小块

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


13
投票

正如 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 
.
    


0
投票

while getopts a:b:c:d:e: arg do case $arg in a) var_a=$OPTARG;; b) var_b=$OPTARG;; c) var_c=$OPTARG;; d) var_d=$OPTARG;; e) var_e=$OPTARG;; esac done

}

getArgs“$@”

© www.soinside.com 2019 - 2024. All rights reserved.