带有循环的Bash脚本没有执行传入参数的实用程序?

时间:2015-01-14 16:14:10

标签: bash shell ksh aix

有人能帮帮我吗?我有一个我正在处理的shell脚本但是在" echo&#34之后的命令下面的循环;第一个文件是$ firstbd"没有被执行.. $ PROBIN / proutil?不知道为什么会这样......

基本上我有一个目录(* .list)中的文件列表,我抓住它们并读取第一行并将其作为参数传递给cmdlet然后将.list和.list的内容移动到另一个目录(.list有一个完整路径的文件列表)。

for i in $(ls $STAGEDIR/*.list); do
echo "Working with $i"
# grab first .bd file
firstbd=`head -1 $i`
echo "First file is $firstbd"
$PROBIN/proutil $DBENV/$DBNAME -C load $firstbd tenant $TENANT -dumplist $STAGEDIR/$i.list >> $WRKDIR/$i.load.log
#move the list and its content to finished folder
binlist=`cat $i`
for movethis in $binlist; do
    echo "Moving file $movethis to $STAGEDIR/finished"
    mv $movethis $STAGEDIR/finished/
done
echo "Finished working with list $i"
echo "Moving it to $STAGEDIR/finished"
mv $i $STAGEDIR/finished/
done

我得到的错误是......

./ tableload.sh:line 107:/ usr4 / dlc / bin / proutil / usr4 / testdbs / xxxx2 -C load /usr4/dumpdir/xxxxx.bd tenant xxxxx -dumplist /usr4/dumpdir/PUB.xxxxx。 list>> /usr4/dumpdir/PUB.xxxx.list.load.log:路径名中的文件或目录不存在...但是如果我运行" / usr4 / dlc / bin / proutil"

修复方法是删除">> $ WRKDIR / $ i.load.log" ..当尝试将结果输出到文件时,二进制实用程序不会运行..奇怪..

1 个答案:

答案 0 :(得分:1)

这里有一些非常不好的做法

  • 解析ls
  • 的输出
  • 不引用变量
  • 使用catfor
  • 迭代文件的行

作为住所评论,您不会检查您是否已在日志文件的路径中创建了所有目录。

重写:

for i in "$STAGEDIR"/*.list; do
    echo "Working with $i"
    # grab first .bd file
    firstbd=$(head -1 "$i")
    echo "First file is $firstbd"
    # ensure the output directory exists
    logfile="$WRKDIR/$i.load.log"
    mkdir -p "$(dirname "$logfile")"
    "$PROBIN"/proutil "$DBENV/$DBNAME" -C load "$firstbd" tenant "$TENANT" -dumplist "$STAGEDIR/$i.list" >> "$logfile"
    # move the list and its content to finished folder
    while IFS= read -r movethis; do  
        echo "Moving file $movethis to $STAGEDIR/finished"
        mv "$movethis" "$STAGEDIR"/finished/
    done < "$i"
    echo "Finished working with list $i"
    echo "Moving it to $STAGEDIR/finished"
    mv "$i" "$STAGEDIR"/finished/
done