BASH:在读取循环内设置变量

时间:2019-01-02 20:48:56

标签: bash while-loop

我在将命令的输出以bash的形式read循环中遇到了一个小问题,因此我一次只能处理一行的命令。循环的内容似乎正在执行其工作,但是退出循环时,不会设置我在循环内部设置的所有变量。我已将代码简化为以下内容:

#!/bin/bash       

set -x                  

printf '1\n2\n3\n' |               
while read -r line; do             
    if [[ $line == "1" ]]; then                                     
        var="read the line"                                         
    fi                                                              
done                                                                

echo "var=${var-NOTSET}" 

启用调试器后,将产生以下输出

+ printf '1\n2\n3\n'
+ read -r line
+ [[ 1 == \1 ]]
+ var='read the line'
+ read -r line
+ [[ 2 == \1 ]]
+ read -r line
+ [[ 3 == \1 ]]
+ read -r line
+ echo var=NOTSET
var=NOTSET

您可以看到var已在循环内设置,但不再在循环外设置。这是子问题吗?我到处都看过这种类型的读取循环,而且看来,如果您不能以这种方式设置变量,那么它就不是有用的设计模式。

以下代码确实按照我期望的方式工作,但是当然,它创建了一个我不想创建的无用的临时文件。

#!/bin/bash       
set -x                  

TMPFILE="/tmp/abcdef"

printf '1\n2\n3\n' > $TMPFILE                                       
while read -r line; do                                              
    if [[ $line == "1" ]]; then                                     
        var="read the line"                                         
    fi                                                              
done < "$TMPFILE"                                                   

echo "var=${var-NOTSET}"

0 个答案:

没有答案