2014-02-17 79 views
1

我正在一個腳本刪除所有打印機的工作年齡超過一天,沒有工作年長超過一天必須是打印也已取消了作業ID如何在bash shell中使用導出?

下面是我必須遵循

幾個條件

我無法訪問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文件是不允許的。

任何建議獲得解決方案。

+0

有沒有執行命令,並得到awk命令循環 內導致像我將得到格式化的日期任何可能的方式並嘗試在awk循環內處理 – Learner

+0

不要使用'expr';使用Bash內置算法'$((...))'(和'((...))')。 –

回答

1

count的問題在於你在一個新的bash子進程中進行處理(當你將輸入傳入while時,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") 
+0

感謝您的回覆,此工作 – Learner

0

最簡單的解決方法是在您設置的同一個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解析它,讓閱讀通過適當地分配IFS來爲你做解析。停止使用反引號。 $()表示法更好。此代碼的最後一行[ $count -gt 0 ]; echo ...完全忽略了對$ count的評估。寫入[ $count -gt 0 ] || echo ... >&2test "$count" = 0 && echo ... >&2會更好(將錯誤消息重定向到文件描述符2,因爲錯誤屬於stderr)。

+0

感謝您的回覆。 上面給出的代碼也不起作用,即使有62個作業被取消,上述代碼仍然給出計數值0 – Learner

+0

您的日期比較非常可疑。你是否看到來自回聲的62條消息,但沒有看到計數增量?放下最後的'測試',並用「NUM」取代「NO」。 (我誤認爲NO意味着「NO」(一個非常常見的錯誤)並提供了錯誤的布爾值。 –

相關問題