循环外未定义的变量[重复]
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 中运行 command1
和 command2
,但 while
-loop 将根据需要在主 shell 中运行。
您可以将变量保存到一个临时文件中,以便在管道完成后读取。
【讨论】:
它有效!谢谢 !你知道我在哪里可以获得有关此语法的信息吗? @user1546581:<(command)
表示法称为 进程替换,并记录在 §3.5.6 "Process Substitution" of the Bash Reference Manual 中。但是,我从未见过有关您可以编写 < <(command)
以从标准输入中获取替代进程的输出的文档。我只知道它,因为我看到有人在 *** 上的评论中提到过一次。以上是关于循环外未定义的变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章