Bash

將變數從子shell列印到父shell

  • December 18, 2017

對 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

引用自:https://unix.stackexchange.com/questions/407789