2017-07-15 68 views
0

我有一個bash腳本,用於檢查輸入日期($ 1)是否落入日期範圍/範圍內。用戶輸入日期和(a或b,即$ 2)。關聯數組名稱替換和複製bash

#!/usr/bin/env bash 

today=$(date +"%Y%M%d") 
declare -A dict=$2_range 
a_range=(["20140602"]="20151222" ["20170201"]="$today") 
b_range=(["20140602"]="20150130") 

for key in ${!dict[@]}; do 
    if [[ $1 -le ${dict[$key]} ]] && [[ $1 -ge $key ]]; then 
    echo $1 falls in the range of $2 
    fi 
done 

我不知道如何將關聯數組複製到dict變量。 樣本用法

$ ./script.sh 20170707 a 

    20170707 falls in the range of a 
+0

'b_range'不是一個範圍。 – Jack

+0

我有一個開始日期和結束日期作爲鍵值對。它不是一個範圍 – pdna

+0

那麼爲什麼'a_range'中有兩個元素? – Jack

回答

2

您根本不需要複製任何東西;你只需要一個別名。

#!/usr/bin/env bash 

today=$(date +"%Y%M%d") 

# you need declare -A **before** data is given. 
# previously, these were sparse indexed arrays, not associative arrays at all. 
declare -A a_range=(["20140602"]="20151222" ["20170201"]="$today") 
declare -A b_range=(["20140602"]="20150130") 

# declare -n makes dict a reference to (not a copy of) your named range. 
declare -n dict="$2_range" 

for key in "${!dict[@]}"; do 
    if (($1 <= ${dict[$key]})) && (($1 >= key)); then 
    echo "$1 falls in the range of $2" 
    fi 
done 

declare -n是在bash(4.3+)的ksh93的特徵nameref的版本;見http://wiki.bash-hackers.org/commands/builtin/declare#nameref

+0

啊,我錯過了2美元左右的報價。到目前爲止,我只嘗試過dict = $ 2_range。謝謝 – pdna

+0

這些引號不是絕對必要的。這是'聲明-n',這是有所作爲的。 –

+0

我已經嘗試過'聲明-n'和上面的更改。也許我嘗試了錯誤的組合變化。感謝您的解釋 – pdna