在读取循环时使用变量

时间:2012-03-03 19:04:47

标签: bash variables

在我的bash脚本中,我使用while read循环和辅助函数fv()

fv() {
    case "$1" in
    out) echo $VAR
    ;;
    *  ) VAR="$VAR $1"
    ;; 
    esac
}

cat "$1" | while read line
    do
        ...some processings...
        fv some-str-value
    done

echo "`fv out`"

希望我可以在其余脚本中可访问的变量中从while read循环中提取值。 但上面的片段并不好,因为我没有输出。

有没有简单的方法来解决这个问题 - 在一个可以在脚本的其余部分访问的变量中从这个循环输出字符串 - 而无需重新格式化我的脚本?

3 个答案:

答案 0 :(得分:5)

由于没有人向您解释为什么您的代码不起作用,我会。

当您使用cat "$1" |时,您正在子shell中执行该循环。该子shell中使用的VAR变量从主脚本开始作为VAR的副本,对它的任何更改都仅限于该副本(子shell的范围),它们不会影响脚本的原始VAR。通过删除useless use of cat,您删除了管道,因此循环在主shell中执行,因此它可以(并且确实)更改VAR的正确副本。

答案 1 :(得分:4)

while read line ; do ... ; done < $1替换你的while循环:

#!/bin/bash

function fv
{
    case "$1" in
    out) echo $VAR
    ;;
    *  ) VAR="$VAR $1"
    ;; 
    esac
}

while read line
    do
        fv "$line\n"
    done < "$1"

echo "$(fv out)"

答案 2 :(得分:1)

停止阅读。

done < "$1"