我想循环遍历文本文件的行a.txt
。我知道如果文件有 6 行,我可以这样做:
for c in {1..6} ; do echo $c; done
打印:
1
2
3
4
5
6
我可以将行数计算为
wc -l a.txt | cut -f1 -d' '
这使2852
现在,当尝试将wc
计数替换为 for 循环时,如下所示,循环不起作用:
for c in {1..$(wc -l ~/a.txt| cut -f1 -d' ')} ; do echo $c; done
它不打印 1 到 2852 之间的数字,而是打印:
{1..2852}
如何修复上述循环中的子 shell 用法以获得正确的数字序列?
(
bash --version
是 (Debian):
GNU bash, version 5.1.4(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2020 Free Software Foundation, Inc.
)
答案1
巴什没有克什将变量放在括号中的功能,例如
var=$(wc -l ~/a.txt| cut -f1 -d' ')}
echo {0..$var}
您可以使用循环:
for ((i=0; i<var; i++)); do
echo "$i"
done
即使它有效,也应该避免这种情况:
eval echo {0..$var}
eval
是“邪恶”的常见拼写错误。
看http://mywiki.wooledge.org/BashFAQ/048
答案2
您实际上不需要知道文件中的行数来处理它,只需处理它,甚至不使用 shell 循环;和awk
:
awk '{ print "do something on line#", NR, $0 }' infile
在awk,内部变量NR
将返回氮数量右ecord(/Line)$0
是当前读取进行处理的该行的内容。