首页 > 解决方案 > 这种比较有什么问题,无法正确比较值?

问题描述

我正在尝试从元素列表中找到最旧的日期(以字符串格式)。我无法弄清楚为什么比较不起作用,导致发现的最旧日期始终是临时最旧日期,如下所示:

filedates=(20200110 20200120 20200219 20200220 20200420 20200422 20200110 20200120 20200219 20200220 20200420 20200422 20200219 20200220 20200420 20200422)

find_oldest_date (){
    arr=("$@")
    currentOldestDate=${arr[0]} # set a temporary oldest date
    echo "Temporary oldest date: "$currentOldestDate
    for date in "${arr[@]}"; do
     currentDate=$date
    if [[ "$currentDate" -lt "$currentOldestDate" ]]; then
      oldestDateFound=$currentDate
     else
      oldestDateFound=$currentOldestDate
     fi
    done
    echo "Oldest date found in directory: "$oldestDateFound
}
find_oldest_date "${filedates[@]}"

为了进行比较,我也尝试过:

 if [[ "$currentDate" < "$currentOldestDate" ]]

或者只有单括号和双引号,或者双括号没有引号......

它要求将文件作为参数传递,而不是直接使用它

标签: bash

解决方案


你永远不会改变currentOldestDate它的初始值 的值${arr[0]}。因此,您报告的最后看到的日期小于${arr[0]},而不是看到的最旧日期。

find_oldest_date (){
    arr=("$@")
    oldestDateFound=${arr[0]}
    echo "Temporary oldest date: "$oldestDateFound
    for date in "${arr[@]}"; do
     currentDate=$date
    if [[ "$currentDate" -lt "$oldestDateFound" ]]; then
      oldestDateFound=$currentDate
     else
      oldestDateFound=$currentOldestDate
     fi
    done
    echo "Oldest date found in directory: "$oldestDateFound
}

您可以将其简化为

find_oldest_date () {
  oldest=$1
  shift
  for current; do
    [[ $current -lt $oldest ]] && current=$oldest
  done
  echo "Oldest date found in directory: $oldest"
}

推荐阅读