2016-06-29 59 views
0

我在寫一個bash腳本,它使用while循環來處理從特定命令輸出的行。我還爲找到的每一行增加一個變量(加1)。變量在bash中遞增,while循環結束時重置爲0

下面有腳本的有問題的部分的一個示例:

#!/bin/bash 

count=0 

ls | while read f 
do 
    count=$(($count+1)) 
    echo "Count is at ${count}" 
done 

echo "Found total of ${count} rows" 

基本上,它遞增$count可變得很好,但然後當我while循環..其復位爲0後打印$count。 。

輸出示例:

Count is at 1 
Count is at 2 
Count is at 3 
Count is at 4 
Count is at 5 
Found total of 0 rows 

任何想法,爲什麼環完成後$count會復位?

我也嘗試添加使用&&操作上循環的最後echo語句,就像這樣:

count=0 

ls | while read f 
do 
    count=$(($count+1)) 
    echo "Count is at ${count}" 
done && echo "Found total of ${count} rows" 

沒有成功。

任何幫助,將不勝感激

+0

在任何情況下都不要分析'ls'的輸出;使用'in f in *;而不是。 – chepner

回答

2

的管道產生一個subshell,使用process substitutions代替:

while read -r f 
do 
    count=$(($count+1)) 
    echo "Count is at ${count}" 
done < <(ls) 

另外請注意,你不應該parse the output of ls

和你的例子似乎計數的文件和目錄在當前目錄下,可以用查找和WC來完成的數字:

find -maxdepth 1 -mindepth 1 -printf "\n" | wc -l 

或可避免ls用一個for循環和通配符:

for f in * .*; do 
    [ -e "$f" ] || continue 
    count=$((count + 1)) 
    echo "Count is at ${count}" 
done 
+0

請注意,您的兩個替代方案都包含隱藏文件,'ls'解析版本不包含這些文件。 –

+0

你的第一個使用'<()的代碼片段效果很好!謝謝。你能告訴我爲什麼我必須這樣做嗎?只是管道它不會工作? – Justin

+0

@Justin閱讀答案中的第一個鏈接頁面:-) – andlrc