我不确定创建它的最佳方法是什么,但这是我想在这个 shell 脚本中执行的流程。我基本上有一个命令/cli列表(将db连接字符串传递给postgres),我想通过传入别名和另一个参数(名称)来创建快捷方式,以便我可以执行命令。
我正在尝试使用关联数组,但不确定这是否是这样做的方法。
这是我到目前为止。
#!/bin/bash
set -e
set -x
declare -A cluster_to_endpoint=(
[c01]="psql -h test-endpoint1-us-east-1.redshift.amazonaws.com -U masteruser -v v1=$NAME -p 5439 -f getTableDetails.sql"
[c02]="psql -h test-endpoint2.us-east-1.redshift.amazonaws.com -U masteruser -v v1=$NAME -p 5439 -f getTableDetails.sql"
[c03]="psql -h test-endpoint3.us-east-1.redshift.amazonaws.com -U masteruser -v v1=$NAME -p 5439 -f getTableDetails.sql"
)
while getopts ":c:n:" opt; do
case $opt in
c) cluster="$OPTARG";;
n) name="$OPTARG";;
*) usage
exit 1
;;
esac
done
我getopts
用于传入参数。
我想像这样执行它: ./myscript.sh -c c01 -n foobar
我想在 macOS 上运行它。
如果您想使用较新版本的 bash,请更新 shebang 以引用它,最好使用#!/usr/local/bin/bash
或#!/opt/local/bin/bash
取决于您的包管理器。#!/usr/bin/env bash
如果新的 bash 将更早地出现在 PATH 中,您也可以使用。
如果要使用系统 bash,则必须更改代码以避免关联数组。
OS X 附带的 bash 版本不支持关联数组。此版本的bash可作为/bin/bash
和使用/bin/sh
。在 OS X 上自己(或使用 macports 或自制软件)安装更高版本的 bash 没有任何障碍。
$ /bin/bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
Copyright (C) 2007 Free Software Foundation, Inc.
关联数组是在版本4中引入的。这是因为OS X使用的最新bash版本是GPL v2。
作为一种解决方法,您可以使用 with 函数,case
因为您不会在运行时向地图添加新元素:
cluster_to_endpoint() {
case "$1" in
c01)
psql -h test-endpoint1-us-east-1.redshift.amazonaws.com -U masteruser -v v1="$NAME" -p 5439 -f getTableDetails.sql
;;
c02)
psql -h test-endpoint2.us-east-1.redshift.amazonaws.com -U masteruser -v v1="$NAME" -p 5439 -f getTableDetails.sql
;;
c03)
psql -h test-endpoint3.us-east-1.redshift.amazonaws.com -U masteruser -v v1="$NAME" -p 5439 -f getTableDetails.sql
;;
esac
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句