1

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?

4

1 に答える 1

3

問題は、パイプライン(command1 | command2 | command3)では、各コマンドが個別のサブシェルで実行されることです。つまり、メインシェルの変数は各コマンドの実行環境にコピーされますが、コマンドが行った変更はメインシェルの実行環境にコピーされません。

いくつかのオプションがありますが、主に2つのオプションがあります。

  • 変数がパイプライン内で割り当てられ ないように、スクリプトを再構築できます。
    • たとえば、の代わりにcommand1 | command2 | while ... do ... done、と書くことができますwhile ... do ... done < <(command1 | command2)。これは引き続き実行command1command2れ、サブシェル内で実行されますが、必要に応じて、while-loopはメインシェルで実行されます。
  • パイプラインの完了後に読み取ることができる一時ファイルに変数を保存できます。
于 2012-07-23T18:20:55.707 に答える