bash脚本中的参数和开关

时间:2015-11-17 15:37:55

标签: bash command-line-arguments optionparser

我需要修改我的一个脚本。到目前为止,它有两个强制性参数,指出将要应用此更新的更新版本和数据库

./script.sh version db_name

现在我想添加两个新的可选参数,实际上我应该称之为开关。这些开关将其扩展为: 1.安装之前停止(或不安装)我的Web服务器 2.还将一些新文件安装到文件系统 两个返回bool值。所有细节都在脚本中。 所以我希望有类似的东西:

./script.sh version db_name -stopweb  -copyfiles

我已经发现 getopts 是合适的命令。问题是如何将参数(强制性)和开关(可选)“加入”在一起。我真的不能得到它:( 你能给我一些提示吗?

1 个答案:

答案 0 :(得分:2)

您应该考虑使用getopts。以下是我在bash脚本中用于选项解析的示例:

TEMP=$(getopt -o dp:v --long dev,publish:,verbose -- "$@")

# Note the quotes around '$TEMP': they are essential!
eval set -- "$TEMP"

#default values
DEV=0
VERBOSE=
while true; do
    case "$1" in
        -d | --dev ) DEV=1; shift ;;
        -p | --publish ) PUBLISH="$2" ; shift 2;;
        -v | --verbose ) VERBOSE="-v" ; shift ;;
        -- ) if [ -n "$2" ]
            then
                ARGUMENT1=$2
                if [ -n "$3" ]
                then
                    ARGUMENT2=$3
                    if [ -n "$4" ]
                    then
                        shift 3
                        echo "Unexpected options: \"$@\" . exiting."
                        exit 1;
                    fi
                fi
            fi
            shift 2; break;;
        * ) break ;;
    esac
done

# you can add some checks here that ARGUMENT1 and ARGUMENT2 were effectively set, if they are mandatory

一些功能:

  • 使用短期和长期期权
  • 某些选项需要参数
  • 使用一些可选参数(在本例中为一个),不以-
  • 开头

注意:为了让getopts能够区分-dv是两个短选项而--dev是一个长选项;所有长期选项都应以两个连字符开头。