我试图在如下所示的循环之外回显变量$f1
, , ... 。据我了解,变量的范围不正确。因此我尝试了一些解决方法,如图所示$f2
while
在 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