当数字相等时,为什么我的bash-less-then语句计算为TRUE?

当数字相等时,为什么我的bash-less-then语句计算为TRUE?,bash,Bash,我有一个脚本,我想做一些事情,直到计数器小于一行的大小。出于某种原因,当计数器与行大小相同时,bash说-lt比较是正确的,尽管事实并非如此。我一辈子都搞不明白为什么这样不行: while IFS= read -r line; do # get the size of the line sizeOfLine=`echo $line | awk -F"," '{print NF}'`

我有一个脚本,我想做一些事情,直到计数器小于一行的大小。出于某种原因,当计数器与行大小相同时,bash说-lt比较是正确的,尽管事实并非如此。我一辈子都搞不明白为什么这样不行:

while IFS= read -r line;
        do
                # get the size of the line
                sizeOfLine=`echo $line | awk -F"," '{print NF}'`

                #line counter
                lineCounter=0

                while [ $lineCounter -le $sizeOfLine ]
                do
                        if [ $lineCounter -lt $numHeaders ]
                        then
                                word=`echo $line | awk -v i=$((lineCounter+1)) -F, '{ print $i }'`
                                echo "<${header[$lineCounter]}> $word </${header[$lineCounter]}>" >> $outFile

                        elif  [[ "$lineCouter" -lt "$sizeOfLine" ]]
                        then    
                                word=`echo $line | awk -v i=$((lineCounter+1)) -F, '{ print $i }'`
                                echo "<${header[$numHeaders]}> $word </${header[$numHeaders]}>" >> $outFile

                        fi

                        #increase your counter
                        lineCounter=$((lineCounter+1))

                done

        done
而IFS=read-r行;
做
#获取线的大小
sizeOfLine=`echo$line | awk-F',“{print NF}”`
#线路计数器
lineCounter=0
而[$lineCounter-le$sizeOfLine]
做
如果[$lineCounter-lt$numHeaders]
然后
word=`echo$line | awk-vi=$((lineCounter+1))-F'{print$i}'`
回显“$word”>>$outFile
elif[“$lineCouter”-lt“$sizeOfLine”]]
然后
word=`echo$line | awk-vi=$((lineCounter+1))-F'{print$i}'`
回显“$word”>>$outFile
fi
#增加你的计数器
lineCounter=$((lineCounter+1))
完成
完成

当我对示例文件运行此命令时,它会在输出中添加一行,因为出于某种原因,当lineCounter=sizeOfLine时,bash会将“$lineCouter”-lt“$sizeOfLine”计算为true。

似乎有输入错误,应该是
lineCounter
而不是最后一个
elif

中的
lineCouter
似乎有输入错误,应该是
lineCounter
而不是最后一个
elif

为什么要将行计数器与给定行中的字段数进行比较?而且,这是一种效率极低的处理文件的方法。@chepner变量的名称令人困惑
lineCounter
实际上是当前字段号(减1)。另外,对于Bob_From_IT:使用!并将
set-x
放在代码的麻烦部分之前,这样您就可以看到它们正在执行。这两种方法中的任何一种都会使这个问题很容易被发现。@chepner您将如何改进它?此脚本将csv文件转换为xml文件。csv文件的每一行都包含必须分配给每个标题的多个值。最后一个标头获取超过指定给它的特定数量的每个值。每行包含每个标题的至少一个值,但可以包含最后一个标题的未知数量的额外值(因此,如果有3个标题,则行的长度可以至少为3个值,但最多可以为未知数量)@Bob_首先,csv是否可以在字段中包含引用或转义数据?如果可以的话,您需要一个合适的csv解析器,所以您应该立即切换到一种有csv解析器的语言(Python等)。类似地,如果数据可能包含XML中特殊的字符,特别是“如果bash在这之后仍然是一种可能性,那么首先想到的改进是从
开始,而IFS=,read-ra字段;在“${!fields[@]}”中为fieldNum执行操作;在“${!fields[@]}”中为fieldNum执行操作
”$fieldNum“和
“${fields[fieldNum]}”“
访问字段编号和内容(跳过所有
$(echo$行| awk…
文件夹)。哦,在循环结束时使用一个“$outFile”(注意引号),而不是打开和关闭每个项目的文件。另一种选择是在
awk
中执行所有操作(我指的是所有操作)。为什么要将行计数器与给定行中的字段数进行比较?而且,这是一种效率极低的处理文件的方法。@chepner变量的名称令人困惑
lineCounter
实际上是当前字段号(减1)。另外,对于Bob_From_IT:使用!并将
set-x
放在代码的麻烦部分之前,这样您就可以看到它们正在执行。这两种方法中的任何一种都会使这个问题很容易被发现。@chepner您将如何改进它?此脚本将csv文件转换为xml文件。csv文件的每一行都包含必须分配给每个标题的多个值。最后一个标头获取超过指定给它的特定数量的每个值。每行包含每个标题的至少一个值,但可以包含最后一个标题的未知数量的额外值(因此,如果有3个标题,则行的长度可以至少为3个值,但最多可以为未知数量)@Bob_首先,csv是否可以在字段中包含引用或转义数据?如果可以的话,您需要一个合适的csv解析器,所以您应该立即切换到一种有csv解析器的语言(Python等)。类似地,如果数据可能包含XML中特殊的字符,特别是“如果bash在这之后仍然是一种可能性,那么首先想到的改进是从
开始,而IFS=,read-ra字段;在“${!fields[@]}”中为fieldNum执行操作;在“${!fields[@]}”中为fieldNum执行操作
”$fieldNum“和
“${fields[fieldNum]}”“
访问字段编号和内容(跳过所有
$(echo$行| awk…
文件夹)。哦,在循环结束时使用一个“$outFile”(注意引号),而不是打开和关闭每个项目的文件。另一个选择是在
awk
中做所有事情(我指的是所有事情)。