ksh while 循环表现怪异

ksh while loop is behaving weird

我在 ksh 中有 while 循环,它读取文件并循环遍历每一行。 这是相同的文件内容 (TestCases.txt)

TEST_PROC_1(1)/TEST_1,TEST_2,TEST_3/N/P
TEST_PROC_1(1)/TEST_1,TEST_2,TEST_3/N/N
TEST_PROC_2('CICD_DEMO.txt')/TEST_1,TEST_2,TEST_3/N/N
TEST_FUNC_1(100)/TEST_1,TEST_2,TEST_3/N/P
TEST_FUNC_2/TEST_1,TEST_2,TEST_3/N/N
TEST_PROC_4/TEST_1,TEST_2/N/N
TEST_FUNC_3(3)//N/P

读取文件的脚本

swd=$(pwd)
export swd

file=${swd}/TestCases.txt

export testCaseIndex=1
export validateTblIndex=1

cat ${file} | while IFS=\/ read procname tablelist hold_data testcase_type
do
    echo "$procname $tablelist $hold_data $testcase_type"

    ksh ${swd}/assets/sh/main.sh "${procname}" "${tablelist}" "${hold_data}" "${testcase_type}" "${testCaseIndex}" "${validateTblIndex}"
    ret=$?
    echo $ret
    (( testCaseIndex+=1 ))
    (( validateTblIndex+=1 ))
done 

这是问题

如果我评论 ksh 调用,它会迭代到最后一行。

TEST_PROC_1(1) TEST_1,TEST_2,TEST_3 N P
0
TEST_PROC_1(1) TEST_1,TEST_2,TEST_3 N N
0
TEST_PROC_2('CICD_DEMO.txt') TEST_1,TEST_2,TEST_3 N N
0
TEST_FUNC_1(100) TEST_1,TEST_2,TEST_3 N P
0
TEST_FUNC_2 TEST_1,TEST_2,TEST_3 N N
0
TEST_PROC_4 TEST_1,TEST_2 N N
0
TEST_FUNC_3(3)  N P
0

如果我取消注释,它会在文件的第一行停止。

TEST_PROC_1(1) TEST_1,TEST_2,TEST_3 N P
0

请帮助解决可能存在的问题。即使我 运行 分开,ksh 调用也能正常工作。 我有ksh93版本。

main.sh 也从标准输入中读取,它从循环中继承,因此它正在消耗用于 read 命令的数据。鉴于这让您感到惊讶,您可以简单地从 /dev/null.

重定向脚本的标准输入

(此外,除非 cat ${file} 只是填充其他生成数据的进程,否则请使用输入重定向而不是管道。)

while IFS=/ read procname tablelist hold_data testcase_type
do
    echo "$procname $tablelist $hold_data $testcase_type"

    ksh ${swd}/assets/sh/main.sh "${procname}" \
       "${tablelist}" "${hold_data}" "${testcase_type}" \
       "${testCaseIndex}" "${validateTblIndex}" < /dev/null
    ret=$?
    echo $ret
    (( testCaseIndex+=1 ))
    (( validateTblIndex+=1 ))
done < $file

如果main.sh确实需要从标准输入读取,请为read命令使用不同的文件描述符。

while IFS=/ read procname tablelist hold_data testcase_type <&3
do
    echo "$procname $tablelist $hold_data $testcase_type"

    ksh ${swd}/assets/sh/main.sh "${procname}" \
       "${tablelist}" "${hold_data}" "${testcase_type}" \
       "${testCaseIndex}" "${validateTblIndex}" < /dev/null
    ret=$?
    echo $ret
    (( testCaseIndex+=1 ))
    (( validateTblIndex+=1 ))
done 3< $file