使用While循环在Shell脚本中调用子程序

时间:2014-10-05 12:03:20

标签: shell loops input

我正在尝试读取包含名为batcher.sh的子程序的参数的文件。我正在使用while循环逐行读取参数并将它们传递给子程序。

我面临的问题是,只有第一个循环迭代才会被执行。 SubProgram基本上调用存储过程,如下所示:

#!/bin/sh
input=/user/location/filename.out
while read line
do
        Name=$(echo $line | cut -d' ' -f1)
        Class=$(echo $line | cut -d' ' -f2)
        age=$(echo $line | cut -d' ' -f3)
        echo $Name $Class $age 
        cd /users/run/program/sample/bin/   
        ./batcher.sh RUN_CLASS_STRNTH -N $Name -C $Class -a $age >  /user/location/logs/class_strength`date +%Y%m%d%H%M`.log
done < "$input"
exit $?

在filename.out

中记录
BAL C1 23
JANE C3 32

BAL 成功触发子程序,然后存在。

2 个答案:

答案 0 :(得分:2)

读取一条线并用回声和切割将其分开是非常麻烦的。 read内置函数接受多个变量名称:

 while read Name Class age rest; do
     echo $Name $Class $age
 done

这应该让你开始。

第二个问题可能是./batcher程序也从stdin读取,读取其余输入。为避免这种情况,请从/dev/null重定向stdin:

 ./batcher.sh  ... </dev/null

您可以通过注释掉batcher运行来验证这实际上是问题。如果循环然后为所有行运行,那就是问题。

Nitpick:请注意,反复执行cd directory也没用。一次就够了。

答案 1 :(得分:1)

你应该重定向循环的输出,否则循环的每次迭代都会覆盖上一次迭代的输出。

我还重构了其他一些部分。

#!/bin/sh
input=/user/location/filename.out
cd /users/run/program/sample/bin/
while read -r Name Class age; do
    echo "$Name $Class $age"
    ./batcher.sh RUN_CLASS_STRNTH -N "$Name" -C "$Class" -a "$age" 
done < "$input" >  /user/location/logs/class_strength`date +%Y%m%d%H%M`.log

exit $?完全是多余的,所以我把它拿出来了。如果任何迭代失败,你的脚本应该返回非零值?