2015-12-19 237 views
-4

有人可以爲我解釋這是什麼循環?解釋shell腳本代碼「for循環」

for file in `ls *SC*`; do 
    for content in `cat $file `; do 
    scid=`echo $file|awk -F'.' '{print $1}'` 
    printf "%-10s%s\n" $scid $content 
    done 
done > text1 
+0

嘗試在http://superuser.com上做這個問題,你可以在每行的beggning處使用4個空格來使其格式像'code',參見[help page](http://stackoverflow.com /編輯的幫助#註釋的格式)。 –

+0

您可以試試[eplainshell](http://explainshell.com/explain?cmd=for+file+in+%60ls+*SC*%60%3B+do++++for+content+in+%60cat+%24file+% 60%3B +做+++++ SCID%3D%60echo +%24file%7Cawk + ​​-F%27%27 +%27%7Bprint +%241%7D%27%60%3B +++++的printf +%22% 25-10s%25s%5Cn%22 +%24scid +%24content%3B +++ done%3B + done +%3E + text1) –

+1

使用'$(...)'代替命令周圍的反引號;找到正確的東西比較容易,尤其是如果你想要嵌套這個符號的話。 –

回答

1

在這個循環中寫入的shell代碼是錯誤的(性能,奇怪文件名後的錯誤)。
外環:

for file in `ls *SC*`; do 
done > text1 

試圖找到與SC的所有文件名,用它做什麼,以及輸出寫入文本1。更好的是:for file in *SC*; do

內環:

for content in `cat $file `; do 
    done 

做一些與文件中的每一個字。

scid=`echo $file|awk -F'.' '{print $1}'` 

此行屬於內部循環之外。它從第一個點中刪除了一些東西(刪除文件名中的擴展名爲1個點)。您可以使用cut或更快的${file%.*}

printf "%-10s%s\n" $scid $content 

打印截止文件名(最少10個位置:追加空格),第一個字,當SCID或內容包含特殊字符(最好printf "%-10s%s\n" "$scid" "$content")都可能會失敗。

+0

更好的是'awk'f!= FILENAME {f = FILENAME; split(FILENAME,x,「[。]」); } {printf「%-10s%s \ n」,x [1],$ 0}'* SC *' – tripleee

+0

@tripleee:我只試圖解釋循環,我仍然不明白需要什麼。每個輸出行(應以文件基名開頭)應該有一個單詞還是一行輸入文件?是的,awk永遠是值得了解的。 –