我不明白为什么userType没有改变。
我肯定知道它已成功达到 determineType,但是当我稍后尝试打印出 userType 时,它不会将值更改为"bbb"。
userType="aaa"
function determineType {
userType="bbb"
}
function checkUser {
cat users.csv |
while read userLine; do
if [[ $userLine =~ .*$user.* ]]
then
determineType
echo "1"
fi
done
echo "0"
}
正如soulseekah在评论中所说,你的while
循环是在子shell中执行的。相反,这样做(并且,作为一个好处,你可以摆脱对猫的无用使用):
userType="aaa"
determineType() {
userType="bbb"
}
checkUser() {
while read userLine; do
if [[ $userLine = *$user* ]]; then
determineType
return 1
fi
done < users.csv
return 0
}
注意。我还更改了一些内容:
- 摆脱了无用的正则表达式,因为可以通过通配实现相同的效果,
- 使用更常见的方法来定义 bash 中的函数,
- 用于
return
而不是echo
返回值:你会再次遇到同样的问题,echo
:你可能会在另一个子shell中使用你的函数checkUser来获取echo
返回的值。
您正在使用一个管道,它在子外壳中启动 while .. do。更改子外壳中变量的值不会影响原始变量
您应该替换:
function checkUser {
cat users.csv |
while read userLine; do
if [[ $userLine =~ .*$user.* ]]
then
determineType
echo "1"
fi
done
echo "0"
}
跟
function checkUser {
while read userLine; do
if [[ $userLine =~ .*$user.* ]]
then
determineType
echo "1"
fi
done < users.csv
echo "0"
}
(这也摆脱了猫的无用使用)