bash shell 脚本和脚本中的函数的可变范围



我对我的脚本有点困惑,关于函数、变量范围和可能的子壳。我在另一篇文章中看到管道生成了一个子外壳,而父 shell 无法访问子外壳中的变量。 在反引号中运行的 cmds 也是如此吗?

为了不让人们感到厌烦,我缩短了我的 100+ 行脚本,但我试图记住保留重要元素(即反引号、管道等)。 希望我没有遗漏任何东西。

global1=0
global2=0
start_read=true
function testfunc {
   global1=9999
   global2=1111
   echo "in testfunc"
   echo $global1
   echo $global2
}
file1=whocares
file2=whocares2
for line in `cat $file1`
do
   for i in `grep -P "w+ stream" $file2 | grep "$line"`   # possible but unlikely problem spot
   do
         end=$(echo $i | cut -d ' ' -f 1-4 | cut -d ',' -f 1)   # possible but unlikely spot
         duration=`testfunc $end`       # more likely problem spot
   done
done
echo "global1 = $global1"
echo "global2 = $global2"

因此,当我运行脚本时,最后一行显示 global1 = 0。 但是,在我的函数 testfunc 中,global1 设置为 9999,调试消息打印出至少在函数中为 9999。

这里有两个问题:

  1. 反引号是否生成了一个子外壳,从而使我的脚本不工作?
  2. 如何解决此问题?
你可以

尝试类似的东西

global1=0
global2=0
start_read=true
function testfunc {
   global1=9999
   global2=1111
   echo "in testfunc"
   echo $global1
   echo $global2
   duration=something
}
file1=whocares
file2=whocares2
for line in `cat $file1`
do
   for i in `grep -P "w+ stream" $file2 | grep "$line"`   # possible but unlikely problem spot
   do
         end=$(echo $i | cut -d ' ' -f 1-4 | cut -d ',' -f 1)   # possible but unlikely spot
         testfunc $end       # more likely problem spot
   done
done
echo "global1 = $global1"
echo "global2 = $global2"

Do the backticks spawn a subshell and thus making my script not work?

是的,它们确实如此,并且在子外壳中的变量中所做的任何更改在父外壳中都不可见。

How do I work around this issue?

你可以尝试这个循环来避免生成子壳:

while read line
do
   while read i
   do
      end=$(echo $i | cut -d ' ' -f 1-4 | cut -d ',' -f 1)
      duration=$(testfunc "$end")
   done < <(grep -P "w+ stream" "$file2" | grep "$line")
done < "$file1"

PS:但是testfunc仍然会在子进程中调用。

相关内容

  • 没有找到相关文章

最新更新