while 循环之外的变量

Use*_*ser 5 shell shell-script

我试图在下面显示的 while 循环之外回显变量$f1, $f2, etcetera。据我了解,变量的范围不正确。因此,我尝试了一些解决方法,如下所示:http : //mywiki.wooledge.org/BashFAQ/024

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

echo $f1
Run Code Online (Sandbox Code Playgroud)

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

Adr*_* M. 4

在您的链接中,外部使用的变量(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
Run Code Online (Sandbox Code Playgroud)

您可以看到最后一次读取被调用,然后是最后的“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
Run Code Online (Sandbox Code Playgroud)