ksh while循环表现得很奇怪

时间:2016-11-14 13:12:00

标签: bash ksh

我在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版本。

1 个答案:

答案 0 :(得分:2)

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