数组

时间:2017-11-28 15:14:02

标签: bash shell

我有一个不同日期的数组:

  • 2017-10-25
  • 2017年11月17日 等

根据给定的参数,我计算了一个日期:$MEDIA_NDATE

如果它与数组中的任何日期不匹配,我希望函数递减$MEDIA_NDATE,直到它与数组中的日期匹配。

我尝试了不同的东西,但我找不到合适的东西:(

function contains() {
i=0
len=${#arr[@]}


     while [ $i -lt $len ]; do
        for j in "${arr[@]}"
          do
           if [ "$j" == "$MEDIA_NDATE" ];then
                echo " value of media_ndate --> : $MEDIA_NDATE"
                  return 0

            elif [ "$j" != "$MEDIA_NDATE" ];then
                      let i++ 

            elif [ "$i" -eq "$len" ] && [ "$j" != "$MEDIA_NDATE"];then
 #                     MEDIA_NDATE=$(date +%Y-%m-%d -d  "$MEDIA_NDATE -i day") 
 #                      echo "value of media_ndate in function contains $MEDIA_NDATE "
           fi
        done
     done 

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,您可以通过在一个循环中搜索确切日期,同时通过将DialogResult添加到临时数组$MEDIA_NDATE来跟踪dates之前的所有日期来实现此目的。如果存在完全匹配,则从函数返回,如果没有,则在数组dates中搜索最接近$MEDIA_NDATE的日期。

为了便于处理,例如日期比较,将所有日期转换为date -d "$some_date" +%s的可移植格式并将其转换回函数末尾所需的格式非常有用。

contains() {
   local -a dates
   local media_date=$(date -d "$MEDIA_NDATE" +%s)
   local currDate
   local j

   for j in "${arr[@]}"; do
      if [ "$j" == "$MEDIA_NDATE" ]; then
         echo "Value of media_ndate --> $MEDIA_NDATE"
         return 0
      fi

      currDate=$(date -d "$j" +%s)
      (( currDate < media_date )) && dates+=($currDate)

   done

   [[ ${#dates[@]} -eq 0 ]] && return 1
   local result=$(printf -- '%s\n' "${dates[@]}" | sort -nr | head -n 1)

   MEDIA_NDATE=$(date -d "@$result" '+%Y-%m-%d')
   echo "Value of media_ndate --> $MEDIA_NDATE"
   return 0 
}

编辑:我添加了一个更好的解决方案,它不需要临时数组,只跟踪最近的日期:

contains() {
   [[ ${#arr[@]} -le 0 ]] && return 1

   local media_date=$(date -d "$MEDIA_NDATE" +%s)
   local max_date=$(date -d "${arr[0]}" +%s)
   local curr_date
   local j

   for j in "${arr[@]}"; do
      if [ "$j" == "$MEDIA_NDATE" ]; then
         echo "Value of media_ndate --> $MEDIA_NDATE"
         return 0
      fi

      curr_date=$(date -d "$j" +%s)
      (( curr_date < media_date && curr_date > max_date )) && max_date=$curr_date

   done

   (( max_date > media_date )) && return 1

   MEDIA_NDATE=$(date -d "@$max_date" '+%Y-%m-%d')
   echo "Value of media_ndate --> $MEDIA_NDATE"
}