bash 脚本中的参数和开关

use*_*616 0 bash command-line-arguments optionparser

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

./script.sh version db_name
Run Code Online (Sandbox Code Playgroud)

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

./script.sh version db_name -stopweb  -copyfiles
Run Code Online (Sandbox Code Playgroud)

我发现getopts是合适的命令。问题是如何将参数(强制)和开关(可选)“连接”在一起。我真的不明白:(请你给我一些提示。

Chr*_*aes 5

您应该考虑使用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
Run Code Online (Sandbox Code Playgroud)

一些特点:

  • 使用短选项和长选项
  • 有些选项需要参数
  • 使用一些可选参数(本例中为一个),其开头不是-

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