將變數從子 shell 列印到父 shell

將變數從子 shell 列印到父 shell

對 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

相關內容