如何在

时间:2017-03-13 01:40:51

标签: bash shell associative-array

我不确定创建它的最佳方法是什么,但这是我想在这个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上运行它。

1 个答案:

答案 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
}