username="hello"
password="3333"
function login {
# 1 - Username
# 2 - Password
match=0
cat LoginsMaintMenu.txt | while read line; do
x=`echo $line | awk '{print $1}'`
y=`echo $line | awk '{print $2}'`
if [ "${x}" == "${1}" ] && [ "${y}" == "${2}" ]; then
echo "match"
match=1
echo $match
break
fi
done
echo $match
return $match
}
echo $username $password
login ${username} ${password}
if [ $? -eq 0 ]; then
echo "FAIL"
else
echo "success"
fi
输出:
hello 3333
match
1
0
FAIL
问题: 我不明白为什么它会回应“失败”。 “匹配”变量在while循环中设置为1,但由于某种原因,一旦我离开while循环,它仍然认为它是声明中的初始零。
我尝试过做很多不同的事情,所以如果有人能给我一些具体的东西来尝试那就太好了!
由于
答案 0 :(得分:6)
这不起作用的原因实际上是UUOC。在bash中,管道的右侧在子shell内部运行。在子shell中设置的任何变量都不会在父shell中设置。要解决此问题,请使用重定向而不是管道:
username="hello"
password="3333"
function login {
# 1 - Username
# 2 - Password
match=0
while read x y _; do
if [ "${x}" == "${1}" ] && [ "${y}" == "${2}" ]; then
echo "match"
match=1
echo $match
break
fi
done < LoginsMaintMenu.txt
echo $match
return $match
}
echo $username $password
if login "${username}" "${password}"; then
echo "FAIL"
else
echo "success"
fi
答案 1 :(得分:2)
代码的while read ...
部分(从cat
管道获取其输入)在子shell中运行。内部变量的更改在子shell外部不可见。
要解决此问题,请将循环更改为:
while read ... ; do
...
done < LoginsMaintMenu.txt