将变量从子 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

相关内容