Arrays 关联数组名称替换和复制bash

Arrays 关联数组名称替换和复制bash,arrays,bash,Arrays,Bash,我有一个bash脚本,它检查输入日期($1)是否在一个或多个日期范围内。用户输入日期和(a或b,即$2) 我不知道如何将关联数组复制到dict变量。 样本使用 $ ./script.sh 20170707 a 20170707 falls in the range of a 你根本不需要复制任何东西;你只需要一个别名 #!/usr/bin/env bash today=$(date +"%Y%M%d") # you need declare -A **before** data is

我有一个bash脚本,它检查输入日期($1)是否在一个或多个日期范围内。用户输入日期和(a或b,即$2)

我不知道如何将关联数组复制到dict变量。 样本使用

$ ./script.sh 20170707 a

  20170707 falls in the range of a

你根本不需要复制任何东西;你只需要一个别名

#!/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
#/usr/bin/env bash
今天=$(日期+%Y%M%d)
#在给出**数据之前,您需要声明-A**。
#以前,这些是稀疏索引数组,而不是关联数组。
声明-A_范围=([“20140602”]=“20151222”[“20170201”]=“今日美元”)
声明-A b_范围=([“20140602”]=“20150130”)
#declare-n使dict成为对命名范围的引用(而不是副本)。
声明-n dict=“$2_范围”
对于“${!dict[@]}”中的键;做
如果($1=键));然后
echo“$1落在$2的范围内”
fi
完成

declare-n
是ksh93功能的bash(4.3+)版本
nameref
;参见

你根本不需要复制任何东西;你只需要一个别名

#!/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
#/usr/bin/env bash
今天=$(日期+%Y%M%d)
#在给出**数据之前,您需要声明-A**。
#以前,这些是稀疏索引数组,而不是关联数组。
声明-A_范围=([“20140602”]=“20151222”[“20170201”]=“今日美元”)
声明-A b_范围=([“20140602”]=“20150130”)
#declare-n使dict成为对命名范围的引用(而不是副本)。
声明-n dict=“$2_范围”
对于“${!dict[@]}”中的键;做
如果($1=键));然后
echo“$1落在$2的范围内”
fi
完成

declare-n
是ksh93功能的bash(4.3+)版本
nameref
;请参见

b_range
不是一个范围。我有一个开始日期和结束日期作为键值对。它不是一个真正的范围,那么为什么在
a_范围中有两个元素呢。也就是说,可能不是完全相同的,但这里的解决方案听起来像是满足了您的需要。向下滚动到第一个答案的第二个解决方案(即跳过使用
eval
的解决方案)。或者,直接跳到第二个答案,它使用相同的解决方案(间接引用)。您可能需要了解如何修改它以使用关联数组。
b_range
不是一个范围。我有一个开始日期和结束日期作为键值对。它不是一个真正的范围,那么为什么在
a_范围中有两个元素呢。也就是说,可能不是完全相同的,但这里的解决方案听起来像是满足了您的需要。向下滚动到第一个答案的第二个解决方案(即跳过使用
eval
的解决方案)。或者,直接跳到第二个答案,它使用相同的解决方案(间接引用)。不过,您可能需要弄清楚如何修改它以使用关联数组。啊,我错过了大约$2_范围的引号。到目前为止,我只试过dict=$2_范围。谢谢这些报价并不是绝对必要的。区别在于
declare-n
。我以前尝试过
declare-n
和上面的更改。也许我尝试了错误的变化组合。谢谢你的解释啊,我错过了2美元左右的报价。到目前为止,我只试过dict=$2_范围。谢谢这些报价并不是绝对必要的。区别在于
declare-n
。我以前尝试过
declare-n
和上面的更改。也许我尝试了错误的变化组合。谢谢你的解释