在bash脚本中,我可以使用&&将两个命令行参数组合在一起

时间:2011-06-22 00:47:34

标签: bash scripting

这是一个片段:

for arg in "$@"; do
    if [ $arg == "--coverage" ]; then
        ENABLE_COVERAGE=1
        shift
    elif [ $arg == "--mysql" ]; then
        MYSQL_ONLY=1
        shift
    elif [ $arg == "--psql" ]; then
        PSQL_ONLY=1
        shift
    elif [ $arg == "-h" ] || [ $arg == "--help" ]; then
        usage
        shift
    elif [ $arg == "--qa" ]; then
        QA_ONLY=1
        PSQL_ONLY=1
        MYSQL_ONLY=1
        shift
   elif [ $arg == "--qa" ] && [ $arg == "--mysql" ]; then
        QA_ONLY=1
        MYSQL_ONLY=1
        shift
   elif [ $arg == "--qa" ] && [ $arg == "--psql" ]; then
        QA_ONLY=1
        PSQL_ONLY=1
        shift
    elif [ $arg == "--" ]; then
        shift 
        break                                               
    fi                                                      
done                

2 个答案:

答案 0 :(得分:1)

$arg 永远不会同时等同于--qa--mysql

如果您正在讨论不同的参数,那么是的,您可以这样做:

if [[ $arg1 == "--qa" && $arg2 == "--mysql" ]] ; then
    QA_ONLY=1
    MYSQL_ONLY=1
fi

但我经常发现,只需按顺序扫描参数,为每个参数设置一个标志,然后使用标志来决定行为,这是一个更好的主意。否则,您要么将命令行参数限制为特定顺序(xyz --qa --mysql将起作用,xyz --mysql -- qa将不起作用),或者您的代码变得非常复杂,因为它试图检查每个反对每种可能性的论据。

答案 1 :(得分:0)

如果你可以在bash中调用getopt,你不能调用getopt,它不应该使用长选项名称。使用getopts而不是getopt。(下面是一个例子)

#!/bin/bash

while getopts qm OPT
do
  case $OPT in
    q) opt_qa=1;;
    m) opt_mysql=1;;
  esac
done

if [ $opt_qa = 1 ]; then
  # do as qa
fi

if [ $opt_mysql = 1 ]; then
  # do as mysql
fi