![将变量从子 shell 打印到父 shell](https://linux22.com/image/122714/%E5%B0%86%E5%8F%98%E9%87%8F%E4%BB%8E%E5%AD%90%20shell%20%E6%89%93%E5%8D%B0%E5%88%B0%E7%88%B6%20shell%20.png)
对 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