bash多个命令行参数相互依赖

时间:2011-12-16 10:45:14

标签: bash

我有一个脚本,其中接受以下参数: ./script [-dph] [-peh] 第一个参数告诉脚本我是否需要使用生产脚本或开发脚本来执行它。第二个参数告诉脚本生成的报告的输出是应该作为电子邮件发送还是应该重定向到html页面。

当我使用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

我如何使用两个选项来实现它,其中第二个参数表示基于第一个参数的不同操作?

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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