string - 如何检查 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
解决方案
因此,您真正需要做的唯一更改是将您的((...))
语句更改[[ ... ]]
为@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
推荐阅读
- python - 我的数据生成器没有获取新数据。每次交互都获得相同的数据
- javascript - SMS 权限已从 androidmanifest.xml 中删除,但仍出现在 manifest.class 中
- javascript - 如何 .focus() Javascript 中的 .srcElement / childNode
- jquery - 更改前一个选择器的类 > 子元素
- perl - Perl 如何验证一个路径是一个目录,但又不能同时调用 opendir() 呢?
- java - 在 Spring Boot 中访问多个属性并动态分配的最佳方法
- java - 如何模拟 jdbcTemplate.query(sqlQuery, new Object[] {id, name}, new Mapper())
- vb.net - Show First 10 Highest/Lower value in my Line Textbox
- ios - 如何在每次点击更新的条件下禁用特定 CollectionViewCell 的用户交互
- react-native - 条目,“:CFBundleIdentifier”,在新的反应原生项目中不存在