0

シェルスクリプトで変数を使用してIFS一部のデータを解析しています(データはすでに特定の形式で提供されています)。デフォルトのIFSはwhitespace/tab / etcで'¬'あるため、入力ファイル行のフィールドを区切るために文字を使用しています。データは次のようなものです

14352345¬AFSFDG1234¬text¬(http://www.google.com,3)(http://www.test.com,2)¬(www.test2.com,4)¬123-23432

以下を使用して、IFS変数を使用してファイルをwhileループにパイプするスクリプトを作成しました。

#!/bin/bash;
while IFS=¬ read -r sessionId qId testResults realResults queryId;
do echo $sessionId; done < inputFile

(このループ内で、実際に別のファイルを使用してawk処理を実行します)。

このファイルを手動で(./fileだけで)実行すると、完全に機能します。スクリプト(cron)の一部として、または別のスクリプト内で実行すると、IFS変数が使用されていないことを示す解析エラーが発生します。¬古いIFS変数をコピーして、解析後にリセットしたり、IFS変数を渡すさまざまな方法( 、、、など)を試しましたが'¬'$'¬'役に立たないようです。

任意のポインタ/ヒントをいただければ幸いです。


更新:いくつかの追加のデバッグの後、問題はセパレータではなくawkステートメントにあることが判明しました

4

1 に答える 1

5

Unicode に問題があるか、使用しようとしているシェルに問題があり、前者の可能性が高いです。

セパレータとして選択した文字 ( ¬) は ASCII セットの外にあり、(一般に) コンピュータによって 2 つの異なる方法で表現できます。 ' UTF-8 としてエンコードされ、2 オクテットを使用します。他にも可能性はありますが、これらの2つが最も可能性が高いので、我慢してください。

スクリプトを UTF-8 としてエンコードして保存し、それを非 Unicode ロケールで実行しようとすると、シェルは 1 つではなく 2 つの (間違った) 文字を区切り文字として取得します。~これをテストするには、たとえば、ASCII 文字をセパレータとして使用してみてください。

使用が機能することがわかった場合~は、システムのグローバル構成を調べて、スクリプトの作成に使用した環境でロケールが同じであることを確認する必要があります。スクリプトが実行されます。これは、コマンドを実行して行うことができますlocale。このコマンドを実行し、その出力をファイルに保存するスクリプトを作成できます。

#!/bin/sh
locale > /tmp/locale-env

次に、たとえば cron から実行し、/tmp/locale-envファイルを調べます。locale対話型シェルから実行したときの出力とその内容を比較します。/etc/environmentディストリビューションによっては、グローバル ロケールを、/etc/profileまたはその他の場所に設定できる場合があります。システム全体を UTF-8 にしたいかもしれません:

LANG=en_US.UTF-8
export LANG

ASCII と UTF-8 は英語の文字とまったく同じであり、これらの問題はほとんどの場合気付かれないため、これは私たち国際的なユーザーが英語を話すユーザーよりもよく知っている傾向があるトラップです.

于 2011-03-07T09:47:06.047 に答える