【问题标题】:How to use an expression as loop counter in bash?如何在bash中使用表达式作为循环计数器?
【发布时间】:2012-07-06 07:36:06
【问题描述】:

我是 Linux 世界的新手,我使用 Bash shell 并进行了一些练习。 我怎样才能执行一个循环给作为计数器一个表达式? 例如遍历文件中的单词量。

for n in(wc -w text.txt)
 do
   echo "word number $n"
 done

不幸的是,上面的脚本不起作用。 到目前为止我发现的唯一方法是首先打印 wc -w text.txt 的值,然后将其分配给一个变量,然后循环:

wc -w text.txt
a=10   //result saw by wc -w text.txt
for((b=0; b<a; b++))
do
echo "$b"
done

问题是我需要检索 wc -c 的值并将其直接赋值给一个变量,以防我必须编写一个自动运行的脚本,问题是

a= wc -w test.txt

不会工作,

有什么建议吗?

【问题讨论】:

  • a=wc -w test.txt 应该用反引号或$() 工作,= 周围没有空格,即a=$(wc -w test.txt)
  • a=$(wc -c test.txt) 或 a=$`wc -c test.txt` 将分配给一个文本值:'6 test.txt',如果您尝试迭代这个值,你当然会得到一个错误(需要算术表达式)
  • 使用a=$(wc -w &lt; test.txt) 删除wc 输出中的文件名。

标签: bash loops


【解决方案1】:

一个干净的方法是

tmp=$(wc -w <text.txt)
for ((i=0; i<$tmp; i++))
do 
    echo $i; 
done

&lt;text.txt 部分是必需的,因为通常情况下,wc 命令的输出是

wordcount1  INPUTFILE1
wordcount2  INPUTFILE2
...

i 的最大值必须等于文件的字数,因此您必须在循环按预期工作之前删除INPUTFILE1 部分。使用输入流 &lt; 而不是文件名可以解决这个问题。

使用临时变量可防止在每次迭代时调用 wc

【讨论】:

  • (set -v; your code) 表明每次迭代都会调用 wc ;改用变量
  • 谢谢!将您的建议添加到答案中。
  • 在这种情况下美元符号是否用作表达式评估的指示符?
  • @JBoy 是的,$(...) 表示法与 bash 中的反引号作用相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多