Shell

Shell 腳本 - 將輸出重定向到文件,結果在第一次執行時不符合預期

  • October 9, 2015

我已經重定向了命令的輸出,該命令在文件中返回了一些時間 2 行、5 行.. 100 行等.. 我將在稍後的 if 條件下使用這個文件來檢查其他一些條件..

奇怪的是 - 我需要多次執行腳本才能按預期獲取數據..如果我第一次執行腳本它什麼都不返回..請你幫忙為什麼這在第一次執行時沒有給出預期的結果

該程式碼適用於 AIX,如下所示:

df -gt | grep /home/prods/db2/ > /tmp/DISKREQ.TMP
if [[ $? -eq 0 ]]; then
       chmod 777 /tmp/DISKREQ.TMP
       cat /tmp/DISKREQ.TMP | awk '{print$6}' | awk 'length($0) == 22' > /tmp/DISKREQ.TMP
       cat /tmp/DISKREQ.TMP | while read line
       do
                       FSIZE_DISKREQ=`df -g | awk '$7 == "'$line'" {print $3;}'`
                       if [[ $FSIZE_DISKREQ -lt 2 ]]; then
                       echo
                        echo " Instance Home Directory $line = $FSIZE_DISKREQ "
                       else
                       echo
                               echo " Instance Home Directory $line "
                       fi
       done
else
echo
       echo "No Instance Home directory Mounted"
fi
cat /tmp/DISKREQ.TMP | awk '{print$6}' | awk 'length($0) == 22' > /tmp/DISKREQ.TMP

管道的組件是並行執行的。因此,該行並行執行三個命令:

  • cat /tmp/DISKREQ.TMP
  • awk '{print$6}'
  • awk 'length($0) == 22' > /tmp/DISKREQ.TMP

第一個命令是開放/tmp/DISKREQ.TMP閱讀。第三個命令/tmp/DISKREQ.TMP在執行任何其他操作之前被截斷。根據時間的不同,cat可能有時間也可能沒有時間至少讀取文件的開頭。

解決方案:不要寫入與輸入相同的文件。(有更複雜和更脆弱的解決方案可以讓您重用名稱;我不會給出一個,因為在這裡做一些複雜的事情是沒有意義的。)

df -gt | grep /home/prods/db2/ > /tmp/DISKREQ.TMP
if [[ $? -eq 0 ]]; then
   cat /tmp/DISKREQ.TMP | awk '{print$6}' | awk 'length($0) == 22' > /tmp/DISKREQ2.TMP
   cat /tmp/DISKREQ2.TMP | while read line
   …

(不要使用chmod 777。這永遠不會解決任何問題,但會產生問題。)

不過,您不需要所有這些臨時文件,因此您可以通過擺脫它們來完全迴避問題。只需將 awk 鏈直接導入 while 循環即可擺脫第二個臨時文件。我還擺脫了無用的用法,cat並將這兩個awk腳本合二為一。

df -gt | grep /home/prods/db2/ > /tmp/DISKREQ.TMP
if [[ $? -eq 0 ]]; then
   </tmp/DISKREQ.TMP awk 'length($6) == 22 {print $6}' | while read line
   do
   …

您甚至可以完全擺脫awk並在while read循環中進行過濾;我將把它作為練習留給讀者。

要擺脫第一個臨時文件,需要稍微更改邏輯。grep如果沒有找到任何東西,while 循環體將不會執行,因為它會得到零行來處理,但在這種情況下您需要一些邏輯來顯示消息。END您可以在 awk中使用指令。

df -gt | grep /home/prods/db2/ |
awk 'length($6) == 22 {print $6}
    END {if (NR==0) print "No Instance Home directory Mounted"}' |
while read line; do …

您可以將grep呼叫與awk. (練習給讀者。)或者你可以在 shell 中進行整個過濾。我認為這/home/prods/db2/將永遠是第六列的開始。

found=0
df -gt |
while read device total used available percent mountpoint; do
   [[ $mountpoint == /home/prods/db2/* ]] || continue
   ((++found))
   [[ ${#mountpoint} -eq 22 ]] || continue
   …
done
if ((found == 0)); then echo "No Instance Home directory Mounted"; fi

引用自:https://unix.stackexchange.com/questions/234807