如何检查 GETOPTS 提供的参数值是否等于特定字符串?

How can I check if the value of argument provided from GETOPTS is equal to specific string?

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

我正在努力检查提供的字符串是否等于 "remote" 或 "local"。

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

!/bin/bash

usage() { echo "Usage: [=10=] [-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

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

#!/bin/bash

usage() { echo "Usage: [=10=] [-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