對 Bash 非常陌生,對本地/全域變數/子 shell 感到困惑。我不確定為什麼修改後的變數不會在函數末尾打印出來 - 我試圖在文件末尾打印出最終行數和文件數,但如果我這樣做,它只會打印out 0 因為它們是局部變量。有沒有辦法列印出修改後的值?
count=0
files=0
find . -type f | while IFC= read -r file;
do
let files=files+1
wc -l $file
count=$(($count+$(wc -l < $file)))
echo "total lines $count ; total files $files"
done
echo $files $count
exit 0
答案1
是的。但這絕對是不直觀的。這將起作用,例如:
#!/bin/bash
count=0
files=0
while IFS= read -r file;
do
let files=files+1
wc -l $file
count=$(($count+$(wc -l < $file)))
echo "total lines $count ; total files $files"
done < <(find . -type f )
echo "$files $count"
exit 0
此<(command)
構造稱為“流程替代”並允許您將命令的輸出視為“檔案”。以這種方式將其輸入循環可以使您的腳本按您的預期工作。
問題是您使用管道 ( |
) ,這會導致 while 迴圈在單獨的子 shell 中運行,而該子 shell 無法修改其外部的變數。
在不支援該<()
功能的 shell 中,您可以在子銷售中的管道右側執行命令,並在該子 shell 中包含最終的 echo:
#!/bin/bash
files=0
find . -type f | {
while IFC= read -r file;
do
let files=files+1
wc -l $file
count=$(($count+$(wc -l < $file)))
echo "total lines $count ; total files $files"
done
echo "$files $count"
}
exit 0