2016-08-19 59 views
0

我想捕獲hadoop文件的大小,然後基於它的值,我想要執行我的處理。我寫了一些unix腳本,但沒有按預期工作。在bash中使用數組時未正確替換變量

#!/bin/sh 
VAR=$(hadoop fs -ls /user/smike/del | sed 1d | awk '{ print $NF }' | paste -sd, | sed 's/,/ /g') 
FVAR=$VAR 
array1=($FVAR) 
a="" 
b="" 
for i in "${array1[@]}" 
do 
echo "$i" 
#var1=$(hadoop fs -dus /user/smike/del/$i|awk '{ print $(NF-1) }') 
var1=$(hadoop fs -ls /user/smike/del/$i|awk '{ print $(NF-3) }') 

echo "Size of the file is $var1" 
if [ $var1 -gt 0]; then 
a="$a $i" 
else 
b="$b $i" 
fi 
done 
echo "$a" 
echo "$b" 

當我看到我的nohup的文件,以下行的取代是 VAR1 = $(hadoop的FS -ls /用戶/司麥克/ DEL/$ I | AWK「{打印$(NF-3)} ')

+ echo /user/smike/del/2 
/user/smike/del/2 
+ awk '{ print $(NF-3) }' + hadoop fs -ls /user/smike/del//user/smike/del/2 
16/08/18 20:16:28 INFO hdfs.PeerCache: SocketCache disabled. 
ls: `/user/smike/del//user/smike/del/2': No such file or directory 

我不知道它爲什麼以這種方式代替。任何幫助表示讚賞。謝謝

+2

是'#!/ bin/sh'故意嗎?如果你想要一個'bash'腳本''[$ var1 -gt 0]'缺少一個空格,應該是'[$ var1 -gt 0]'' – Sundeep

+0

VAR'使用'#!/ bin/bash' VAR '(特別是)'FVAR'是多餘的;除了'array1 = $(hadoop ...)'會做什麼以外,他們什麼都不做。 – chepner

+0

'hadoop fs -ls/user/smike/del'的輸出是什麼樣的? – chepner

回答

1

替換看起來不錯; i只是一個完整的路徑名稱,似乎沒有必要用/user/smike/del作爲它的前綴。

var1=$(hadoop fs -ls "$i" |awk '{ print $(NF-3) }') 
+0

謝謝Chepner。其實iam傳遞/ user/smike/del作爲另一個文件的參數。我需要它在那裏 – sandeep007

+0

你可能需要它來設置'VAR'的初始調用,但不是在那之後。您已經獲得完整的文件名稱;在基本目錄前面加上前綴只是創建一個不存在的路徑名稱。 – chepner