在我的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
循环中提取值。
但上面的片段并不好,因为我没有输出。
有没有简单的方法来解决这个问题 - 在一个可以在脚本的其余部分访问的变量中从这个循环输出字符串 - 而无需重新格式化我的脚本?
答案 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"