【问题标题】:assign a value to a variable in a loop在循环中为变量赋值
【发布时间】:2013-08-16 14:23:27
【问题描述】:

这里有2段代码,$1中的值是包含3行文本的文件名。

现在,我有一个问题。在第一段代码中,我无法从循环中得到“正确”的值,但在第二段代码中,我可以得到正确的结果。我不知道为什么。

如何让第一段代码得到正确的结果?

#!/bin/bash

count=0
cat "$1" | while read line
do
    count=$[ $count + 1 ]
done
echo "$count line(s) in all."

#-----------------------------------------

count2=0
for var in a b c
do
    count2=$[ $count2 + 1 ]
done
echo "$count2 line(s) in all."

【问题讨论】:

  • 有什么理由不能只使用count=$(wc -l $1)
  • 我是初学者。我只是想练习使用 bash。 @保罗埃文斯

标签: bash loops pipe


【解决方案1】:

这是因为 while 循环之前的管道。它创建了一个子shell,因此变量中的更改不会传递给主脚本。要克服这个问题,请改用process substitution

while read -r line
do
    # do some stuff
done < <( some commad)

在4.2或更高版本中,还可以设置lastpipe选项,最后一个命令 在管道中将在当前 shell 中运行,而不是在子 shell 中。

shopt -s lastpipe
some command | while read -r line; do
  # do some stuff
done

在这种情况下,由于您只是使用文件的内容,因此可以使用输入重定向:

while read -r line
do
    # do some stuff
done < "$file"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    相关资源
    最近更新 更多