6

メモ帳を使用してWindowsで作成されたファイルがあります:

    26453215432460
    23543265235421

    38654365876325


    12354152435243

すべての行を読み取り、すべての行に対して他のファイルに以下のようなコマンドを作成し、空白行を考慮しないスクリプトがあります。

    CRE:EQU,264532154324600,432460,1;

ここで、 number の最後の行の後で Enter キーを押した後に入力ファイルを保存すると12354152435243、出力ファイルはすべての数字 (最後の12354152435243:を含む) に対応する上記のコマンドで構成されます。

    CRE:EQU,264532154324600,432460,1;
    CRE:EQU,235432652354210,235421,1;
    CRE:EQU,386543658763250,876325,1;
    CRE:EQU,123541524352430,435243,1;

しかし、ファイルを保存すると、最後の番号がキー入力された後にEnterキーを押さずに、つまり this12354152435243の後、スクリプトが実行された後、出力ファイルに最後の番号のコマンドが表示されません。

    CRE:EQU,264532154324600,432460,1;
    CRE:EQU,235432652354210,235421,1;
    CRE:EQU,386543658763250,876325,1;

誰かがコードのエラーを説明できますか:

    while read LINE
    do
    [ -z "$LINE" ] && continue
    IMEI=`echo $LINE | sed 's/ //g' | sed -e 's/[^ -~]//g'`
    END_SERIAL=`echo $IMEI | cut -c9- | sed 's/ //g' | sed -e 's/[^ -~]//g'`
    echo "CRE:EQU,${IMEI}0,${END_SERIAL},${list},,${TODAY};" >> /apps/ins/list.out
    done < "${FILE_NAME}"

親切に助けて

4

5 に答える 5

0

read は新しい行が見つかるまで読み取り、新しい行が見つかるとその行を返します。ただし、ファイルが改行なしで終了する場合、 read はこれをエラーとして扱います。そのため、今まで読んだ行で read が戻り変数を設定してもread、エラーを示すように のリターン コードが設定されます。while read ...このループ本体は、コマンドが成功して実行された場合にのみ実行されますが、ここではそうではありません。したがって、最後の行を見逃します。

これを克服するために、条件を変更して、返される変数が空かどうかも確認できます。したがって、変数はファイルの最後まで既に設定されているため、読み取りが失敗しても条件は成功します。

これは、別の OS での行末とは関係ありません。何らかの形で関連しているということですが、正確な根本原因は常に、read行/ファイルの最後で新しい行を見つけられず、最後の行にループ本体がありません。

以下は例です

[[bash_prompt$]]$ echo -ne 'hello\nthere' > log
[[bash_prompt$]]$ while read line; do  echo $line; done < log
hello
[[bash_prompt$]]$ while read line || [ -n "$line" ]; do  echo $line; done < log
hello
there
[[bash_prompt$]]$
于 2013-06-20T10:24:34.367 に答える
0

スクリプトがファイルの最後の行を読み取らないようにするには:

cat "somefile" | { cat ; echo ; } | while read line; do echo $line; done

ソース: 私のオープン ソース プロジェクトhttps://sourceforge.net/projects/command-output-to-html-table/

于 2021-09-27T00:21:21.197 に答える