【问题标题】:How to use export in bash shell?如何在 bash shell 中使用导出?
【发布时间】:2014-02-17 14:36:30
【问题描述】:

我正在制作一个脚本来删除所有早于一天的打印机作业,并且不必打印早于一天的作业以及已取消的 jobid

以下是我必须遵循的几个条件

我无权访问 cups 目录,我无法创建任何临时文件。 我必须使用 Bash shell。

我尝试使用一个变量,在while循环外声明,但变量值保持不变~知道这是因为子进程 尝试使用导出变量,但在 Bash shell 中也不起作用,在 ksh shell 中也是如此。

我尝试过以下逻辑:

count=0
currDate=`date +%Y%m%d`
lpstat -o|while read line
do
  jobid=`echo $line|awk '{print $1}'|cut -d"-" -f2` 
  jobDate=`echo $line|awk -F ' ' 'BEGIN{OFS="-";} {print $5,$6,$7;}'`
  formattedDate=`date -d"${jobDate}" +%Y%m%d`

  if [ `expr $currDate - $formattedDate` -gt 1 ]
  then 
  count=`expr $count + 1`
      echo " cancelling printer job with jobid $jobid "
  cancel $jobid
  fi;
done
[ $count -gt 0 ] ; echo "NO of Printer jobs pending more than 1 days are $count";

没有像上面提到的那样处理计数变量的方法不起作用, 导出在 bash shell 中不起作用,不允许创建 tmp 文件。

获得解决方案的任何建议。

【问题讨论】:

  • 是否有任何可能的方法来执行命令并在 awk 命令循环中获取结果就像我将从行中获取格式化的日期并尝试在 awk 循环中进行处理
  • 不要使用expr;使用 Bash 内置算术 $((…))(和 ((…)))。

标签: bash unix loops scope


【解决方案1】:

count 的问题在于您在一个新的 bash 子进程中处理它(当您将输入输入到 while 时,bash 会自动创建它)。这就是你取回初始值的原因。

您的解决方案是在该子进程中输出值。这应该可以工作(大括号迫使 bash 创建一个包含输出部分的子进程):

count=0
currDate=`date +%Y%m%d`
lpstat -o| (while read line
do
  jobid=`echo $line|awk '{print $1}'|cut -d"-" -f2` 
  jobDate=`echo $line|awk -F ' ' 'BEGIN{OFS="-";} {print $5,$6,$7;}'`
  formattedDate=`date -d"${jobDate}" +%Y%m%d`

  if [ `expr $currDate - $formattedDate` -gt 1 ]
  then 
  count=`expr $count + 1`
      echo " cancelling printer job with jobid $jobid "
  cancel $jobid
  fi;
done
[ $count -gt 0 ] && echo "NO of Printer jobs pending more than 1 days are $count")

【讨论】:

    【解决方案2】:

    最简单的解决方案是在您设置它的同一个 shell 中引用该变量。从语法上讲,最简单的做法是添加一个块:

    count=0
    currDate=`date +%Y%m%d`
    lpstat -o| { while read line   # Add opening brace here
    do
      jobid=`echo $line|awk '{print $1}'|cut -d"-" -f2` 
      jobDate=`echo $line|awk -F ' ' 'BEGIN{OFS="-";} {print $5,$6,$7;}'`
      formattedDate=`date -d"${jobDate}" +%Y%m%d`
    
      if [ `expr $currDate - $formattedDate` -gt 1 ]
      then 
      count=`expr $count + 1`
          echo " cancelling printer job with jobid $jobid "
      cancel $jobid
      fi;
    done
    echo "Number of Printer jobs pending more than 1 day: $count"
    }    # Add closing brace here
    

    这不是一个代码审查网站,但我觉得有必要解决此代码的其他元素。 echo $line | awk '{print $1}' | cut -d"-" -f2 是一种暴行。与其读入一整行然后用 echo/awk/cut 解析它,不如让 read 通过适当地分配 IFS 为您进行解析。停止使用反引号。 $() 表示法更好。此代码的最后一行 [ $count -gt 0 ]; echo ... 完全忽略了 $count 的计算。最好写成[ $count -gt 0 ] || echo ... >&2test "$count" = 0 && echo ... >&2(将错误消息重定向到文件描述符2,因为错误属于stderr)。

    【讨论】:

    • 感谢回复.. 上面给出的代码也不起作用,即使有 62 个作业被取消,上面的代码仍然给出计数值 0
    • 您的日期比较非常可疑。您是否看到来自 echo 的 62 条消息但没有看到计数增量?删除最后的test,并将“NO”替换为“NUM”。 (我将 NO 误读为“NO”(一个非常常见的错误)并提供了错误的布尔值。
    猜你喜欢
    • 2023-03-17
    • 2011-06-09
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 2015-05-28
    • 2012-10-17
    • 1970-01-01
    相关资源
    最近更新 更多