assign a value to a variable in a loop

偶尔善良 提交于 2019-12-29 08:27:18

问题


There are 2 pieces of code here, and the value in $1 is the name of a file which contains 3 lines of text.

Now, I have a problem. In the first piece of the code, I can't get the "right" value out of the loop, but in the second piece of the code, I can get the right result. I don't know why.

How can I make the first piece of the code get the right result?

#!/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."

回答1:


This happens because of the pipe before the while loop. It creates a sub-shell, and thus the changes in the variables are not passed to the main script. To overcome this, use process substitution instead:

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

In version 4.2 or later, you can also set the lastpipe option, and the last command in the pipeline will run in the current shell, not a subshell.

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

In this case, since you are just using the contents of the file, you can use input redirection:

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


来源:https://stackoverflow.com/questions/18275596/assign-a-value-to-a-variable-in-a-loop

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!