【问题标题】:ksh while loop is behaving weirdksh while 循环的行为很奇怪
【发布时间】:2016-11-14 13:12:00
【问题描述】:

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

【问题讨论】:

    标签: bash ksh


    【解决方案1】:

    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
    

    【讨论】:

    • 非常感谢。它成功了,也感谢您的精彩解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多