在“while”循环之外保留读取语句的最后一个变量赋值

在“while”循环之外保留读取语句的最后一个变量赋值

我试图在如下所示的循环之外回显变量$f1, , ... 。据我了解,变量的范围不正确。因此我尝试了一些解决方法,如图所示$f2while在 Bash 常见问题解答中:

while IFS=: read -r f1 f2 f3 f4 f5 f6 f7; do
  echo "Username: $f1. Home directory:$f6"
done</etc/passwd

echo $f1

但是,我似乎无法重现链接中所示的修复。有人可以提供有关如何解决此问题的应用示例吗?

答案1

在您的链接中,外部使用的变量(linecount)未定义为“循环”变量。它只是在主体循环内修改(递增),但不在“while”语句中修改(增量)。

这是因为当调用“read -r f1 f2...”部分时,它重置(准备)使用的变量(f1 ..f7),等待输入行并根据输入分配变量。在文件末尾,它没有获取任何输入行(EOF 或 Pipe Error),返回 false,并退出循环。但它已经重置了变量。

set -x您可以通过在语句之前添加来启用“调试模式”来自行计算while

这将产生类似:

++ IFS=:
++ read -r f1 f2 f3 f4 f5 f6 f7
++ echo 'Username: bind. Home directory:/var/cache/bind'
Username: bind. Home directory:/var/cache/bind
++ IFS=:
++ read -r f1 f2 f3 f4 f5 f6 f7
++ echo

您可以看到最后一次读取被调用,然后是最后的“echo $f1”。

因此,正如您的链接中所述,在您之前创建另一个存储变量,为其分配值,然后您就可以使用它:

typeset f0=""
while IFS=: read -r f1 f2 f3 f4 f5 f6 f7; do
  echo "Username: $f1. Home directory:$f6"
  f0="$f1"
done</etc/passwd
echo $f0

相关内容