Bash
將變數從子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
是的。但這絕對是不直覺的。這將起作用,例如:
#!/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 中,您可以在 subsell 中執行管道右側的命令,並在該子 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