我在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版本。
I have the while loop in ksh which reads the file and loop through each line. Here is the same file contents (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/PThe scripts which reads the document
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 )) doneHere is the problem
If I comment the ksh call it iterates till last line.
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 0If I uncomment it stops with first line of the file.
TEST_PROC_1(1) TEST_1,TEST_2,TEST_3 N P 0Kindly help out what could be possible issues. ksh call works fine even I run separately. I have ksh93 version.
最满意答案
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< $filemain.sh is also reading from standard input, which it inherits from the loop, so it is consuming data meant for the read command. Given that this surprises you, you may simply be able to redirect the script's standard input from /dev/null.
(Also, unless cat ${file} is just filling in for some other process that produces the data, use input redirection instead of a pipe.)
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 < $fileIf main.sh does need to read from standard input, use a different file descriptor for read command.
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更多推荐
发布评论