ksh while循环表现得很奇怪(ksh while loop is behaving weird)

编程入门 行业动态 更新时间:2024-10-25 10:29:31
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版本。

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/P

The 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 )) done

Here 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 0

If I uncomment it stops with first line of the file.

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

Kindly 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< $file

main.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 < $file

If 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

更多推荐

本文发布于:2023-08-07 15:18:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1464889.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:得很   奇怪   ksh   weird   behaving

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!