将值与数组进行比较时出现Bash语法错误

时间:2014-10-28 17:07:12

标签: arrays bash

我在bash脚本中定义了以下数组

IFS=, read -r -a start_files <<< $(head -n 1 file.txt)
IFS=, read -r -a end_files <<< $(tail -n 1 file.txt)

我还从文件中读取了两个值

micro=1000000
IFS=#

[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while read start_time end_time
do

    start_time=$(bc <<< "scale=6; $start_time/$micro")
    end_time=$(bc <<< "scale=6; $end_time/$micro")

    ...

done < $INPUT
IFS=$OLDIFS

存储在数组中以及start_time和end_time中的值是纪元时间,我的意思是像1361810326.840284000,1361862515.600478000,1361990369.166456000

这样的值

在“...”行中,我想以下列方式将start_time和end_time的值与存储在数组中的所有值进行比较

for i in `seq 0 116`;
do
    if [ $start_time -ge ${start_files[$i]} && $start_time -le ${end_files[$i]}]; then
        startF=$i
    fi        
done


for j in `seq 0 116`;
do
    if [ $end_time -ge ${start_files[$j]} && $end_time -le ${end_files[$j]}]; then
        endF = $j
    fi        
done

但是,此代码会产生语法错误。我做错了什么?

1 个答案:

答案 0 :(得分:1)

如果您使用POSIX shell样式比较,最好将每个测试放在自己的方括号中。此外,您在比较结束时错过了一个空格。请记住,]是函数[的参数,而不是语法结构:

for i in {0..116}; do
    if [ "$start_time" -ge "${start_files[$i]}" ] && [ "$start_time" -le "${end_files[$i]}" ]; then
        startF="$i"
    fi        
done

另一个相同。我引用了你的变量,因为这是一个很好的习惯。我还使用了大括号扩展而不是调用seq

如果您使用的是bash,则可以利用更好的算术语法:

for ((i=0; i<=116; ++i)); do
    if (( start_time >= ${start_files[$i]} && start_time <= ${end_files[$i]} )); then
        startF="$i"
    fi        
done