1
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

问题:我不明白为什么它在呼应“失败”。“match”变量在while循环中被设置为1,但由于某种原因,一旦我退出while循环,它仍然认为它是其声明中的初始零。

我尝试过做很多不同的事情,所以如果有人能给我一些具体的尝试,那就太好了!

谢谢

4

2 回答 2

8

这不起作用的原因实际上是UUOC。在 bash 中,管道的右侧在子外壳内运行。在子 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
于 2013-03-13T16:17:45.103 回答
2

您的while read ...代码部分(从管道获取其输入cat)在子外壳中运行。对内部变量的更改在该子外壳之外不可见。

要解决此问题,请将循环更改为:

while read ... ; do
  ...
done < LoginsMaintMenu.txt
于 2013-03-13T16:17:16.167 回答