2011-12-16 41 views
2

我有一个接受以下参数的脚本: ./script [-dph] [-peh] 第一个参数告诉脚本是否需要执行生产脚本或开发脚本。第二个参数告诉脚本生成的报告的输出应该作为电子邮件发送还是应该重定向到html页面。bash多个互相依赖的命令行参数

当我使用getopts时,我得到一个选项来处理一个选项。

while getopts "dph" opt_name 
do 
    case "$opt_name" in 
     h) 
      helpText 
      exit 1 
      ;; 
     d) 
      #Use Dev env 
      ;; 
     p) 
      #Use Prod env 
      ;; 
     *) 
      echo "Wrong command line argument. Exiting..."; 
      exit 1 
      ;; 
    esac 
done 

我该如何处理两个选项,其中第二个参数表示基于第一个参数的不同操作?

P.S .:请注意,我知道有dev和prod env选项并不是最好的解决方案,但我的应用程序处于概念验证阶段,因此,我正在使用我所知道的任何方法来构建它。

回答

0

简单的解决方案:为开发/生产标志使用不同的字母(例如大写D和P)。

复杂的解决方案:在p)下,检查环境是否已经决定。如果是这样,请使用第二个含义。如果没有,则将环境设置为生产。

2

这可能不是最优雅的解决方案,我很乐意了解更好的方法,但它很有效,它的功能很明确。

在getopts部分,您解析命令行选项并将它们分配给变量。在第二部分中,您可以控制cli选项依赖关系,并且可以直接在控制结构中执行操作。

#!/bin/bash 

while getopts "DPehp" opt_name 
do 
    case "$opt_name" in 
     h) 
      helpText 
      exit 1 
      ;; 
     D) 
      #Use Dev env 
      dev=true 
      ;; 
     P) 
      #Use Prod env 
      prod=true 
      ;; 
     p) 
      p=true 
      ;; 
     e) 
      e=true 
      ;; 
     *) 
      echo "Wrong command line argument. Exiting..."; 
      exit 1 
      ;; 
    esac 
done 

if [[ $dev == true && $prod == true ]] || [[ $dev != true && $prod != true ]] 
then 
    echo "You must choose between development (-D) or production (-P) scripts" 
    exit 
fi 

if [[ $dev == true ]] 
then 
    if [[ $p == true ]] 
    then 
     echo "Your 'p' dev action goes here" 
    fi 
    if [[ $e == true ]] 
    then 
     echo "Your 'e' dev action goes here" 
    fi 
elif [[ $prod == true ]] 
then 
    if [[ $p == true ]] 
    then 
     echo "Your 'p' prod action goes here" 
    fi 
    # and so on fi 
fi