2012-10-11 71 views
0

这是使用OPTS获取和设置的正确方法吗?这是写opts的正确方法

我希望能够采取很多的选项,如

./runthis.sh --option1 setuff --option2 setmorestuff

while : 
do 
     case $1 in 
       -h | --help | -\?) 
         usage 
         exit 0 
         ;; 
       -o | --option1) 
         O=$2 
         shift 2 
         ;; 
       -z | --option2) 
         Z=$2 
         shift 2 
         ;; 
       --) # End of all options 
         shift 
         break 
         ;; 
       -*) 
         echo "WARN: Unknown option (ignored): $1" >&2 
         shift 
         ;; 
       *) # no more options. Stop while loop 
         break 
         ;; 
     esac 
done 
+2

你应该看看http://stackoverflow.com/a/7680682/315052 – jxh

+2

'而:'本质上是相同的,而' TRUE'。 – chepner

回答

1

你有两个选择,如果随时提供给您要分析选项:

  1. getopts的(你可以查找getopts的教程,这一个)
  2. 手工解析(我将在这里介绍)

使用getopts可能会更容易,但不够灵活。你的代码大部分是正确的,但不适合更通用的选项解析。

  1. 正如chepner所述,while truewhile :相同。前者是首选,因为它立即直观地表明了它正在做什么。这是我们正在讨论的bash,而不是perl。不需要不必要的混淆。
  2. while true对于解析选项不是一个好的循环终止条件。如果你仔细想一想,它就不会告诉你这个循环在做什么。我必须一路走到最后一个案子,了解发生了什么事。正确的循环终止条件是当用完命令行参数时。
  3. 我们的循环并没有立即明显地表现出任何形式的统一循环。我必须阅读每个案例才能看到您正在移动位置参数数组。由于在每次迭代中至少要做一次shift,因此请执行此操作。
  4. 联系到#2,使用*)来检查循环终止不是一个好主意。空字符串会匹配:

    ./foo.sh --option1“” --option2 123

    正如你可以看到,option2会不会把它的使用您的代码值。幸运的是#2也会解决这个问题。

  5. 最后一点:您应该引用所有变量,除非您确定它们不包含空格。 bash中的空白分割会在变量替换之后发生,因此空格可能会让你感到困扰。如果你不确定,请引用它。

你的代码修订版可能是:

while [ $# -gt 0 ] 
do 
     case "$1" in 
       -h | --help | -\?) 
         usage 
         exit 0 
         ;; 
       -o | --option1) 
         O="$2" 
         shift 
         ;; 
       -z | --option2) 
         Z="$2" 
         shift 
         ;; 
       --) # End of all options 
         shift 
         break 
         ;; 
       *) 
         echo "WARN: Unknown option (ignored): $1" >&2 
         break 
         ;; 
     esac 
     shift 
done 
相关问题