循环外未定义的变量[重复]

Posted

技术标签:

【中文标题】循环外未定义的变量[重复]【英文标题】:Variable undefined outside of the loop [duplicate] 【发布时间】:2012-07-22 00:23:46 【问题描述】:

我在使用 Bash 脚本时遇到了一个奇怪的问题。变量NumTMPara在内循环内有正确的值,但在循环外,值为0?

这是我的脚本:

echo "packet.txt"
cat $SRDB_dir/tpcf.dat | sed -e 's/[\t]/;/g' \
| while read my_line
  do
    PID_SPID=$(echo $my_line | cut -f1 -d';')
    TPCF_NAME=$(echo $my_line | cut -f2 -d';')
    NumTMPara=0
    cat $SRDB_dir/plf.dat | sed -e 's/[\t]/;/g' | grep ";$PID_SPID;" \
    | while read my_line2
      do
        PCF_NAME=$(echo $my_line2 | cut -f1 -d';')
        Param_ID=$(cat $destination/tmparam.txt | sed -e 's/[\t]/;/g' | grep ";$PCF_NAME," | cut -f1 -d ';')
        OFFBYTE=$(echo $my_line2 | cut -f3 -d';')
        OFFBIT=$(echo $my_line2 | cut -f4 -d';')

        Myptc=$(grep $PCF_NAME $SRDB_dir/pcf.dat | sed -e 's/[\t]/;/g' | cut -f5 -d';')
        Mypfc=$(grep $PCF_NAME $SRDB_dir/pcf.dat | sed -e 's/[\t]/;/g' | cut -f6 -d';')
        WIDTH=$(get_width $Myptc $Mypfc)

        PCF_RELATED=""
        PCF_DESCR=$(grep "^$PCF_NAME" $SRDB_dir/pcf.dat | sed -e 's/[\t]/;/g' | cut -f2 -d ';')
        let NumTMPara=1+$NumTMPara

        #here, the value is correctly reported
        echo -e "\t$PCF_NAME\t$Param_ID\t$OFFBYTE\t$OFFBIT\t$WIDTH\t$PCF_RELATED\t$PCF_DESCR \t$NumTMPara"
        packetligne="\t$PCF_NAME\t$Param_ID\t$OFFBYTE\t$OFFBIT\t$WIDTH\t$PCF_RELATED\t$PCF_DESCR"
      done

    #Why does NumTMPara = 0 ??
    echo -e "$PID_SPID\t$TPCF_NAME\t$NumTMPara"
  done

一切都很好......

NCGT0030 14189 16 0 16  TC Packet ID  1
NCGT0040 14190 18 0 16  TC Packet Seq Control  2
NCGT0020 14188 20 0 16  Generic Failure ID  3
NCGB00B4 14074 22 0 32  Data Field Header  4

到此为止:

10512 YCSR271B 0

为什么是 0?

【问题讨论】:

您不需要用分号替换制表符:cut -d$'\t' -f2 将直接在制表符上工作。 @chepner:无论如何,制表符都是默认分隔符,所以cut -f2 就足够了。 我总是忘记cut;我经常使用awk 【参考方案1】:

问题在于,在管道 (command1 | command2 | command3) 中,每个命令都在单独的子 shell 中运行。这意味着来自主 shell 的任何变量都被复制到每个命令的执行环境中,但命令所做的任何更改都不会复制回主 shell 的执行环境中。

您有几个选择,但主要有两个:

您可以重新构建脚本,以便在管道内分配变量。 例如,您可以写成while ... do ... done < <(command1 | command2),而不是command1 | command2 | while ... do ... done。这仍将在子 shell 中运行 command1command2,但 while-loop 将根据需要在主 shell 中运行。 您可以将变量保存到一个临时文件中,以便在管道完成后读取。

【讨论】:

它有效!谢谢 !你知道我在哪里可以获得有关此语法的信息吗? @user1546581:<(command) 表示法称为 进程替换,并记录在 §3.5.6 "Process Substitution" of the Bash Reference Manual 中。但是,我从未见过有关您可以编写 < <(command) 以从标准输入中获取替代进程的输出的文档。我只知道它,因为我看到有人在 *** 上的评论中提到过一次。

以上是关于循环外未定义的变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

pylint:使用可能未定义的循环变量'n'

循环遍历 JSON 数组会给出“未定义”的结果 [重复]

变量是不是未定义[重复]

变量是不是未定义[重复]

循环时多个未定义变量的问题

如何确定变量是不是未定义[重复]