Bash脚本variables作用域问题

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循环中,“match”variables被设置为1,但由于某种原因,一旦我离开while循环,它仍然认为它是声明中的初始零。

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

谢谢

Solutions Collecting From Web of "Bash脚本variables作用域问题"

这不起作用的原因实际上是UUOC 。 在bash中,管道的右侧是在一个子shell中运行的。 在子shell中设置的任何变量都不会在父shell中设置。 要解决此问题,请使用重定向而不是管道:

 username="hello" password="3333" function login { # 1 - Username # 2 - Password match=0 while read xy _; 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 

while read ...代码的一部分(从cat管道获取输入)运行在一个子shell中。 内部变量的变化在该子外部之外是不可见的。

要解决该问题,请将您的循环更改为:

 while read ... ; do ... done < LoginsMaintMenu.txt