【问题标题】:associative array name substitution and copy bash关联数组名称替换和复制 bash
【发布时间】:2023-03-06 13:24:01
【问题描述】:

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

#!/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

【问题讨论】:

  • b_range 不是一个范围。
  • 我有一个开始日期和结束日期作为键值对。它不是一个真正的范围
  • 那为什么a_range中有两个元素呢?
  • 日期可以分为两个不同的范围。
  • 可能重复:stackoverflow.com/questions/11180714/…。也就是说,可能不是完全相同的副本,但这里的解决方案听起来像是你需要的。向下滚动到第一个答案的第二个解决方案(即,跳过使用 eval 的解决方案)。或者,直接跳到第二个答案,它使用相同的解决方案(间接引用)。不过,您可能需要弄清楚如何修改它以使用关联数组。

标签: arrays bash


【解决方案1】:

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

#!/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 是 ksh93 功能 nameref 的 bash (4.3+) 版本;见http://wiki.bash-hackers.org/commands/builtin/declare#nameref

【讨论】:

  • 啊,我错过了 $2_range 周围的报价。到目前为止,我只尝试过 dict=$2_range 。谢谢
  • 这些引用并不是绝对必要的。与众不同的是 declare -n
  • 我之前尝试过declare -n 和上述更改。也许我尝试了错误的更改组合。感谢您的解释
猜你喜欢
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
  • 2020-10-12
  • 1970-01-01
相关资源
最近更新 更多