为什么这条印刷线10在第9行的输出之前打印?

时间:2017-09-12 20:33:29

标签: bash if-statement

我尝试了几件事,但我不理解为什么'第10行'在第9行'之前执行。

实际代码:

 df -PH | grep -vE '^Filesystem|tmpfs|cdrom|loop' | awk '{ print $5 " " $1 " " $6}' |  while read output;
  do
    proc=$(echo $output | awk '{ print $1}' | cut -d'%' -f1)
    partition=$(echo $output | awk '{ print $2 }' )
    mountp=$(echo $output | awk '{ print $3 }' )
    ohostn=$(checkOtherHostname)

    if [ $proc -ge $THRESHOLD_HD ]; then
      printf "%20s [%6s] [%20s] %4s%% \"%s\"\n" "$(hostname)" "$ohostn" "$mountp" "$proc" "$partition"
      sudo du -sh $mountp/*
    fi
  done

结果位于下面的OUTPUT中。

然后我通过在第一个if语句下放入第二个if语句并在其中移动sudo命令并且输出仍然相同来尝试不同的方式!

  df -PH | grep -vE '^Filesystem|tmpfs|cdrom|loop' | awk '{ print $5 " " $1 " " $6}' |  while read output;
  do
    proc=$(echo $output | awk '{ print $1}' | cut -d'%' -f1)
    partition=$(echo $output | awk '{ print $2 }' )
    mountp=$(echo $output | awk '{ print $3 }' )
    ohostn=$(checkOtherHostname)

    if [ $proc -ge $THRESHOLD_HD ]; then
      printf "%20s [%6s] [%20s] %4s%% \"%s\"\n" "$(hostname)" "$ohostn" "$mountp" "$proc" "$partition"
    fi

    if [ $proc -ge $THRESHOLD_HD ]; then
      sudo du -sh $mountp/*
    fi
  done

输出:

1.1T    /data/svn_repo_01/repos
16K /data/svn_repo_01/lost+found
2.7G    /data/svn_repo_01/csvn
4.0K    /data/svn_repo_01/migration
4.0K    /data/svn_repo_01/tmp
            vmappp21 [svntoy] [   /data/svn_repo_01]   70% "/dev/sde1"

1 个答案:

答案 0 :(得分:1)

简短回答:不应该发生。

我无法在我的环境中重现您的问题,但您没有向我们提供相关信息:

  • bash --version。例如。 GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
  • checkOtherHostname做什么?
  • 如果当前标准输出被重定向到更高级别(例如通过管道或使用exec >

关于效果

与您的问题无关,但我注意到您使用了以下命令:

  • df,grep(一次执行)
  • awk(4次:每次df行3次执行)
  • cut,echo,hostname和checkOtherHostname(每个df行执行一次)
  • printf,sudo,du(当proc> = THRESHOLD_HD时)

由于它是一个没有特殊性能需求的小脚本,这应该不是问题,但如果您打算在更大的脚本中使用相同的方法或处理许多记录。这可能是一个问题。

所以我使用最少量的命令制作了这个简化版本的脚本:

  • df,hostname和checkOtherHostname(一次)
  • printf,sudo,du(当proc> = THRESHOLD_HD时)
hostname="$(hostname)"
ohostn="$(checkOtherHostname)"
df -PH | while read partition size used avail proc mountp; do
    if ! [[ "$partition$mountp" =~ "Filesystem|tmpfs|cdrom|loop" ]] && [ ${proc%%%} -ge $THRESHOLD_HD ]; then
        printf "%20s [%6s] [%20s] %4s \"%s\"\n" "$hostname" "$ohostn" "$mountp" "$proc" "$partition"
        sudo du -sh $mountp/*
    fi
done