我有一个函数,在函数内部是一个while循环。
当我尝试使用IF语句在while循环中设置非局部变量时,退出整个函数,突然变量不再被设置?
function EXAMPLE {
cat test.txt | while read LINE; do
if [ "$LINE" = "FAIL" ]; then
echo "Detected FAIL in file! Setting RETURN=fail and exiting function."
RETURN="fail"
return
fi
done
}
### START SCRIPT ###
EXAMPLE (Call example function)
echo "$RETURN"
出于某种原因,RETURN为空。我过去曾多次这样做过很多次。关于while循环的一些事情是阻止RETURN传递出函数。是“返回”导致脚本打破循环而不是函数吗?
由于
答案 0 :(得分:2)
最简单的解决方案是首先使用输入重定向而不是管道来避免子shell。
function EXAMPLE {
while IFS= read -r line; do
if [ "$line" = "FAIL" ]; then
echo "Detected FAIL in file! Setting RETURN=fail and exiting function."
RETURN="fail"
return
fi
done < test.txt
}
在管道不可避免的情况下,bash
4.2引入了lastpipe
选项,该选项在启用时允许管道中的最后一个命令在当前shell中运行,而不是子shell。这样,在管道完成后,将保留分配给RETURN
的值。
更好的是,使用标准机制发出错误信号。不要设置自定义参数的值,只需返回非零值:
function EXAMPLE {
while IFS= read -r line; do
if [ "$line" = "FAIL" ]; then
echo "Detected FAIL in file! Exiting function with status 1."
return 1
fi
done < test.txt
}
答案 1 :(得分:1)
在bash中使用管道时,管道中的所有命令都在子shell中执行。这意味着当子shell退出时变量无法生存。在这个美食中,很容易移除管道
function EXAMPLE {
while read LINE; do
if [ "$LINE" = "FAIL" ]; then
echo "Detected FAIL in file! Setting RETURN=fail and exiting function."
RETURN="fail"
return
fi
done < text.txt
}
我建议不经常使用ALL CAPS:有一天你会使用一个名为PATH的变量,然后必须找出命令停止工作的原因。