Unix - 当文件的wc不匹配时运行一个脚本

时间:2015-03-17 14:06:08

标签: unix ksh

如果文本文件的wc匹配或不匹配,我想用不同的参数运行脚本!

我的剧本:

#!/bin/sh
x= echo `wc -l "/scc/ftp/mrdr_rpt/yet_to_load.txt"`
if [ $x -gt 0 ]
then
sh /scc/ftp/mrdr_rpt/eam.ksh /scc/ftp/mrdr_rpt/vinu_mrdr_rpt.txt /scc/ftp/mrdr_rpt/yet_to_load.txt from@from.com to.name@to.com
elif
sh /scc/ftp/mrdr_rpt/eam.ksh /scc/ftp/mrdr_rpt/vinu_mrdr_rpt.txt /scc/ftp/mrdr_rpt/yet_to_load.txt from@from.com to.name@to.com, hi.name@hi.com
fi

1 个答案:

答案 0 :(得分:1)

您需要准确捕获wc的输出,并且需要避免在其输出中获取文件名。你有:

x= echo `wc -l "/scc/ftp/mrdr_rpt/yet_to_load.txt"`
if [ $x -gt 0 ]

=之后的空格是错误的。不需要echo。您应该使用wc的输入重定向。 (wc有点奇怪。如果你给它一个文件名来处理,它在输出中包含文件名;如果你有它处理标准输入,它不包括文件名在输出。)您应优先使用$(…)作为后引号。

x=$(wc -l < "/scc/ftp/mrdr_rpt/yet_to_load.txt")
if [ $x -gt 0 ]

如果要检查文件是否为空(而不是包含数据但没有换行的文件),则可以使用更直接的测试:

if [ -s "/scc/ftp/mrdr_rpt/yet_to_load.txt" ]

您可能应该使用诸如

之类的名称
DIR="/scc/ftp/mrdr_rpt"

然后引用它以减少代码中的丑陋重复:

if [ $x -gt 0 ]
then
    sh "$DIR/eam.ksh" "$DIR/vinu_mrdr_rpt.txt" "$DIR/yet_to_load.txt" \
        from@from.com to.name@to.com
else
    sh "$DIR/eam.ksh" "$DIR/vinu_mrdr_rpt.txt" "$DIR/yet_to_load.txt" \
        from@from.com to.name@to.com, hi.name@hi.com
fi

但是,我认为可能不需要第二行中的逗号,使用它可能更好:

who="from@from.com to.name@to.com"
if [ -s "$DIR/yet_to_load.txt" ]
then who="$who hi.name@hi.com"
fi

sh "$DIR/eam.ksh" "$DIR/vinu_mrdr_rpt.txt" "$DIR/yet_to_load.txt" $who

然后,您只有一行包含其中的所有名称。你可能会用数组而不是字符串做得更好:

who=("from@from.com" "to.name@to.com")
if [ -s "$DIR/yet_to_load.txt" ]
then who+=("$who hi.name@hi.com" "Firstname Lastname <someone@example.com>")
fi

sh "$DIR/eam.ksh" "$DIR/vinu_mrdr_rpt.txt" "$DIR/yet_to_load.txt" "${who[@]}"

使用数组意味着你可以正确地处理名称中的空格,而简单的字符串并不是这样。