2012-03-19 30 views
1

我正在Solaris 10 SPARC计算机上开发脚本以计算在修补程序交付过程中成功安装的修补程序数量。我想向用户显示:Shell脚本的动态修补程序计数器

(X)的33个补丁成功安装

,我想我的脚本输出动态替换“X”,让用户知道有活动发生;有点像柜台。我能够显示计数,但只能在一条新线上。如何在脚本执行检查时动态更新括号?不要担心“通过/失败”......我主要关注在括号中更新输出。

for x in `cat ${PATCHLIST}` 
do 
    if (showrev -p $x | grep $x > /dev/null 2>&1); then 
     touch /tmp/patchcheck/* | echo "pass" >> /tmp/patchcheck/$x 
     wc /tmp/patchcheck/* | tail -1 | awk '{print $1}' 
    else 
     touch /tmp/patchcheck/* | echo "fail" >> /tmp/patchcheck/$x 
     wc /tmp/patchcheck/* | tail -1 | awk '{print $1}' 
    fi 
done 

回答

1

这里是我得到了我的补丁安装脚本工作,我想要的方式:

while read pkgline 
do 
    patchadd -d ${pkgline} >> /var/log/patch_install.log 2>&1 
    # Create audit file for progress indicator 
    for x in ${pkgline} 
    do 
     if (showrev -p ${x} | grep -i ${x} > /dev/null 2>&1); then 
      echo "${x}" >> /tmp/pass 
     else 
      echo "${x}" >> /tmp/fail 
     fi 
    done 
    # Progress indicator 
    for y in `wc -l /tmp/pass | awk '{print $1}'` 
    do 
     printf "\r${y} out of `wc -l /patchdir/master | awk '{print $1}'` packages installed for `hostname`. Last patch installed: (${pkgline})" 
    done 
done < /patchdir/master 
2

通常的方式做到这一点是发射在某一时刻一个\r回车(CR)和省略在该行的末尾的换行符\n或换行(LF)。由于您使用的awk,你可以尝试:

awk '{printf "\r%s", $1} END {print ""}' 

对于大多数行,它输出一个回车和外地1中的数据(不包括在最后一个换行符)。在输入结束时,它会打印一个空字符串,后跟一个换行符。其他

一种可能性是,你应该把awk脚本您for外循环:

for x in `cat ${PATCHLIST}` 
do 
    if (showrev -p $x | grep $x > /dev/null 2>&1); then 
     touch /tmp/patchcheck/* | echo "pass" >> /tmp/patchcheck/$x 
     wc /tmp/patchcheck/* | tail -1 
    else 
     touch /tmp/patchcheck/* | echo "fail" >> /tmp/patchcheck/$x 
     wc /tmp/patchcheck/* | tail -1 
    fi 
done | awk '{ printf "\r%s", $1} END { print "" }' 

我不知道,但我认为你可以将类似的精简的重复代码的其余部分脚本:

for x in `cat ${PATCHLIST}` 
do 
    if showrev -p $x | grep -s $x 
    then echo "pass" 
    else echo "fail" 
    fi >> /tmp/patchcheck/$x 
    wc /tmp/patchcheck/* | tail -1 
done | awk '{ printf "\r%s", $1} END { print "" }' 

这消除了touch(这似乎并没有做太多),特别是不能当的touch空输出通过管道输送到echo其中IG优于其标准输入。它消除了if行中的子shell;它使用grep-s选项来保持安静。

我对wc这条线还是有点怀疑。我认为你需要统计文件的数量,因为每个文件都应该包含一行(通过或失败),除非您在${PATCHLIST}标识的文件中列出了一些补丁两次。在这种情况下,我可能会使用:

for x in `cat ${PATCHLIST}` 
do 
    if showrev -p $x | grep -s $x 
    then echo "pass" 
    else echo "fail" 
    fi >> /tmp/patchcheck/$x 
    ls /tmp/patchcheck | wc -l 
done | awk '{ printf "\r%s", $1} END { print "" }' 

这将列出在/ tmp/patchcheck的文件和统计线输出的数量。这意味着您可以简单地在awk脚本中打印$0,因为$0$1是相同的。在效率方面很重要(不是很多),这是更高效的,因为ls只扫描一个目录,而不是让wc打开每个文件。但它更特别是对你正在尝试做什么的更准确的描述。如果你以后要算通行证,您可以使用:

for x in `cat ${PATCHLIST}` 
do 
    if showrev -p $x | grep -s $x 
    then echo "pass" 
    else echo "fail" 
    fi >> /tmp/patchcheck/$x 
    grep '^pass$' /tmp/patchcheck/* | wc -l 
done | awk '{ printf "\r%s", $1} END { print "" }' 

当然,这要追溯到读取每个文件,但你现在出了它越来越完善的信息(这就是为点球更精致的信息)。

+0

谢谢乔纳森,这是非常有帮助的!欣赏优秀的反馈。 – Christopher 2012-03-20 02:29:14

相关问题