我不确定创建它的最佳方法是什么,但这是我想在这个shell脚本中做的事情的流程。我基本上有一个命令/ cli列表(将数据库连接字符串传递给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上运行它。
答案 0 :(得分:2)
如果您想使用较新版本的bash,请更新shebang以引用它,理想情况下使用#!/usr/local/bin/bash
或#!/opt/local/bin/bash
,具体取决于您的软件包管理器。如果新的bash将出现在PATH的前面,你也可以使用#!/usr/bin/env bash
。
如果您要使用系统bash,则必须更改代码以避免关联数组。
OS X附带的bash版本不支持关联数组。此版本的bash以/bin/bash
和/bin/sh
提供。在OS X上自行安装更高版本的bash(或使用macports或homebrew)没有任何障碍。
$ /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。
作为一种变通方法,您可以使用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
}