2015-06-16 34 views
1

我在一個目錄中有很多舊的日誌文件,每個月都會生成應用程序日誌到這個目錄。我想使用腳本來刪除最近一個月的舊日誌。在Bash腳本中使用間接變量引用

這是我的文件logsDir,這些文件是0KB,我有問題的理解產生

[[email protected] logDir]# ls -ltr 
total 136 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram9.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram8.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram7.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram6.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram69.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram68.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram67.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram66.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram5.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram59.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram58.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram57.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram56.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram4.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram49.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram48.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram47.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram46.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram3.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram39.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram38.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram37.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram36.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram2.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram29.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram28.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram27.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram26.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram1.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram19.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram18.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram17.logs 
-rw-r--r-- 1 root root 0 Mar 20 12:22 ram16.logs 

這是我logs.sh

#!/bin/bash 

Jan=Dec Feb=Jan Mar=Feb Apr=Mar May=Apr Jun=May Jul=Jun Aug=Jul Sep=Aug Oct=Sep Nov=Oct Dev=Nov 

DIR=/logDir 
cd $DIR 
if [ $DIR -eq $PWD ]; then 
PWD=$(pwd) 
cmd=$(date |awk '{print $2}') 
dat=$(ls -ltr |grep $cmd |awk '{print $9}') 
rm -rf $dat 
else 
echo " enterend in the wrong dir" 
fi 

,但它未能獲取變量值Apr=Mar

這是輸出,我想就像你正在尋找一個間接變量引用刪除Apr文件

[[email protected] /]# bash -x log.sh 
+ Jan=Dec 
+ Feb=Jan 
+ Mar=Feb 
+ Apr=Mar 
+ May=Apr 
+ Jun=May 
+ Jul=Jun 
+ Aug=Jul 
+ Sep=Aug 
+ Oct=Sep 
+ Nov=Oct 
+ Dev=Nov 
+ DIR=/logDir 
+ cd /logDir 
++ pwd 
+ PWD=/logDir 
+ '[' /logDir == /logDir ']' 
++ date 
++ awk '{print $2}' 
+ cmd=Apr 
++ ls -ltr 
++ grep '$Apr' 
++ awk '{print $9}' 
+ dat= 
+ rm -rf 
+0

不知道該目錄的內容,這是很難理解這裏發生了什麼。運行'ls -ltr |時會發生什麼? grep Mar'在目錄中?輸出是否顯示了一些文件,輸出是否有9列? – nwinkler

+0

更好地發佈http://www.shellcheck.net/中的代碼進行初始安全檢查。同樣,'Jan = Dec Feb = Jan Mar = Feb Apr = Mar May = Apr Jun = 5月Jul = Jun Aug = Jul Sep = Aug Oct = Sep Nov = Oct Dev =使用ls -ltr |運行的 – fedorqui

+0

grep Mar | awk'{print $ 9}',它僅給出所有行軍文件名,不包括文件類型,時間,日期等所有字段..我現在也添加文件 –

回答

1

看來。您的$cmd變量指向變量$Apr,並且您想要使用值$Apr

這裏是你如何能做到這一點(只相關線):

cmd=$(date | awk '{print $2}') 
eval month=\$$cmd 
dat=$(ls -ltr | grep $month | awk '{print $9}') 

eval命令解析由\$$cmd創造的間接引用。

更多細節在這裏:http://www.tldp.org/LDP/abs/html/ivr.html

+1

非常感謝你@ @ nwinkler ..它現在的工作 –

+0

不客氣! – nwinkler