2014-04-25 175 views
2
nOption=' | awk '{total+=$1} END {print total/1024"kb"}' ' 
find . -type f -printf "%s %p/n"| sort -nr | head -n10 $nOption 

我想創建一個腳本來查找當前目錄下最大的文件。 這是我的劇本,如果我使用變量來代替有過錯誤....unix shell腳本變量聲明 - 找不到命令

輸出: ./big.sh:第67行:+ =:找不到命令

但如果我不使用變量的運行方式:

find . -type f -printf "%s %p/n"| sort -nr | head -n10 | awk '{total+=$1} END {print total/1024"kb"}' 

輸出是我應該想: 680.021kb

有什麼不對我的腳本?

謝謝

+0

閱讀[我試圖把一個命令放在一個變量中,但複雜的情況總是失敗!](http://mywiki.wooledge.org/BashFAQ/050)。 – chepner

回答

4

Single quoted strings不能包含其他單引號,因此awk命令被解釋爲shell命令。 Putting commands in variables是棘手的,一般更容易,更安全,更具可讀性創建一個函數:

nOption() { 
    awk '{total+=$1} END {print total/1024"kb"}' 
} 
find . -type f -printf "%s %p/n"| sort -nr | head -n10 | nOption 

對於這個特定的情況下,作爲@chepner指出,問題是,你無法把命令分隔如|包含在一個字符串中,然後將其作爲管道的一部分執行(不包括eval, which is evil)。

+0

正確的答案,但即使正確引用引用,真正的問題是您無法將shell語法放入像OP試過的參數。 ''noption =「| awk'...'」'(在awk腳本本身中正確地引用和轉義)仍然會失敗,因爲'|'將被視爲文字字符,因此只是' head'。 – chepner

0

問題是與引號內報價,變量擴展...
爲什麼不一行代碼去?這是一個(微型)更快一點,更時尚...... :-)

find . -type f -printf "%s %p/n"| sort -nr | head -n10 | awk '{total+=$1} END {print total/1024"kb"}' 

更新
爲了使劇本更加靈活,你可以這樣做:

dir="." 
units="1024" 
unitsstring="kb" 
find "$dir" -type f -printf "%s %p/n"| sort -nr | head -n10 | awk '{total+=$1} END {print total/$units"$unitsstring"}' 
+0

謝謝。這是因爲這是我的腳本的一部分,我想在某些情況下更改nOption。 – YOHO

+0

我明白了。但我認爲不可能在變量($ nOption)內擴展一個變量($ 1)。靈活性無法將命令放入變量中,通常情況下...您應該選擇命令的哪個部分(例如?「string」,例如?)可能會在將來更改,並將*這些*放在變量中。請參閱我的更新答案以查看示例...另請參閱l0b0的答案,這是一種不同的方法... – MarcoS