首页 > 解决方案 > 如何检查 GETOPTS 提供的参数值是否等于特定字符串?

问题描述

我正在编写 bash 脚本,它将根据提供的参数在本地或远程构建一个 docker 映像。

我正在努力检查提供的字符串是否等于“远程”或“本地”。

当我执行脚本时,它不接受任何数字,但它接受任何字符串。

!/bin/bash

usage() { echo "Usage: $0 [-m < local|remote>]" 1>&2; exit 1; }

while getopts "m:" o; do
    case "${o}" in
        m)
            destination=${OPTARG}
            ((destination == "local" || destination == "remote")) || usage
            ;;
        *)
            usage
            ;;
    esac
done
shift "$((OPTIND-1))"

echo $destination

标签: stringbashdockergetopts

解决方案


因此,您真正需要做的唯一更改是将您的((...))语句更改[[ ... ]]为@Nahuel Fouilleul 建议的语句,并将$'s 添加到您的目标变量中。然而,他们的建议对您不起作用,因为目的地拼写错误。我有如下所示的更新代码。

#!/bin/bash

usage() { echo "Usage: $0 [-m < local|remote>]" 1>&2; exit 1; }

while getopts "m:" o; do
  case "${o}" in
    m)
        destination=${OPTARG}
        [[ $destination == "local" || $destination == "remote" ]] || usage
        ;;
    *)
        usage
        ;;
  esac
done

shift "$(( OPTIND-1 ))"

echo $destination

但是,您不需要在 switch 语句中检查此信息,您可以检查代码的主要部分并确保已使用参数扩展设置目标,如下所示:

...
    m)
        destination=${OPTARG}
        ;;
...

[[ ${destination:?A destination is required.} == "local" || ${destination} == "remote" ]] || usage

echo $destination

推荐阅读