将日期与CSV中的日期范围进行比较-BASH

将日期与CSV中的日期范围进行比较-BASH,bash,csv,while-loop,heredoc,Bash,Csv,While Loop,Heredoc,我试图将用户输入与here文档进行比较,以比较输入是否大于或小于2个数字(日期),如果是,则打印第一列。 我的文件如下所示: Earth,19480210,19490228 Earth,19490229,19500216 Metal,19500217,19510205 用户可以输入20100215作为日期。这是我的while循环,它使用while读取中包含的两个变量进行比较 while IFS=, read -r term start end; do if [[ $query -ge $sta

我试图将用户输入与here文档进行比较,以比较输入是否大于或小于2个数字(日期),如果是,则打印第一列。 我的文件如下所示:

Earth,19480210,19490228
Earth,19490229,19500216
Metal,19500217,19510205
用户可以输入20100215作为日期。这是我的while循环,它使用while读取中包含的两个变量进行比较

while IFS=, read -r term start end; do
if [[ $query -ge $start && $query -le $end ]];then
    echo $term
fi
    echo $query
    exit
done << EOF
$(cat chzod)
EOF
当IFS=,read-r术语开始-结束;做
如果[[$query-ge$start&&$query-le$end]];然后
echo$术语
fi
echo$查询
出口

完成您的问题仍然有点不清楚,我在这里读了一些字里行间的内容,但是如果我猜对了,您希望循环CSV文件中的所有条目,如果
$query
介于
开始
结束
之间,您希望输出
术语
。但是,如果在循环遍历整个文件之后,如果没有匹配,您是否要再次打印查询

如果是这样的话,那么您就是在循环逻辑上绊倒了。有很多方法可以处理这个问题,但是当执行多个查询时,您需要确认是否进行了匹配,最简单的解决方案就是设置一个在进行匹配时切换的标志。然后在完成所有比较后,检查标志是否已设置

一个简单的例子是:

#!/bin/bash

fname="${1:-chzod}"    # take csv file as first argument (default: chzod)

printf "query: "       # prompt for query
read -r query

test -z query && exit  # validate query

declare -i matched=0   # declare matched flag, set to '0'

while IFS=, read -r term start end; do
    if [[ $query -ge $start && $query -le $end ]];then
        echo $term
        matched=1      # set 'matched' flag
    fi
done < "$fname"        # redirect CSV file into loop

# check 'matched' flag and if unset, output unmatched query
test "$matched" -eq '0' && echo "unmatched query: $query"

如果我误解了您的意图,请给我写封信,我很乐意进一步提供帮助。

问题是什么?我有点迷茫,我不知道为什么它会输出多个元素。我想知道while循环是否有效,或者我是否应该找到另一个解决方案。因为
echo$query
。您正在提交UOOC(不必要地使用Cat)。当您发现自己在执行
cat…
时,实际上并没有连接两个(或更多)文件,它可能是一个UOOC。更好,
while。。。;做完成后,我使用您的脚本检查错误,结果发现我的CSV文件中充满了错误,我重新创建了它,该脚本工作正常。谢谢你的帮助,大卫,祝你好运。当然,很高兴我能帮上忙。祝你的脚本编写工作好运。
$ bash readearth.sh dat/earth.dat
query: 19490229
Earth

$ bash readearth.sh dat/earth.dat
query: 19510204
Metal

$ bash readearth.sh dat/earth.dat
query: 20100215
unmatched query: 20100215