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では、パイプラインの右側がサブシェル内で実行されます。サブシェル内で設定された変数は、親シェルでは設定されません。これを修正するには、パイプラインの代わりにリダイレクトを使用します。

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 に答える