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)
但是,我似乎无法重现链接中所示的修复程序。有人可以提供有关如何解决此问题的应用示例吗?
在您的链接中,外部使用的变量(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)
归档时间: |
|
查看次数: |
5458 次 |
最近记录: |